基礎三:BroadcastReceiver

broadcast receiver–廣播接收器,接受全局的廣播。


根據廣播的種類分爲系統廣播和自定義廣播。

  • 系統廣播:電池消耗情況,開關機。一般系統廣播爲有序廣播
  • 自定義廣播:自己定義一個廣播。
    根據廣播的傳播方式分爲:普通廣播和有序廣播(orderedBroadcast)
  • 普通廣播:異步執行,當一個broadcast發出後,所有與之匹配的broadcast都會同時接收到廣播。
  • 有序廣播:同步執行,會根據之前設置的優先級有序的執行,優先級高的接收器可以截斷廣播,從而停止廣播的傳送,傳說中的短信電話攔截就是用的這個原理。
    根據廣播的註冊方式分爲靜態註冊和動態註冊。
  • 靜態註冊:在AndroidManifest中進行註冊,廣播會一直存在除非退出app。一般多用於系統廣播註冊。
  • 動態註冊:在類中通過context.registerBroadcast()進行註冊,可以通過onResume()註冊,onPause()註銷。
    廣播的發送方式:

  • sendBroadcast(intent);

  • sendOrderedBroadcast(intent);–發送有序廣播

onReceiver方法–當接收器接收到傳遞的廣播時會調用onreiver方法,但是BroadcastReceiver的週期在onReceiver結束後結束,而且onReceiver是運行在主線程中的,如果需要執行耗時程序,需要開啓service,創建新線程。


以下就通過代碼來運用廣播的註冊與發送。

  • 靜態註冊廣播
    <receiver android:name=".broadcast.MyReceiver" >
            <intent-filter>
                <action android:name="android.action.test" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.action.dynamic.test"/>
            </intent-filter>
        </receiver>

    @OnClick(R.id.send_broadcast)
    void sendBroad() {
        Intent intent = new Intent().setAction("android.action.test");
        intent.putExtra("broad","register broadcast");
        sendBroadcast(intent);
    }
  • 動態註冊廣播
    @Override
    protected void onResume() {
        Log.i(TAG, "onResume");
        super.onResume();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("android.action.dynamic.test");
        registerReceiver(new MyReceiver(), intentFilter);
    }

    @Override
    protected void onPause() {
        Log.i(TAG, "onPause");
        super.onPause();
        unregisterReceiver(new MyReceiver());
    }
    @OnClick(R.id.send_dynemic_broadcast)
    void sendDynemicBroad(){
        Intent intent =new Intent().setAction("android.action.dynamic.test");
        intent.putExtra("broad","dynamic reggister broadcast");
        sendBroadcast(intent);
    }

繼承BroadcaReceiver的類,調用onReceiver方法。

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }

    //    不能執行超過5秒的任務,可以用service,關於context,若是靜態註冊,則context爲系統context,若動態註冊,則context爲註冊的那個類
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        if (**intent.getAction().equals("android.action.dynamic.test")**){
            DebugLog.i("broad"+intent.getStringExtra("broad"));
            Toast.makeText(context,intent.getStringExtra("broad"),Toast.LENGTH_SHORT).show();
        }else if (intent.getAction().equals("android.action.test")){
            DebugLog.i("dynamicBroad"+intent.getStringExtra("broad"));
            Toast.makeText(context,intent.getStringExtra("broad"),Toast.LENGTH_SHORT).show();
        }
        Log.i("MyReceive", "onReceive" + intent.getAction());
    }
}

receiver


上圖圖片就是靜態註冊和動態註冊後執行的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章