廣播(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: "+"開機完成...");
}
}
複製代碼
<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>
複製代碼