一 BroadcastReceiver简介android
BroadcastReceiver是四大组件之一 用来完成组件之间或者应用之间的通信app
Broadcast: 广播ide
BroadcastReceiver: 广播接收者spa
广播和广播接收者完成一个消息机制 属于重量级别 由于须要激活组件线程
二 注意code
在Android中 每次广播消息到来时都会建立BroadcastReceiver实例并执行onReceive()方法xml
onReceive()方法执行完后 BroadcastReceiver的实例就会被销毁blog
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);