本文通過三個實戰案例深入講解 BroadcastReceiver 的註冊、接收與業務處理:開機啟動服務、網絡狀態監聽、電量變化監聽。
public class BootCompleteReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, MsgPushService.class);
context.startService(service);
Log.i(TAG, "Boot Complete. Starting MsgPushService...");
}
}
public class MsgPushService extends Service {
@Override public IBinder onBind(Intent arg0) { return null; }
@Override public void onCreate() { super.onCreate(); Log.i(TAG, "onCreate called."); }
@Override public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStartCommand called.");
return super.onStartCommand(intent, flags, startId);
}
}
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<service android:name=".MsgPushService" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
public class NetworkStateReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "network state changed.");
if (!isNetworkAvailable(context))
Toast.makeText(context, "network disconnected!", 0).show();
}
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] info = mgr.getAllNetworkInfo();
if (info != null) for (NetworkInfo ni : info) if (ni.getState() == NetworkInfo.State.CONNECTED) return true;
return false;
}
}
<receiver android:name=".NetworkStateReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
public class BatteryChangedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);
int percent = level * 100 / scale;
Log.i("battery", "battery: " + percent + "%");
}
}
Intent batteryIntent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);
<receiver android:name=".BatteryChangedReceiver">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
| 廣播 | Action | 權限 | 備註 |
|---|---|---|---|
| 開機完成 | BOOT_COMPLETED | RECEIVE_BOOT_COMPLETED | 靜態註冊必須 |
| 網絡變化 | CONNECTIVITY_CHANGE | ACCESS_NETWORK_STATE | Android 7.0+ 限制隱式廣播 |
| 電量變化 | BATTERY_CHANGED | 無 | 僅動態註冊/主動查詢可用 |
JobScheduler/WorkManager 替代隱式廣播。onReceive 執行時間 < 10s,耗時操作啟動 Service 或用 goAsync()。registerReceiver 需在 onDestroy 解註冊防洩漏。掌握系統廣播的使用場景與限制,是 Android 開發者實現系統級交互功能的基礎。