Android四大組件分別為:1.活動Activity骆膝,2.服務(wù)Service,3.廣播接收器Broadcast Receiver,4.內(nèi)容提供器Content Provider
廣播概念與分類
廣播概念:
廣播顧名思義是起通知作用的一種組件。在Android中荒辕,廣播十分靈活,它不僅可以源于系統(tǒng)級別的通知犹褒。也可源于其他應(yīng)用程序抵窒。某個(gè)app可以對自己想要接受的廣播進(jìn)行注冊。應(yīng)用程序接受廣播則需要使用廣播接收器Broadcast Receiver叠骑;
廣播分類:①標(biāo)準(zhǔn)廣播 ②有序廣播
①標(biāo)準(zhǔn)廣播Normal Broadcast:是一種異步執(zhí)行的廣播李皇,廣播一經(jīng)發(fā)出,所有廣播接收器幾乎都在同一時(shí)間接收此廣播座云,沒有先后順序疙赠。這種廣播特點(diǎn):異步執(zhí)行付材,效率高朦拖,無法攔截。Android系統(tǒng)提供的許多系統(tǒng)級別的廣播如開機(jī)廣播厌衔,電量變化廣播璧帝,時(shí)間變化廣播,網(wǎng)絡(luò)變化廣播等都是標(biāo)準(zhǔn)廣播富寿。
②有序廣播Ordered Broadcast:是一種同步執(zhí)行的廣播睬隶,廣播發(fā)出后锣夹,同一時(shí)刻只有一個(gè)廣播接收器接收此廣播,當(dāng)這個(gè)廣播接收器處理完邏輯之后苏潜,廣播才會繼續(xù)傳播银萍。此外,廣播接收器接收后可攔截恤左,使排在后面的廣播接收器無法接受此廣播贴唇。這種廣播特點(diǎn):同步執(zhí)行,效率高飞袋,可攔截戳气。
發(fā)送與接受自定義廣播
上邊概念中提到,接受廣播需要用到廣播接收器Broadcast Receiver巧鸭,并且需要對想接收的廣播進(jìn)行注冊瓶您。作為四大組件之一的廣播,同其他組件:活動Activity,服務(wù)Service,內(nèi)容提供器Content Provider同樣在使用前需注冊纲仍。
特別的是呀袱,注冊廣播有兩種方式:①靜態(tài)注冊 ②動態(tài)注冊
①靜態(tài)注冊與接受廣播:在AndroidManifest.xml文件中注冊。
首先如圖所示新建一個(gè)廣播接收器巷折,項(xiàng)目包右鍵>new>other>Broadcast Receiver压鉴。
為新建的廣播接收器命名,類似于新建服務(wù)Service時(shí)一樣锻拘,Exported表示是否允許此廣播接收器接受本程序以外的廣播油吭,Enabled表示是否啟用此廣播,語言選擇java或kotlin署拟。
這是編譯器自動生成的最初的代碼:
package com.lipiao.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
throw new UnsupportedOperationException("Not yet implemented");
}
}
該類繼承自BroadcastReceiver類婉宰,重載了一個(gè)onReceive方法,如同自動加載出來的注釋所言推穷,onReceive()方法是當(dāng)廣播接收器接受廣播時(shí)調(diào)用心包,我們接受廣播后的邏輯處理代碼就可以寫在onReceive()方法中了。
接下來看看AndroidManifest.xml文件中的注冊信息:
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true"></receiver>
接下來稍微改改代碼馒铃,實(shí)現(xiàn)接受自定義的廣播蟹腾。
在receiver標(biāo)簽下添加相應(yīng)的action如下,添加一個(gè)叫myAction的自定義廣播区宇。
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="myAction"/>
</intent-filter>
</receiver>
在MyReceiver類中接受并打印日志信息:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyReceiver extends BroadcastReceiver {
String TAG ="MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceive: 已接受自定義廣播");
}
}
使用Intent發(fā)送廣播:
Intent intent =new Intent("myAction");
sendBroadcast(intent);
廣播發(fā)送成功娃殖,日志信息打印如下:
②動態(tài)注冊:在代碼中使用registerReceiver()方法注冊。
同樣是對于上邊那個(gè)名為myAction的自定義廣播進(jìn)行鼎動態(tài)注冊:
//動態(tài)注冊廣播
private IntentFilter intentFilter;
private MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("myAction");
myReceiver=new MyReceiver();
registerReceiver(myReceiver,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注冊
unregisterReceiver(myReceiver);
}
需要注意的是议谷,動態(tài)注冊的廣播需要取消注冊炉爆。