标签:最好 receive 子类 pause onpause pre set 自动 事件
1.简介
Broadcast Server 即广播,属于Android四大组件之一
Android 广播分为两个角色:广播发送者,广播接收者
主要用于:监听和接收其他应用APP或者Android系统发出的广播消息,并作出响应
2.应用的场景
Android不同组件的通信
多线程之间的通信
与Android系统在特定的情况下的通信 如电话呼入,电池状态的改变等
3.实现模型
Android的广播使用设计模式中的观察者模式:给予消息的发布/定于事件模型
将Android广播的发送者和接收者解耦,使得系统方便集成,更易扩展
4.广播接收器注册
注册分为两种方式:静态注册和动态注册
静态注册:
在AndroidManifest.xml里通过<receive>标签声明 当app启动时,系统会自动实例化AndroidManifest
中注册的类,并将其注册到系统中
属性说明:
<receiver android:enabled=["true" | "false"] //此broadcastReceiver能否接收其他App的发出的广播 //默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" //继承BroadcastReceiver子类的类名 android:name=".mBroadcastReceiver" //具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收; android:permission="string" //BroadcastReceiver运行所处的进程 //默认为app的进程,可以指定独立的进程 //注:Android四大基本组件都可以通过此属性指定自己的独立进程 android:process="string" > //用于指定此广播接收器将接收的广播类型 //本示例中给出的是用于接收网络状态改变时发出的广播 <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>
电池广播注册示例:
<receiver android:name=".BattarBroadcast"> <intent-filter> <action android:name="android.intent.action.BATTERY_CHANGED" /> </intent-filter> </receiver>
动态注册
在Java代码中进行注册:调用Context.registerReceiver()
方法
// 选择在Activity生命周期方法中的onResume()中注册 @Override protected void onResume(){ super.onResume(); // 1. 实例化BroadcastReceiver子类 & IntentFilter mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); // 2. 设置接收广播的类型 intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE); // 3. 动态注册:调用Context的registerReceiver()方法 registerReceiver(mBroadcastReceiver, intentFilter); } // 注册广播后,要在相应位置记得销毁广播 // 即在onPause() 中unregisterReceiver(mBroadcastReceiver) // 当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中 // 当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。 @Override protected void onPause() { super.onPause(); //销毁在onResume()方法中的广播 unregisterReceiver(mBroadcastReceiver); } }
注意:动态注册的广播需要销毁,否则会导致内存泄漏
也不允许重复注册和重复销毁
动态广播最好在Activity
的 onResume()
注册、onPause()
注销
在onResume()注册、onPause()注销是因为onPause()在App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄露。
5.广播的发送者
广播分为无序广播和有序广播
发送无序广播:
Intent intent = new Intent(); //对应BroadcastReceiver中intentFilter的action intent.setAction("BROADCAST"); //发送广播 this.sendBroadcast(intent);
发送有序广播
Intent intent = new Intent(); //对应BroadcastReceiver中intentFilter的action intent.setAction("BROADCAST"); //发送广播 this.sendOrderedBroadcast(intent,"receiverPermission");
6.广播接收者
创建类继承 BroadcastReceiver
直接实例化BroadcastReceiver,重写 onReceive()方法.接收到广播后将自动调用改方法
注意:默认情况下,广播接收器运行在 UI
线程,因此,onReceive()
方法不能执行耗时操作,否则将导致ANR
public class BattarBroadcast extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //执行操作 } }
标签:最好 receive 子类 pause onpause pre set 自动 事件
原文地址:https://www.cnblogs.com/conglingkaishi/p/9634104.html