Android開(kāi)發(fā)學(xué)習(xí)教程(29)- Android BroadcastReceiver(廣播)
—— 今朝有心苦勤奮,明朝一舉步青云。
Broadcast?receiver是什么
Broadcast receiver(廣播接收器)是一個(gè)Android 組件,它允許你注冊(cè)系統(tǒng)或應(yīng)用程序事件。一旦該事件發(fā)生,Android 運(yùn)行時(shí)會(huì)通知所有已注冊(cè)的事件接收者。舉個(gè)簡(jiǎn)單的例子,這就好比在學(xué)校里,當(dāng)訓(xùn)導(dǎo)主任廣播尋找王小明時(shí),訓(xùn)導(dǎo)主任只需要告知要找的是幾年幾班的王小明(不用知道他在哪里),盡管全校的同學(xué)都會(huì)聽(tīng)到這則廣播,但會(huì)去訓(xùn)導(dǎo)處報(bào)到的,就只有王小明。在android?中,我們時(shí)常需要利用此一機(jī)制,讓程序能在任何時(shí)候,對(duì)于不同的廣播訊息做出正確的反饋。例如,當(dāng)注冊(cè)了 ACTION_BOOT_COMPLETED廣播后,一旦 Android 系統(tǒng)完成啟動(dòng)過(guò)程程序的廣播接收器就會(huì)收到響應(yīng)。
Broadcast receiver的生命周期
廣播的生命周期并不像 Activity 一樣復(fù)雜,廣播的生命周期從調(diào)用開(kāi)始到onReceiver執(zhí)行完畢結(jié)束,需要注意的是,一般廣播的生命周期都極短,需要在10s內(nèi)處理完onReceiver中的所有工作,所以,一般不進(jìn)行耗時(shí)長(zhǎng)的工作,如果有耗時(shí)長(zhǎng)的工作,應(yīng)當(dāng)通過(guò)Intent傳遞給Service進(jìn)行處理。(注意,不要在onReceiver中開(kāi)啟線程進(jìn)行耗時(shí)任務(wù)處理,否則,在10s后,該線程會(huì)變成空線程,從而導(dǎo)致任務(wù)的丟失。同樣的,也不要使用bindService來(lái)綁定服務(wù)。)
值得注意的是,如果是在代碼中動(dòng)態(tài)注冊(cè)的廣播,如:在Activity注冊(cè),那么在Activity的onDestory中需要使用unregisterReceiver注銷廣播。
Broadcast receiver的用法
可以通過(guò) AndroidManifest.xml 文件注冊(cè)廣播接收器,除了這種靜態(tài)注冊(cè),還可以通過(guò)該 Context.registerReceiver() 方法動(dòng)態(tài)注冊(cè)廣播接收器。接收器的實(shí)現(xiàn)類需要實(shí)現(xiàn) BroadcastReceiver接口。如果廣播接收器注冊(cè)的事件發(fā)生,onReceive() Android系統(tǒng)調(diào)用接收器的方法,
1. 靜態(tài)注冊(cè)廣播
靜態(tài)注冊(cè)一個(gè)飛行模式變化的廣播
<
receiver
?android:name
=
".MyScreenReceiver"
?>
????
<
intent-filter
>
????????
<
action
?android:name
=
"android.intent.action.AIRPLANE_MODE"
?/>
????
</
intent-filter
>
</
receiver
>
創(chuàng)建一個(gè)BroadcastReceiver廣播接收器
public
?class
?MyScreenReceiver?
extends
?BroadcastReceiver {
??
@Override
??
public
?void
?onReceive(Context context, Intent intent) {
??????
Log.d(
"hel->"
,?
"飛行模式發(fā)生了變化..."
);
??
}
}
當(dāng)開(kāi)啟飛行模式或者關(guān)閉飛行模式時(shí)onReceive方法響應(yīng)。
1. 動(dòng)態(tài)注冊(cè)廣播
public
?class
?MainActivity?
extends
?AppCompatActivity {
????
private
?AirplaneModeChangeReceiver receiver;
????
@Override
????
protected
?void
?onCreate(Bundle savedInstanceState) {
????????
super
.onCreate(savedInstanceState);
????????
setContentView(R.layout.activity_main);
????????
findViewById(R.id.btn2).setOnClickListener(
new
?View.OnClickListener() {
????????????
@Override
????????????
public
?void
?onClick(View v) {
????????????????
receiver =?
new
?AirplaneModeChangeReceiver();
????????????????
IntentFilter filter =?
new
?IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
????????????????
registerReceiver(receiver, filter);
????????????
}
????????
});
????
}
????
@Override
????
protected
?void
?onDestroy() {
????????
super
.onDestroy();
????????
unregisterReceiver(receiver);
????
}
}
源碼鏈接:https://yunjunet.cn/876829.html