Broadcast Receiver
比对Content Provider,肯定也是成对出现和使用的
在系统内,通知和判定执行状态
1、系统执行状态:比如开机,关机,TF卡插拔,电量过低,如同微软的MSMQ
2、自定义执行状态:发消息提示更新界面
一般消息及消息队列的机制
以上这些都是系统级的,不需要用户自己去管理维护
用户需要做的工作:
1、定义消息体
2、得到消息体后的处理
这两部分就是BroadcastReceiver的工作内容
有哪两类的消息可以接收:
1、Normal broadcasts 标准广播:通过Context.sendBroadcast(intent)发送
广播发送后用户都能接收到广播,不区分前后顺序
2、Ordered broadcasts 排序广播:通过Context.sendOrderedBroadcast发送
给广播接受者设定接收的顺序(多个BroadcastReceiver),可以在前期接收到的广播中决定是否接收后面的广播
在intent-filter中设定android:priority设定优先级,数值大的优先
如果想后面的BroadcastReceiver不再接收到广播,可以在自己的onReceive方法中使用abortBroadcast();方法
还有一种stickyBroadcast,粘性的,一般的Broadcast由Looper取出后就分发了,分发后就被释放掉
但是sticky broadcast不会被释放,以后还能够调用使用
发送-接收模式/发布-订阅模式
如何使用:
1、继承BroadcastReceiver
2、重载onReceive()方法
3、配置Androidmanifext.xml中的<receiver>及<uses-permission>
发布消息
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("com.example.mybroadcast");
intent.putExtra("message", "消息");
sendBroadcast(intent);
}
});
建立一个BroadcastReceiver,首先注册它
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter android:priority="1">
<action android:name="com.example.mybroadcast" />
</intent-filter>
</receiver>
这里的action可以换为android定义的action,可以监听系统事件的消息
继承BroadcastReceiver,复写onReceive方法
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("message", "message received");
}
}
可以监听系统事件,例如收到短信
也可以接收自定义的事件
有一点要注意:
sendBroadcast方法是异步的,将消息放到消息队列主线程就不再关心了
但是BroadcastReceiver中的onReceive方法是在主线程的,可以直接操作界面,但是如果执行的任务过多就会ANR
所以耗时的操作还是要放到子线程中去处理
BroadcastReceiver接收到宿主进程生命周期
安装时BroadcastReceiver就会放到一个HashMap中,分发消息时会去找对应action的BroadcastReceiver
接收到消息就会启动宿主程序(通过BroadcastReceiver启动应用,但是activity是不启动的)
当返回后,如果没有其它交互,宿主进程状态为empty
因为如果要长期运行宿主进程,就startService