一、BroadcastReceiver是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到消息。BroadcastReceiver运行在UI线程,所以不能做比较耗时的操作,否则会发生ANR错误。应该启动Service,在Service中创建线程操作。一般不能在BroadcastReceiver中创建子线程,因为BroadcastReceiver的生命周期很短,一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)时才有效,当从该函数返回后,该对象就无效的了,结束生命周期,子线程可能还没结束,BroadcastReceiver就先结束了。BroadcastReceiver一旦结束,此时BroadcastReceiver所在的进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死,所以在BroadcastReceiver中使用子线程是不可靠的。
二、定义BroadcastReceiver接收器 继承BroadcastReceiver类,重写onReceive方法。
三、注册BroadcastReceiver接收器
1. 静态注册
静态注册方式是在AndroidManifest.xml的application里面定义receiver并设置要接收的action。特点是不管应用程序是否关闭,都会进行监听。如果应用程序关闭,系统会调用监听。
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="MyReceiver_Action"/>
</intent-filter>
</receiver>
2. 动态注册
动态注册方式是在Activity中调用函数来注册,并在程序关闭时取消注册。特点是在代码中测试,在程序关闭时可以取消注册,不再进行监听。
MyReceiver receiver = new MyReceiver();
//创建过滤器,并指定action,使之用于接收同action的BroadcastReceiver
IntentFilter filter = new IntentFilter("MyReceiver_Action");
//注册BroadcastReceiver接收器
registerReceiver(receiver, filter);
四、发送BroadcastReceiver
// 指定BroadcastReceiver目标Action
Intent intent = new Intent("MyReceiver_Action");
// 可通过Intent携带消息
intent.putExtra("msg", "发送BroadcastReceiver");
// 发送BroadcastReceiver消息
sendBroadcast(intent);
五、注销BroadcastReceiver
//注销BroadcastReceiver接收器
unregisterReceiver(receiver);