一 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);