Android廣播接收者詳解

廣播

系統在運行中會產生很多事件,某些特定的事件產生時(如 低電量、開機、應用安裝卸載、收發短信、屏幕解鎖等等),系統會發送廣播通知。當應用收到廣播時根據情況作出相應反應。


創建廣播接受者(BroadcastReceiver)

  • 創建Java類繼承自 BroadcastReceiver
  • 在清單文件中配置 IntentFilter 屬性中配置 action 屬性
  • 添加權限
<receiver android:name=".MyReceiver">
            <intent-filter>
                <!--接收打電話廣播-->
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>

收到廣播後可以自onReceive 方法裏做自己的操作:

 public void onReceive(Context context, Intent intent) {
        System.out.println("收到打電話廣播");
        System.out.println("攔截電話號碼:" + getResultData());
        setResultData("110");
    }

通過 getResultData 獲取電話號碼,setResultData 重新設置電話號碼。


  • 即使廣播接收者所在的應用進程被殺死,當相應的廣播發出後,只要匹配成功,就會自動啓動該進程。
 <receiver android:name=".MyReceiver">
            <intent-filter  android:priority="1000">
                <!--接收打電話廣播-->
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

設置優先級 android:priority=”1000” 理論上是 -1000~+1000 實際上可以更大 比如 int的最大值 優先級越高越先收到。

abortBroadcast();攔截廣播   只對有序廣播有效  無序廣播不能攔截
4.0之後,如果應用沒有啓動過,廣播接收者不會生效。
用戶手動關閉應用之後不會再次啓動(強制關閉)

發送自定義廣播

使用 Intent 發送廣播。
Intent intent = new Intent();
intent.setAction("com.gechao.test.custom");
sendBroadcast(intent);

如果需要接收此廣播,只需要創建一個廣播接收者,使其 action 匹配。


發送有序廣播

Intent intent = new Intent();
intent.setAction("com.gechao.test.custom");
sendOrderedBroadcast(intent, null, null, null, 0, "這是廣播內容", null);

發送有序廣播

----------

參數解析: 

public void sendOrderedBroadcast(
        Intent intent, String receiverPermission, BroadcastReceiver resultReceiver,
        Handler scheduler, int initialCode, String initialData,
        Bundle initialExtras) {
        mBase.sendOrderedBroadcast(intent, receiverPermission,
                resultReceiver, scheduler, initialCode,
                initialData, initialExtras);
    }
-----------------
    receiverPermission  是指接收權限
    initialCode  類似於請求碼
    initialData  廣播內容  如果內容簡單  直接在這裏設置
    initialExtras  廣播內容    複雜數據傳遞
    resultReceiver  最終接收者   一定會收到  最後收到  不論是否攔截  並且不需要再清單文件中配置  
  • 在每一層都可以做修改,甚至攔截
class ResultReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("最終接收者");
        }
    }

廣播的動態註冊和靜態註冊

 public void register(View view) {
        // 註冊廣播接收
        myReceiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.gechao.test");    //只有持有相同的action的接受者才能接收此廣播
        registerReceiver(myReceiver, filter);
    }


    public void send(View view) {
        Intent intent = new Intent();
        intent.setAction("com.gechao.test");
        sendBroadcast(intent);
    }

    public void unregister(View view) {
        if (myReceiver != null) {
            unregisterReceiver(myReceiver);
        }

    }

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("收到廣播");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章