系统重新启动后,在广播接收器中显示警告对话框

美好的一天,我试图在广播接收机重启系统后显示一个警告对话框。 我已经在我的清单中添加了接收器,并调用了所需的权限,但在显示对话框时出现错误。 请问我该如何正确实施?谢谢

我的代码:

public void onReceive(final Context context, Intent intent) { Log.d(TAG, "received boot completed broadcast receiver... starting settings"); String settings = context.getResources().getString(R.string.restart_setting); String yes = context.getResources().getString(R.string.Settings); String no = context.getResources().getString(R.string.Cancel); final AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage(settings) .setCancelable(false) .setPositiveButton(yes, new DialogInterface.OnClickListener() { public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) Intent config = new Intent(context, WeatherConfigure.class) context.startActivity(config); } }) .setNegativeButton(no, new DialogInterface.OnClickListener() { public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) { dialog.cancel(); } }); final AlertDialog alert = builder.create(); alert.show(); } 

我得到这个日志错误:

 01-07 01:42:01.559: ERROR/AndroidRuntime(2004): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.view.ViewRoot.setView(ViewRoot.java:548) 01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at android.app.Dialog.show(Dialog.java:288) 01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at com.MuaaApps.MyWeatherUpdate.myWeatherBroadcastReceiver.onReceive(MyWeatherBroadcastReceiver.java:59) 01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1994) 

问题是你正试图从BroadcastReceiver显示AlertDialog ,这是不允许的。 您无法显示来自BroadcastReceiverAlertDialog 。 只有活动可以显示对话框。

你应该做一些其他的事情,让BroadcastReceiver像你一样开机启动,并开始一个活动来显示对话框。

这里有更多的博客文章 。

编辑:

这是我会build议如何做的。 从你的BroadcastReceiver开始一个AlertDialogActivity

 public class NotifySMSReceived extends Activity { private static final String LOG_TAG = "SMSReceiver"; public static final int NOTIFICATION_ID_RECEIVED = 0x1221; static final String ACTION = "android.provider.Telephony.SMS_RECEIVED"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); IntentFilter filter = new IntentFilter(ACTION); this.registerReceiver(mReceivedSMSReceiver, filter); } private void displayAlert() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Are you sure you want to exit?").setCancelable( false).setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }).setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); } private final BroadcastReceiver mReceivedSMSReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION.equals(action)) { //your SMS processing code displayAlert(); } } } } 

正如你在这里看到我永远不会调用setContentView() 。 这是因为活动将有一个透明的视图,只有警报对话框将显示。

您无法在BroadcastReceiver上使用对话框,因此您最好从BroadcastReceiver调用对话框的活动,

将这个代码添加到你的onReceive函数中:

 @Override public void onReceive(Context context, Intent intent) { Intent i = new Intent(context, {CLASSNAME}.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } 

用对话框活动填充{CLASSNAME},查看我的对话框活动:

 package com.example.mbanking; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; // ALERT DIALOG // Sources : http://techblogon.com/alert-dialog-with-edittext-in-android-example-with-source-code/ public class AlertDialogActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder .setTitle("Test") .setMessage("Are you sure you want to exit?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }) .setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); } } 

在那里我得到了答案?,在这里: 你如何使用android中的广播接收机的警报对话框? 感谢Femi !!,我只是传播消息:D

这是一个关于如何去做的post 。 你可以从这里得到源代码。

您不能直接从您的广播接收机显示对话框。 你必须使用一个Activity 。 此外,为了接收ACTION_BOOT_COMPLETED您的活动必须首先由用户或其他应用程序明确启动(谷歌应用程序停止状态以获取更多信息)。

基本上,要实现所需的function,您需要执行以下操作:

  1. 创build显示对话框的透明活动。
  2. 创build接收ACTION_BOOT_COMPLETED BroadcastReceiver并启动您的活动。
  3. 在清单中注册您的广播接收机并获得适当的许可。

另外, 这个问题提供了更多关于如何创build透明活动的信息。

最好的方法是做一个活动,并将其“主题”属性设置为“Theme.Translucen”

  <activity android:name=".MyAlertDialog" android:label="@string/title_activity_alert_dialog" android:launchMode="singleInstance" android:theme="@android:style/Theme.Translucent" > </activity> 

并在您的活动中创build一个警报对话框:

 public class MyAlertDialog extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //hide activity title setContentView(R.layout.activity_my_alert_dialog); AlertDialog.Builder Builder=new AlertDialog.Builder(this) .setMessage("Do You Want continue ?") .setTitle("exit") .setIcon(android.R.drawable.ic_dialog_alert) .setNegativeButton(R.string.No, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { MyAlertDialog.this.finish(); } }) .setPositiveButton(R.string.Yes,null); AlertDialog alertDialog=Builder.create(); alertDialog.show(); } } 

并在brodcastreciver:

  @Override public void onReceive(Context context, Intent intent) { Intent i=new Intent(context.getApplicationContext(),MyAlertDialog.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } 

这可能是旧的和回答的线程,但答案根本没有帮助。

你不能在你的onReceive()的实现中启动一个popup对话框。 广播接收器

而不是对话框或popupWindow,您可以使用主题为对话框的活动

  <activity android:taskAffinity="" android:name=".activity.CallActivity" android:label="@string/app_name" android:theme="@style/AppTheme.Dialog" /> 

请注意,我添加 taskAffinity块(AndroidManifest.xml)

那么你可以把它用作常规活动。

 Intent intentPhoneCall = new Intent(context, CallActivity.class); intentPhoneCall.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intentPhoneCall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intentPhoneCall); 

希望它有帮助。 快乐的编码。

  1. 显示来自广播接收器的对话框是不可能的。
  2. 我们应该只显示来自活动的对话框。
  3. 但是您的应用程序上下文只有广播接收器,那么我们应该启动活动为“FLAG_ACTIVITY_NEW_TASK”,然后创build堆栈。
  4. 如果我们使用此标志“FLAG_ACTIVITY_NEW_TASK”启动活动,则无法从堆栈中删除。

  5. 所以在closures应用程序之后,我们试图从堆栈启动应用程序,它显示了相同的Activity,因为这个活动有标志“FLAG_ACTIVITY_NEW_TASK”,所以它不应该创build新的实例并使用现有的实例。

但是我们只想显示一次对话框。 为此我们需要处理程序化的盟友。

  if (count == 0) { mBuilder = new Dialog(this); mMsg = getIntent().getStringExtra(AlarmSchedulerUtils.EXTRA_MSG); Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); mRingTome = RingtoneManager.getRingtone(ReminderDialog.this, notification); mRingTome.play(); count++; showReminderDialog(); } else { Intent intent=new Intent(ReminderDialog.this,SplashActivity.class); startActivity(intent); finish(); } 

这对我有效。