BroadcastReceiver簡單使用示例

BroadcastReceiver使用

廣播(Broadcast)是在組件之間傳播數據的一種機制,這些組件能夠位於不一樣的進程中,起到進程間通訊的做用android

動態註冊實現

動態註冊 BroadcastReceiver 是在代碼中定義並設置好一個 IntentFilter 對象,而後在須要註冊的地方調用 Context.registerReceiver() 方法,調用 Context.unregisterReceiver() 方法取消註冊,此時就不須要在清單文件中註冊 receiver 了bash

監聽電量變化

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private BatteryLevelReceiver blReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        registerBatteryLevelRegister();

    }

    private void registerBatteryLevelRegister() {
        //第二步:要收聽的頻道:電量變化
        IntentFilter intentFilter = new IntentFilter();
        //第三步:設置頻道
        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
        //第四步
        blReceiver = new BatteryLevelReceiver();
        //第五步:註冊廣播
        this.registerReceiver(blReceiver, intentFilter);
    }

    /**
     * 第一步:建立一個廣播接收者,繼承自BroadcastReceiver
     */
    private class BatteryLevelReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Log.d(TAG, "--------onReceive: " + action);
            Log.d(TAG, "--------onReceive: " + "當前電量爲:" + intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0));
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消廣播註冊,不然會致使內存泄漏
        if (blReceiver != null) {
            this.unregisterReceiver(blReceiver);
            Log.d(TAG, "--------onDestroy: "+"取消廣播註冊");
        }
    }
}
複製代碼
2019-09-25 19:29:47.117 2987-2987/? D/MainActivity: --------onReceive: android.intent.action.BATTERY_CHANGED
2019-09-25 19:29:47.117 2987-2987/? D/MainActivity: --------onReceive: 當前電量爲:65
2019-09-25 19:29:48.468 2987-2987/com.fr.broadcastsapp D/MainActivity: --------onDestroy: 取消廣播註冊
複製代碼

靜態註冊實現

靜態註冊即在清單文件中爲 BroadcastReceiver 進行註冊,使用 < receiver > 標籤聲明,並在標籤內用 < intent-filter > 標籤設置過濾器。這種形式的 BroadcastReceiver 的生命週期伴隨着整個應用,若是這種方式處理的是系統廣播,那麼無論應用是否在運行,該廣播接收器都能接收到該廣播app

開機廣播監聽

public class MyReceiver extends BroadcastReceiver {

    private static final String TAG = "MyReceiver";
    
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.d(TAG, "--------onReceive: "+action);
        Log.d(TAG, "--------onReceive: "+"開機完成...");
    }
}
複製代碼
AndroidManifest.xml中註冊BroadcastReceiver
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<receiver
    android:name=".MyReceiver"
        android:enabled="true"
        android:exported="false">
    <!--和動態註冊設置action是同樣的-->
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>
複製代碼
2019-09-25 19:50:40.345 4478-4478/com.fr.broadcastsapp D/MyReceiver: --------onReceive: android.intent.action.BOOT_COMPLETED
2019-09-25 19:50:40.345 4478-4478/com.fr.broadcastsapp D/MyReceiver: --------onReceive: 開機完成...
複製代碼

應用安裝與卸載監聽

public class AppStatusChangeReceiver extends BroadcastReceiver {

    private static final String TAG = "AppStatusChangeReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action != null){
            switch (action) {
                case Intent.ACTION_PACKAGE_ADDED:
                    //應用的安裝
                    Log.d(TAG, "--------onReceive: 應用被安裝了:"+intent.getData());
                    break;
                case Intent.ACTION_PACKAGE_REMOVED:
                    //應用的卸載
                    Log.d(TAG, "--------onReceive: 應用被卸載了:"+intent.getData());
                    break;
                default:
                    break;
            }
        }
    }
}
複製代碼
<receiver
    android:name=".AppStatusChangeReceiver"
    android:enabled="true"
    android:exported="true">

    <intent-filter>
        <!--應用卸載-->
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <!--應用安裝-->
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>
複製代碼
相關文章
相關標籤/搜索