教材中 manifest 寫成
exported="false"是錯誤的,要接收系統廣播必須設為exported="true"
② AndroidManifest.xml 新增權限
<!-- 接收開機完成廣播的權限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
Code language: HTML, XML (xml)
③ 在 <application> 內靜態註冊 receiver + intent-filter
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<!-- 開機完成的 Action -->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Code language: HTML, XML (xml)
intent-filter:過濾器,用來宣告這個接收器要接收哪一類的廣播,這裡是監聽BOOT_COMPLETED系統開機廣播。
3. 注意事項
onReceive() 裡面不能寫耗時的邏輯! 廣播接收器的
onReceive是跑在主執行緒的,執行時間限制很短(大約 10 秒),如果執行大量耗時操作,系統會判定為 ANR(應用程式無回應),直接崩潰。
推薦做法:接收器只做輕量級的觸發,例如:
- 彈出通知
- 啟動背景 Service
- 啟動 Activity,把複雜的業務邏輯交給 Service 去處理,不要直接寫在 onReceive 裡面。
使用靜態註冊的方式實作開機提示
這一節對比上一節的動態註冊,講解靜態註冊廣播接收器,實現在開機完成後收到系統廣播、彈出 Toast 提示。
1. 動態註冊 vs 靜態註冊核心區別
- 動態註冊:在程式碼中透過
registerReceiver註冊,通常寫在 Activity 的onCreate裡。App 必須先啟動過一次,才能接收廣播;App 關閉後就收不到廣播了。註冊和銷毀可以手動控制,比較靈活。 - 靜態註冊:在
AndroidManifest.xml裡使用<receiver>標籤註冊。不需要 App 事先啟動,系統開機後會自動喚醒接收器來接收系統廣播。
2. 完整步驟
① 建立廣播接收器類別 BootCompleteReceiver
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "系統啟動完成", Toast.LENGTH_LONG).show();
}
}
- 建立方式:AS 在套件名上按右鍵 → New → Other → Broadcast Receiver
- 參數說明:
Enabled:是否啟用這個接收器(請勾選)Exported:是否接收本應用程式以外的系統廣播(請勾選,因為這裡要接收系統開機廣播,需要接收外部廣播)
教材中 manifest 寫成
exported="false"是錯誤的,要接收系統廣播必須設為exported="true"
② AndroidManifest.xml 新增權限
<!-- 接收開機完成廣播的權限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
③ 在 <application> 內靜態註冊 receiver + intent-filter
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<!-- 開機完成的 Action -->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
intent-filter:過濾器,用來宣告這個接收器要接收哪一類的廣播,這裡是監聽BOOT_COMPLETED系統開機廣播。
3. 注意事項
onReceive() 裡面不能寫耗時的邏輯! 廣播接收器的
onReceive是跑在主執行緒的,執行時間限制很短(大約 10 秒),如果執行大量耗時操作,系統會判定為 ANR(應用程式無回應),直接崩潰。
推薦做法:接收器只做輕量級的觸發,例如:
- 彈出通知
- 啟動背景 Service
- 啟動 Activity,把複雜的業務邏輯交給 Service 去處理,不要直接寫在 onReceive 裡面。
使用靜態註冊的方式實作開機提示
Previous: Android 網路斷線/連線廣播監聽
Next: 發送自訂廣播