Android中Broadcast简介与使用

Broadcast与Broadcast Receiver的分类

Broadcast分类

广播按照传播方式分为两类,不解释,先上图

Broadcast Receiver的分类

广播虽然传播了出来,但是没有相应的接收器,发了也是白发,而接收器也是分类的,按照注册方式分类,继续上图

动态与静态广播接收器注册

两者的区别

1.动态注册的广播 永远要快于 静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低>
2.动态注册广播不是 常驻型广播 ,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。静态注册是常驻型 ,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
3.在同一个优先级下,谁先启动的快,谁将先接收到广播.

动态广播接收器的注册

安卓在执行一些操作,比如开机,关机,或者连接网络,断开网络时,会发送一些系统广播,这些广播是可以被接收到的。
我们以接受网络变化的广播为例,网络如果连接,则发出一条Toast。已知信息:在网络连接发生变化时,安卓系统会发出一条“android.net.conn.CONNECTIVITY_CHANGE”的广播
1:在xml里添加权限:

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2:写一个网络监听接收器类,继承自原有的广播接收器,并重写onReceive方法,因为当接收到广播时,这个方法就会被调用,用于告知我们网络是否发生变化,

class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
             Toast.makeText(context,"network change",Toast.LENGTH_SHORT).show();
        }
    }

3:在onCreate()中创建一个IntentFilter实例,并添加广播信息,添加这个信息目的是为了第三步注册广播。

intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

4,声明一个实例,注册 广播接收器,并取消注册 广播接收器

 private NetworkChangeReceiver networkChangeReceiver;//声明
 networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);//注册广播接收器,这两行代码在第二步后面
 @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }

注意:这里的取消注册 广播接收器 是写在onDestroy()内的,原因是,这是动态注册,只有在程序开启时才能使用,但我们的目的是为了检测网络的变化,需要切换程序,因此写在onDestroy()内,onDestroy()只有按下back键才会调用,因此我们直接按下home键,进入setting -> Data usage->关闭Cellular或者打开Cellular会出现Toast提醒。

静态广播接收器的注册

静态广播接收器的注册相对来说更为简单,我们还是以监听网络变化广播为例
1:在xml里添加权限:

扫描二维码关注公众号,回复: 8677331 查看本文章
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2:New-other-Broadcast Receiver 如下图(全部勾选)
在这里插入图片描述
3:在xml内注册添加相应的action

  <receiver
            android:name=".NetworkchangeReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

4:在NetworkchangeReceiver中修改

public class NetworkchangeReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"network change now",Toast.LENGTH_LONG).show();
        }
}

好的,理论上来说上面的代码虽然简单,但是你应该了解了静态注册的基本过程。然后我要说的是,这个例子是无法达到效果的,你是无法接收到Toast消息的,为什么呢,因为我后来发现在Android7.0 上为了优化后台省电相关的东西,已经将静态注册这个广播方式取消了,7.0 版本上静态注册此广播的,已经无法收到这个广播了,Android 7.0 为了后台优化,推荐使JobScheduler 代替 BroadcastReceiver 来监听,具体的我就不详解了,跑题了。你可以参考Android 7.0 网络变化监听

标准广播和有序广播

标准广播

标准广播一般通过Intent来实现,代码极其简单,当然前提你需要写一个广播接收器,不然发出了广播也没用。如下图所示,我们就发送了一条"com.example.broadcasttest.LOCAL_BROADCAST"的广播

Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                 sendBroadcast(intent);//标准广播

有序广播

有序广播与标准广播类似

ntent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                sendOrderedBroadcast(intent, null);//发送有序广播,第二个参数一般为null

不过既然是有序广播,那接受这条广播的顺序,就有讲究了,我们可以通过android:priority来设置谁先接收这条广播,例如下列静态注册的 intent filter 内添加了这个优先级,优先级越高,接收有序广播的顺序越前。

<intent-filter android:priority="100">//设置优先级
                <action android:name="com.example.broadcasttest.MY_BROADCAST" />
            </intent-filter>

截断广播,有序广播的另一个优点就是能被截断,可以在当前接收这条广播的接收器onReceive()内完成这项操作。

 abortBroadcast();//截断

本地广播的实现

本地广播的意思就是说在应用内发起广播,且不会传到其他应用,自产自销。它的优势十分明显,高效,安全,而且实现起来简单。
1:写一个本地广播接收器,并注册,这里使用动态注册(因为之前讲过,就不加以详解),没有必要静态注册,因为这是应用内部的广播,启动后接收就可以。

 class LocalReceiver extends BroadcastReceiver {//本地广播接收器
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
        }
    }
 private LocalReceiver localReceiver;
intentFilter = new IntentFilter(); 
    、intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver, intentFilter);

记得取消注册,如下

 @Override
    protected void onDestroy() {
        super.onDestroy();
      localBroadcastManager.unregisterReceiver(localReceiver);
    }

2:利用LocalBroadcastManager对广播进行管理

private LocalBroadcastManager localBroadcastManager;
localBroadcastManager = LocalBroadcastManager.getInstance(this);//获取实例

3:发送广播

 Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                 sendBroadcast(intent);//自定义广播
                 localBroadcastManager.sendBroadcast(intent);//发送本地广播

总结:所谓本地广播,无论是发送还是接收,其实都是通过LocalBroadcastManager来管理的

写代码时的智障操作:在xml中加入中文注释不曾想导致mainifests文件丢失。

发布了5 篇原创文章 · 获赞 4 · 访问量 258

猜你喜欢

转载自blog.csdn.net/It_is_IT_/article/details/103986906
今日推荐