首页 > 系统 > Android > 正文

Android BroadcastReceiver广播注册方式总结

2019-12-12 04:03:10
字体:
来源:转载
供稿:网友

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生命周期

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死亡前一定会被注销,从而防止内存泄露。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表