Broadcast

标签: Android


1、广播机制

应用程序可以发送和接收广播。发送广播利用到Intent,接收广播利用到广播接收器(Braodcast Receiver)。程序需要对某些广播进行注册来接收广播内容。

广播有2种

  • 标准广播:所有广播接收器可以同时接收
  • 有序广播:会根据广播接收器的优先级高低确认先后顺序,可能会导致截断

2、接收系统广播

系统的状态发生变化时,比如开机、电量变化和时间改变等都会发出广播,而程序只有使用广播接收器才能接受到这些广播

接受广播具体用法

  1. 广播接收器对某些广播进行注册。有2种方式注册,代码中动态注册和AndroidManifest.xml静态注册。
  2. 创建一个广播接收器类。新建一个类继承BraodcastReceiver,并重写onReceive方法。有广播发出时,onReceive方法执行
  3. 在活动的onCreate方法中通过IntentFilter指定想要监听的广播类型

    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
    XXXBroadcastReceiver broadcastReceiver = new XXXBroadcastReceiver();//广播接收器实例
    registerReceiver(broadcastReceiver, intentFilter);//动态注册,参数为广播接收器和IntentFilter
    
  4. 动态注册的广播接收器需要在onDestroy方法中取消注册。

    unregisterReceiver(broadcastReceiver);
    

动态注册有一个缺点,必须在程序启动后才能接收广播,因为注册广播是在onCreate方法中执行的。静态注册则避免了

通过AS快速新建广播接收器,自动注册。

    <Manifest...
        <application
            ...
            <receiver
                android:name=".XXXRecevier"
                ... />
                    <intent-filter>
                        <action android:name="android.intent.action.XXX" />
                    </intent-filter>
            </receiver>
        </application>
    </Manifest>

广播接收器内不能开启线程,所以不能在onReceive方法内有太多的处理逻辑或者耗时操作。

3、发送全局自定义广播

发送标准广播

通过Intent发送自定义广播,比如可以通过Button的事件来发送广播

Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);

同时,要有对这条 com.example.broadcasttest.MY_BROADCAST广播进行注册的广播接收器,可以选择动态或者静态注册

<receiver
    android:name=".XXXBroadcastReceiver"
    ... />
    <intent-filter>
        <action android:name="com.example.broadcasttest.MY_BROADCAST" />
    </intent-filter>
</receiver>

发送有序广播

新建项目和广播接收器,并注册之前的自定义广播,可以实现一个程序发出的广播被其它程序的广播接收器接收到。

有序广播和标准广播的代码稍微不同

sendOrderedBroadcast(intent, null);
  • 有序通过给广播接收器设置优先级来实现。
  • 截断通过在广播接收器的onReceiver中添加

    abortBroadcast();
    

4、本地广播

本地广播和全局广播的区别在于范围不同,当考虑到安全性时,敏感和隐私数据需要得到保护。本地广播只能在程序内部传递,广播接收器只能接受本地广播

通过LocalBroadcastManager对广播进行管理,发送广播和注册广播接收器。

LocalBraodcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
...
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);//发送广播
...
//注册广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
'''
//取消注册
localBroadcastManager.unregisterReceiver(localReceiver);
...
//广播接收器
class LocaReceiver extends BroadcastReceiver{
...
}

本地广播不能静态注册。

总结

最后的强制下线:

一个管理所有活动的类,用来对所有活动全部finish;

一个基类作为实现活动添加到类管理中,以及移除,最后还有内部类广播接收器,在基类中动态注册和取消广播。

继承的子活动类如LoginActivity和MainActivity,直接发送广播即可,广播接收器的相关处理已经完成。