Android廣播機制,BroadcastReceiver
廣播機制,本質上是一種元件間的通訊方式,如果是兩個元件位於不同的程序當中,也可以用Binder機制來實現,如果兩個元件是在同一個程序中,那麼它們之間可以用來通訊的方式就更多了,這樣看來,廣播機制似乎是多餘的。然而,廣播機制卻是不可替代的,它和Binder機制不一樣的地方在於,廣播的傳送者和接收者事先是不需要知道對方的存在的,這樣帶來的好處便是,系統的各個元件可以鬆耦合地組織在一起,這樣系統就具有高度的可擴充套件性,容易與其它系統進行整合。
廣播負責發出訊號,需要用四大元件之一的BroadcastReceiver廣播接收器接收訊號。一般四大元件都要註冊在清單檔案中,而廣播可以在在程式碼中註冊先看註冊方式;
註冊廣播接收器
靜態廣播和動態廣播的區別
1生存期,靜態廣播的生存期可以比動態廣播的長很多,因為靜態廣播很多都是用來對系統時間進行監聽,比如我們可以監聽手機開機。而動態廣播會隨著context的終止而終止
2優先順序,動態廣播的優先順序比靜態廣播高
3靜態廣播比較耗費資源
靜態註冊(和在 AndroidManifest.xml 中註冊)
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter >
<action android:name="MyAction" />
</intent-filter>
</receiver>
動態註冊(在程式碼中註冊)
動態註冊廣播接收器可以自由地控制註冊與登出。但必須先註冊,再發送廣播才能接收到廣播。而靜態註冊可以讓程式在未啟動??的情況下就能接收到廣播(現在不可以了)。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//例項化廣播接收器物件
reciever = new MyReceiver();
//構建一個意圖過濾器IntentFilter
IntentFilter filter = new IntentFilter();
//新增Action表明該廣播接收器能接收什麼型別的廣播
filter.addAction("MyAction");
//註冊廣播接收器
registerReceiver(reciever,filter);
//動態註冊時,先註冊,再發送廣播
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: 這個方法在廣播接收器接收時被呼叫
// an Intent broadcast.
// throw new UnsupportedOperationException("Not yet implemented");
System.out.print("程式已啟動");
Toast.makeText(context,"程式已啟動",Toast.LENGTH_SHORT).show();
}
}
傳送廣播
Android中的廣播主要可以分為兩種型別,標準廣播和有序廣播。
標準廣播(Normal broadcasts):標準廣播是一種完全非同步執行的廣播,在廣播發出之後,所有的廣播接收器幾乎會在同一時刻接收到這條廣播訊息。這種廣播效率比較高,但同時也意味著它是無法被截斷的。
有序廣播(Ordered broadcasts):有序廣播則是一種同步執行的廣播,在廣播發出之後,同一時刻只會有一個廣播接收器能夠收到這條廣播訊息,當這個廣播接收器中的邏輯執行完畢之後,廣播才會繼續傳遞。
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:接收許可權 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);
接受許可權配置
<permission android:name="你自定義的許可權名稱" android:protectionLevel="normal"></permission>
終止廣播abortBroadcast();
在廣播接收器裡呼叫abortBroadcast()阻止其他接受者接收,只適用於有序廣播。