首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Android 四大組件之 BroadcastReceiver(三):常見廣播實戰

     編輯:C++ 入門

Android 四大組件之 BroadcastReceiver(三):常見廣播實戰

本文通過三個實戰案例深入講解 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);
    }
}

Manifest 配置

<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;
    }
}

Manifest

<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);

Manifest

<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_COMPLETEDRECEIVE_BOOT_COMPLETED靜態註冊必須
網絡變化CONNECTIVITY_CHANGEACCESS_NETWORK_STATEAndroid 7.0+ 限制隱式廣播
電量變化BATTERY_CHANGED無僅動態註冊/主動查詢可用

最佳實踐

  • Android 8.0+ 靜態註冊多受限,優先用 JobScheduler/WorkManager 替代隱式廣播。
  • onReceive 執行時間 < 10s,耗時操作啟動 Service 或用 goAsync()。
  • 動態註冊 registerReceiver 需在 onDestroy 解註冊防洩漏。

掌握系統廣播的使用場景與限制,是 Android 開發者實現系統級交互功能的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved