[TOC]
簡介
廣播機制,本質(zhì)上是一種組件間的通信方式,如果是兩個組件位于不同的進程當中,也可以用Binder機制來實現(xiàn),如果兩個組件是在同一個進程中,那么它們之間可以用來通信的方式就更多了,這樣看來,廣播機制似乎是多余的。然而,廣播機制卻是不可替代的,它和Binder機制不一樣的地方在于,廣播的發(fā)送者和接收者事先是不需要知道對方的存在的,這樣帶來的好處便是,系統(tǒng)的各個組件可以松耦合地組織在一起,這樣系統(tǒng)就具有高度的可擴展性,容易與其它系統(tǒng)進行集成。
廣播負責發(fā)出信號,需要用四大組件之一的Broadcast Receiver廣播接收器接收信號。一般四大組件都要注冊在清單文件中,而廣播也可以在代碼中注冊;
廣播分類
Android中的廣播主要可以分為兩種類型,標準廣播和有序廣播。
- **標準廣播****(Normal broadcasts):標準廣播是一種完全異步執(zhí)行的廣播,在廣播發(fā)出之后,所有的廣播接收器幾乎會在同一時刻接收到這條廣播消息。這種廣播效率比較高,但同時也意味著它是無法被截斷的。
- 有序廣播(Ordered broadcasts):有序廣播則是一種同步執(zhí)行的廣播,在廣播發(fā)出之后,同一時刻只會有一個廣播接收器能夠收到這條廣播消息,當這個廣播接收器中的邏輯執(zhí)行完畢之后,廣播才會繼續(xù)傳遞。
- 系統(tǒng)廣播 Android 內(nèi)置了很多系統(tǒng)級別的廣播,我們可以在應(yīng)用中通過監(jiān)聽這些廣播來得到各種系統(tǒng)的狀態(tài)信息
- 本地廣播 為了解決廣播安全性問題,Android 引入了一套本地廣播機制,使用這個機制發(fā)出的廣播只能在應(yīng)用程序內(nèi)部進行傳遞,并且廣播接受器也只能接受來自本應(yīng)用程序發(fā)出的廣播;
使用
注冊廣播接收器
靜態(tài)廣播和動態(tài)廣播的區(qū)別
生存期,靜態(tài)廣播的生存期可以比動態(tài)廣播的長很多,因為靜態(tài)廣播很多都是用來對系統(tǒng)時間進行監(jiān)聽,比如我們可以監(jiān)聽手機開機。而動態(tài)廣播會隨著context的終止而終止
優(yōu)先級,動態(tài)廣播的優(yōu)先級比靜態(tài)廣播高
靜態(tài)廣播比較耗費資源
-
靜態(tài)注冊可以讓程序在停止狀態(tài)的情況下就能接收到廣播。
停止狀態(tài):
應(yīng)用安裝后未運行
-
應(yīng)用被手動(設(shè)置-應(yīng)用-強制停止)或者被其他應(yīng)用強制停止
如果需要啟動處于停止狀態(tài)的應(yīng)用,則只要為Intent添加FLAG_INCLUDE_STOPPED_PACKAGES 標記即可。(stopped機制)
1.靜態(tài)注冊(和在 AndroidManifest.xml 中注冊)
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="MyAction" />
</intent-filter>
</receiver>
2.動態(tài)注冊(在代碼中注冊)
動態(tài)注冊廣播接收器可以自由地控制注冊與注銷。但必須先注冊,再發(fā)送廣播才能接收到廣播。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//實例化廣播接收器對象
reciever = new MyReceiver();
//構(gòu)建一個意圖過濾器IntentFilter
IntentFilter filter = new IntentFilter();
//添加Action表明該廣播接收器能接收什么類型的廣播
filter.addAction("MyAction");
//注冊廣播接收器
registerReceiver(reciever,filter);
//動態(tài)注冊時,先注冊,再發(fā)送廣播
sendBroadcast(new Intent("MyAction"));
}
@Override
protected void onDestroy() {
super.onDestroy();
//解除注冊
if(reciever != null)unregisterReceiver(reciever);
}
廣播接收器
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: 這個方法在廣播接收器接收時被調(diào)用
// an Intent broadcast.
//throw new UnsupportedOperationException("Not yet implemented");
System.out.print("程序已啟動");
Toast.makeText(context,"程序已啟動",Toast.LENGTH_SHORT).show();
}
}
發(fā)送廣播
sendBroadcast(Intent var1);
public abstract void sendBroadcast(Intent var1, String var2);
public abstract void sendOrderedBroadcast(Intent var1, String var2);
public abstract void sendOrderedBroadcast(Intent var1, String var2, BroadcastReceiver var3, Handler var4, int var5, String var6, Bundle var7);
//var2:接收權(quán)限 var3:指定必須收到的接收器 var4:消息處理器 var6:傳入的字符串 var7:傳入的bundle;
public abstract void sendBroadcastAsUser(Intent var1, UserHandle var2);
public abstract void sendBroadcastAsUser(Intent var1, UserHandle var2, String var3);
public abstract void sendOrderedBroadcastAsUser(Intent var1, UserHandle var2, String var3, BroadcastReceiver var4, Handler var5, int var6, String var7, Bundle var8);
接受權(quán)限配置
<permission android:name="你自定義的權(quán)限名稱" android:protectionLevel="normal"></permission>
終止廣播
在廣播接收器里調(diào)用abortBroadcast()阻止其他接受者接收,只適用于有序廣播。