首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android BroadcastReceiver 中彈出 AlertDialog 崩潰:BadTokenException 解決方案

     編輯:程式設計綜合問答

錯誤原因

BroadcastReceiver 執行於非 UI 執行緒且**無 Activity Context**,直接 new AlertDialog.Builder(context.getApplicationContext()) 會因 Token 無效拋出 WindowManager$BadTokenException。

解決方案

方案一:啟動一個透明 Activity 顯示對話框

// AndroidManifest.xml
<activity android:name=".DialogActivity"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:excludeFromRecents="true" />
// DialogActivity.java
public class DialogActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new AlertDialog.Builder(this)
            .setTitle("標題")
            .setMessage("內容")
            .setPositiveButton("確定", (d, w) -> finish())
            .setOnDismissListener(d -> finish())
            .show();
    }
}
// Receiver 中
Intent intent = new Intent(context, DialogActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

方案二:使用 Notification 替代(推薦)

背景服務/接收器應優先使用通知欄,不打擾使用者:

NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
    .setSmallIcon(R.drawable.ic_notification)
    .setContentTitle("標題")
    .setContentText("內容")
    .setPriority(NotificationCompat.PRIORITY_HIGH)
    .setAutoCancel(true)
    .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), PendingIntent.FLAG_IMMUTABLE));
NotificationManagerCompat.from(context).notify(NOTIFY_ID, builder.build());

方案三:若必須在 Receiver 彈窗,需獲得 Activity Context

  • 只有在 Receiver 由 Activity 透過 registerReceiver 註冊時,context 才是 Activity,可直接彈窗。
  • 靜態註冊、系統廣播(如 BOOT_COMPLETED)的 context 為 ReceiverRestrictedContext,**不可**彈窗。

最佳實務

  1. 背景工作 → Notification。
  2. 需使用者立即互動 → 啟動 Activity(可設為對話框樣式)。
  3. 切勿在靜態 Receiver 中使用 AlertDialog。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved