使用靜態註冊的方式實作開機提示

教材中 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(應用程式無回應),直接崩潰。

推薦做法:接收器只做輕量級的觸發,例如:

  1. 彈出通知
  2. 啟動背景 Service
  3. 啟動 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(應用程式無回應),直接崩潰。

推薦做法:接收器只做輕量級的觸發,例如:

  1. 彈出通知
  2. 啟動背景 Service
  3. 啟動 Activity,把複雜的業務邏輯交給 Service 去處理,不要直接寫在 onReceive 裡面。

使用靜態註冊的方式實作開機提示

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *