BroadcastReceiver 執行於非 UI 執行緒且**無 Activity Context**,直接 new AlertDialog.Builder(context.getApplicationContext()) 會因 Token 無效拋出 WindowManager$BadTokenException。
// 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);
背景服務/接收器應優先使用通知欄,不打擾使用者:
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());
registerReceiver 註冊時,context 才是 Activity,可直接彈窗。ReceiverRestrictedContext,**不可**彈窗。AlertDialog。