Android BroadcastReceiver
一 BroadcastReceiver简介
BroadcastReceiver是四大组件之一 用来完成组件之间或者应用之间的通讯
Broadcast: 广播
BroadcastReceiver: 广播接收者
广播和广播接收者完成一个消息机制 属于重量级别 因为需要激活组件
二 注意
在Android中 每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive()方法
onReceive()方法执行完后 BroadcastReceiver的实例就会被销毁
onReceive()方法也是在主线程调用
onReceive()方法在10s内没有执行完毕 就会导致一个异常 ANR(application not response)
所以在BroadcastReceiver里不能做一些比较耗时的操作
如果需要完成一项比较耗时的操作 应该通过发送Intent给Service 由Service来完成 这里不能使用子线程来解决
因为BroadcastReceiver的生命周期很短 子线程可能还没有结束BroadcastReceiver就先结束了
BroadcastReceiver一旦结束 此时BroadcastReceiver的所在进程很容易在系统需要内存时被优先杀死
因为它属于空进程(没有任何活动组件的进程) 如果它的宿主进程被杀死 那么正在工作的子线程也会被杀死 所以采用子线程来解决是不可靠的
三 无序广播
没有接收的先后顺序 所有的广播接收者同时接收
// 广播接收者 public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 当广播接收者接收到广播 该方法会被调用 if ("com.hy.mm.action.TEST".equals(intent.getAction())) { String name = intent.getStringExtra("name"); Log.i("HUANG", "name=" + name); } } }
// 第一种订阅广播方式 AndroidManifest.xml application节点里面配置receiver <receiver android:name=".receiver.MyBroadcastReceiver"> <intent-filter> <action android:name="com.hy.mm.action.TEST" /> </intent-filter> </receiver>
// 第二种订阅广播方式 public class MainActivity extends AppCompatActivity { MyBroadcastReceiver mReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 订阅广播 mReceiver = new MyBroadcastReceiver(); IntentFilter filter = new IntentFilter("com.hy.mm.action.TEST"); registerReceiver(mReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); // 取消订阅 unregisterReceiver(mReceiver); } }
// 发送无序广播 Intent intent = new Intent("com.hy.mm.action.TEST"); intent.putExtra("name", "小白"); sendBroadcast(intent);
四 有序广播
有接收的先后顺序 是由广播接收者自己指定 取值范围(-1000 ~ 1000)
如果先接收的广播接收者中断广播 那么后面的广播接收者就无法接收了
特殊情况: 如果有序广播在发出的时候明确的指定了广播接收者 那么这样的广播无法中断 一定会发送给指定的接收者
// 广播接收者1 public class MyBroadcastReceiver1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 当广播接收者接收到广播 该方法会被调用 if ("com.hy.mm.action.T".equals(intent.getAction())) { int age = intent.getIntExtra("age", 0); Log.i("HUANG", "MyBroadcastReceiver1 age=" + age); } } }
// 广播接收者2 public class MyBroadcastReceiver2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 当广播接收者接收到广播 该方法会被调用 if ("com.hy.mm.action.T".equals(intent.getAction())) { int age = intent.getIntExtra("age", 0); Log.i("HUANG", "MyBroadcastReceiver2 age=" + age); // 中断广播 //abortBroadcast(); } } }
// 订阅广播 AndroidManifest.xml application节点里面配置receiver <!-- priority: 优先级(-1000 ~ 1000) 值越大优先级越高 --> <receiver android:name=".receiver.MyBroadcastReceiver1"> <intent-filter android:priority="900"> <action android:name="com.hy.mm.action.T" /> </intent-filter> </receiver> <receiver android:name=".receiver.MyBroadcastReceiver2"> <intent-filter android:priority="1000"> <action android:name="com.hy.mm.action.T" /> </intent-filter> </receiver>
// 发送有序广播 Intent intent = new Intent("com.hy.mm.action.T"); intent.putExtra("age", 15); sendOrderedBroadcast(intent, null);