Android 广播接收器BroadcastReceiver详解
目录
一、什么是BroadcastReceiver
BroadcastReceiver 是安卓系统中四大组件之一,在Android开发中,BroadcastReceiver的应用场景非常多,Android 广播分为两个角色:广播发送者、广播接收者。
1.1、作用
广播接收器用于响应来自其他应用程序或者系统的广播消息。
1.2、实现原理
Android中的广播使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。
模型中有3个角色:
广播接收者通过 Binder机制在AMS注册
广播发送者通过 Binder 机制向AMS发送广播
AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者(寻找依据:IntentFilter / Permission)
AMS将广播发送到合适的广播接收者相应的消息循环队列中;
广播接收者通过消息循环拿到此广播,并回调 onReceive()
二、创建广播接收器
广播接收器需要实现为BroadcastReceiver类的子类,并重写方法来接收以Intent对象为参数的消息。
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("我是创建好的通知");
}
}
三、注册广播接收器
广播接收器的注册分为两种:
3.1、静态注册
应用程序通过在AndroidManifest.xml中注册广播接收器来监听制定的广播意图。
注册
android:exported="true"> tools:ignore="BatteryLife" />
发送通知
在Activity 中新增一个发送通知的点击事件
public void onClickStatic(View view) {
System.out.println("MainActivity2.onClickStatic");
// com.tiger_test 必须和清单文件中注册的保持一致
Intent intent = new Intent();
intent.setAction("com.tiger_test");
intent.setPackage("com.traveleasy.activitydemo");
sendBroadcast(intent);
}
当点击通知发送按钮时,系统会自动实例化MyReceiver类,并注册到系统中。
静态注册是常驻广播,不受任何组件生命周期的影响
注意:由于自8.0以后隐式广播不能进行静态注册了,所以这里通过指定应用程序响应广播。
3.2、动态注册
通过注册广播监听
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
// 在onCreate 中注册广播
MyReceiver myReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.tiger_test");
registerReceiver(myReceiver, filter);
}
触发通知
public void onClickStatic(View view) {
// com.tiger_test 必须和注册的保持一致
Intent intent = new Intent();
intent.setAction("com.tiger_test");
sendBroadcast(intent);
}
在页面关闭时记得通过注销广播监听,否则会因广播持有Activity引用导致内存泄露。
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
运行结果
需要注意,在不能执行耗时操作,默认是在主线程中,进行耗时会阻塞主线程,如果非要执行耗时操作最好开启一个服务在服务中进行耗时操作,不建议开启线程来处理耗时操作,因为BroadCastReceiver的生命周期很短,可能在子线程结束前BroadCastReceiver已经退出,如果当BroadCastReceiver所在的进程结束,虽然该进程中可能有用户启动的新线程,但是由于该进程内没有活动的组件,系统会在内存紧张的时候,优先结束掉该进程,这就会导致BroadCastReceiver启动的子线程不能执行完。
四、系统广播
上面我们一起学习了自定义广播,下面我们一起来看一下Android 系统主要的系统广播类型。
事件常量描述android.intent.action.BATTERY_CHANGED持久的广播,包含电池的充电状态,级别和其他信息。android.intent.action.BATTERY_LOW标识设备的低电量条件。android.intent.action.BATTERY_OKAY标识电池在电量低之后,现在已经好了。android.intent.action.BOOT_COMPLETED在系统完成启动后广播一次。android.intent.action.BUG_REPORT显示报告bug的活动。android.intent.action.CALL执行呼叫数据指定的某人。android.intent.action.CALL_BUTTON用户点击"呼叫"按钮打开拨号器或者其他拨号的合适界面。android.intent.action.DATE_CHANGED日期发生改变。android.intent.action.REBOOT设备重启。
总结
在BroadcastReceiver 中,广播的类型主要分为两大类
标准广播
标准广播是一种完全异步执行的广播,在广播发出之后,所有的BroadcastReceiver几乎在同一时刻收到这个广播消息,它们之间没有先后顺序,这种广播的效率较高,并且不能被拦截。
有序广播
有序广播是一种完全同步的广播,在广播发出后只能有一个BroadcastReceiver能接收到这个广播消息,当这个BroadcastReceiver中的逻辑执行完毕后,广播才能继续向下传递。所以这个广播是有顺序的,所以这种广播也是可以被拦截的,如果被拦截了后面的BroadCastReceiver则不能收到广播消息了。
到此这篇关于Android 广播接收器BroadcastReceiver详解的文章就介绍到这了,更多相关Android BroadcastReceiver内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- .NET Core系列之MemoryCache 初识
- 007手机一键Root(安机网一键Root) v3.0 官方最新版 一键ROOT您的Android手机
- 12306密码被盗了怎么办?12306密码外泄解决方法
- 12个字的qq网名
- 150M迷你型无线路由器怎么设置?
- 192.168.1.1打不开怎么办?路由器192.168.1.1打不开的原因以及解决办法
- 2011年电子报合订本 电子报 编辑部 中文 PDF版 [84M]
- 2015年1月15日小米新旗舰发布会现场图文直播
- 2016.3.1vivo Xplay5新品发布会现场视频直播 优酷直播
- 2016华为P9发布会视频直播地址 4月15日华为P9国行发布会直播