Android BroadcastReceiver广播注册方式总结
程序员文章站
2024-02-22 18:32:10
android:broadcastreceiver注册的方式分为两种:
静态注册
动态注册
1. 静态注册
在androidmanifest.xml里通过标签声明...
android:broadcastreceiver注册的方式分为两种:
静态注册
动态注册
1. 静态注册
在androidmanifest.xml里通过标签声明
属性说明:
<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 //此广播接收者类是mbroadcastreceiver android:name=".mbroadcastreceiver" > //用于接收网络状态改变时发出的广播 <intent-filter> <action android:name="android.net.conn.connectivity_change" /> </intent-filter> </receiver>
当此app首次启动时,系统会自动实例化mbroadcastreceiver类,并注册到系统中。
2. 动态注册
在代码中通过调用context的registerreceiver()方法进行动态注册broadcastreceiver,具体代码如下:
@override protected void onresume(){ super.onresume(); //实例化broadcastreceiver子类 & intentfilter mbroadcastreceiver mbroadcastreceiver = new mbroadcastreceiver(); intentfilter intentfilter = new intentfilter(); //设置接收广播的类型 intentfilter.addaction(android.net.conn.connectivity_change); //调用context的registerreceiver()方法进行动态注册 registerreceiver(mbroadcastreceiver, intentfilter); } //注册广播后,要在相应位置记得销毁广播 //即在onpause() 中unregisterreceiver(mbroadcastreceiver) //当此activity实例化时,会动态将mybroadcastreceiver注册到系统中 //当此activity销毁时,动态注册的mybroadcastreceiver将不再接收到相应的广播。 @override protected void onpause() { super.onpause(); //销毁在onresume()方法中的广播 unregisterreceiver(mbroadcastreceiver); } }
3. 两种注册方式的区别
4. 特别注意
动态广播最好在activity的onresume()注册、onpause()注销。
原因:
1.对于动态广播,有注册就必然得有注销,否则会导致内存泄露
重复注册、重复注销也不允许
2.activity生命周期如下:
activity生命周期的方法是成对出现的:
- oncreate() & ondestory()
- onstart() & onstop()
- onresume() & onpause()
在onresume()注册、onpause()注销是因为onpause()在app死亡前一定会被执行,从而保证广播在app死亡前一定会被注销,从而防止内存泄露。
1.不在oncreate() & ondestory() 或 onstart() & onstop()注册、注销是因为:
当系统因为内存不足(优先级更高的应用需要内存,请看上图红框)要回收activity占用的资源时,activity在执行完onpause()方法后就会被销毁,有些生命周期方法onstop(),ondestory()就不会执行。当再回到此activity时,是从oncreate方法开始执行。
2.假设我们将广播的注销放在onstop(),ondestory()方法里的话,有可能在activity被销毁后还未执行onstop(),ondestory()方法,即广播仍还未注销,从而导致内存泄露。
3. 但是,onpause()一定会被执行,从而保证了广播在app死亡前一定会被注销,从而防止内存泄露。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
推荐阅读