一、BroadcastReceiver是什麼?
1、四大組件之一:廣播(通知消息)接收器 –要想到在Manifest中註冊
2、系統使用了很多廣播:通知時間改變(鬧鐘纔會響)、電池電量變低、拍攝了照片、改變了語言;
3、沒有用戶界面。
只負責向所有在Manifest裏的註冊者發送廣播,需要這個廣播的人去接收它。
二、BroadcastReceiver怎麼使用?
兩種註冊方式
BroadcastReceiver的兩種註冊方式
1、靜態註冊
<receiver android:name=".TestBroadcastReceiver">
<intent-filter>
<action android:name="com.example.test.broadcast"/>
</intent-filter>
</receiver>
2、動態註冊
在onStart方法中註冊,在onStop方法中反註冊
@Override
protected void onStart() {
super.onStart();
/* 動態註冊廣播*/
//根據action裏的android:name過濾廣播。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(COM_EXAMPLE_TEST_BROADCAST);
registerReceiver(mTestBroadcastReceiver, intentFilter);
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(mTestBroadcastReceiver);
}
3、兩者的區別:靜態註冊的廣播一直有效,動態註冊的廣播需要反註冊掉,不然註冊在內存裏,會不斷的消耗內存,所以常用動態註冊。
如何接收廣播onReceive方法
MainActivity類
@Override
public void onClick(View view) {
/* 發送廣播 */
Intent intent = new Intent(MainActivity.this,TestBroadcastReceiver.class);
//只發給action爲COM_EXAMPLE_TEST_BROADCAST
intent.setAction(COM_EXAMPLE_TEST_BROADCAST);
intent.putExtra("toast", "this is a toast of broadcast");
sendBroadcast(intent);
}
TestBroadcastReceiver類
public class TestBroadcastReceiver extends BroadcastReceiver {
/* 接收廣播、處理數據 */
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null){
//判斷字符串是否相等TextUtils.equals().
if (TextUtils.equals(intent.getAction(),MainActivity.COM_EXAMPLE_TEST_BROADCAST)){
String toastString = intent.getStringExtra("toast");
Toast.makeText(context,toastString,Toast.LENGTH_SHORT).show();
}
}
}
}
如果在onReceive方法中執行耗時操作會怎樣?如何解決?
同Activity、Service一樣,new Thread進程。
三、幾種類型?
1、Normal broadcasts
2、Ordered broadcasts
3、二者有什麼區別?
正常廣播,沒有順序,一下子向所有註冊者發送廣播;有序廣播,廣播有自己的順序,根據順序發送廣播。有點像Service和IntentService。
4、Local broadcasts:LocalBroadcastManager 廣播不是在系統中而是在某應用中,這樣速度會很快;android系統發廣播時所有的應用都能收到,消耗手機性能、廣播延時。
四、BroadcastReceiver的生命週期
Register – SendBroadcast – onReceive – unRegister。
總結:
1、是什麼?
2、怎麼用?
3、兩種註冊方式?
4、幾種類型?
5、生命週期
注意事項: 1、適當的用、不要濫用 (消耗性能、廣播延時、廣播被丟棄等。)
2、可以用LocalBroadcast
該用callback時用callback,要麼用LocalBroadcast。