Broadcast Receiver

廣播廣泛運(yùn)用于應(yīng)用程序之間傳輸信息(進(jìn)程間通信)的機(jī)制,而BroadcastReceiver是對發(fā)送出來的廣播進(jìn)行過濾接收并響應(yīng)

例子

  • 電池的使用狀態(tài)
  • 電話的接收
  • 短信的接收

image.png

系統(tǒng)的廣播都是以Intent.ACTION_XXX的形式

靜態(tài)注冊
  1. 自定義BroadcastReceiver
public class BatteryLowReceiver extends BroadcastReceiver {
    private String TAG = "BatteryLowReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "action = " + intent.getAction());
    }
}
  1. 在AndroidManifest中注冊
  <receiver android:name=".BatteryLowReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_CHANGED"/>
                <action android:name="android.intent.action.BATTERY_LOW"/>
                <action android:name="android.intent.action.BATTERY_OKAY"/>
            </intent-filter>
  </receiver>
動態(tài)注冊

1.實例BroadcastReceiver

    private BroadcastReceiver mBatteryReceiver =new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "action = " + intent.getAction()); 
        }
    };

2.動態(tài)注冊,注銷

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter=new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        filter.addAction(Intent.ACTION_BATTERY_LOW);
        filter.addAction(Intent.ACTION_BATTERY_OKAY);
        registerReceiver(mBatteryReceiver,filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mBatteryReceiver);
    }
生命周期

生命周期只有10s,如果在onReceiver()內(nèi)做超過10s的操作,就會報錯
當(dāng)接收到廣播時,進(jìn)行耗時操作,例如線程休眠,出現(xiàn)ANR錯誤(Application not response),如下

    private BroadcastReceiver mBatteryReceiver =new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //耗時操作,當(dāng)點擊屏幕UI,無法操作   ANR錯誤
            try{
                Thread.sleep(15000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    };

解決:

  1. 應(yīng)該通過發(fā)送Intent給Service,Service來完成
  2. 不能使用子線程來解決,因為receiver生命周期很短,可能子線程未結(jié)束,receiver就先結(jié)束了,可能會有異常
自定義
  1. 自定義receiver
public class CustomReceiver extends BroadcastReceiver {
    public static final String CUSTOME_ACTION = "com.zhang.custome_action";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("###", intent.getAction());

        //啟動另一個activity
        Intent startIntent = new Intent(context, MainActivity.class);
        startIntent.setAction(CUSTOME_ACTION);
        startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(startIntent);
    }
}
  1. 發(fā)送broadcast
Intent sendIntent = new Intent();
sendIntent.setAction(CustomReceiver.CUSTOME_ACTION);
sendBroadcast(sendIntent);
  1. 注冊receiver
 <receiver android:name=".CustomReceiver">
            <intent-filter>
                <action android:name="com.zhang.custome_action"/>
            </intent-filter>
</receiver>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容