1. 程式人生 > >Android廣播機制,BroadcastReceiver

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()阻止其他接受者接收,只適用於有序廣播。