AlertDialog从BroadcastReceiver内? 可以这样做吗?

AlertDialog从BroadcastReceiver内? 可以这样做吗? 我正在开发一个应用程序,如果我收到短信,就会popup一个对话框。 我正在尝试在BroadcaseReceiver中对其进行编码。 但我不能使用这行代码AlertDialog.Builder builder = new AlertDialog.Builder(this); 。 有人可以帮助我一个提示!

 public class SMSPopUpReceiver extends BroadcastReceiver { private static final String LOG_TAG = "SMSReceiver"; public static final int NOTIFICATION_ID_RECEIVED = 0x1221; static final String ACTION = "android.provider.Telephony.SMS_RECEIVED"; public void onReceive(Context context, Intent intent) { Log.i(LOG_TAG, "onReceive"); if (intent.getAction().equals(SMSPopUpReceiver.ACTION)) { StringBuilder sb = new StringBuilder(); Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); for (Object pdu : pdus){ SmsMessage messages = SmsMessage.createFromPdu((byte[]) pdu); sb.append("Received SMS\nFrom: "); sb.append(messages.getDisplayOriginatingAddress()); sb.append("\n----Message----\n"); sb.append( messages.getDisplayMessageBody()); } } Log.i(SMSPopUpReceiver.LOG_TAG, "[SMSApp] onReceiveIntent: " + sb); Toast.makeText (context, sb.toString(), Toast.LENGTH_LONG).show(); } 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(); } } 

Solutions Collecting From Web of "AlertDialog从BroadcastReceiver内? 可以这样做吗?"

主要问题:尽量避免将耗时的function放入BroadcastReceiver中。 它应该只是接收和启动进一步处理在绑定的活动/服务。

更新:

请检查以下可能有用的来源:

关于StackOverflow的类似问题:

如何将数据从BroadcastReceiver发送到android中的Activity?

Android短信接收器不工作

Android SDK演示示例:

Android的SDK窗口\样品\机器人-8 \ ApiDemos \ SRC \ COM \示例\机器人\的API \ OS \ SmsMessagingDemo.java

当然还有标准的Android API文档: http : //developer.android.com/reference/android/content/BroadcastReceiver.html

UPDATE2:

添加应用程序框架,它应该看起来。 请注意,没有定义内容视图。 这是因为你的应用程序将有透明的屏幕。 为了实现这一点

@android:款式/ Theme.Translucent

在AndroidManifest.xml中的这个活动的主题标签下input。

 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(); } } }; } 

我一直在研究它和BroadcastReceiver的文档实际上说:

public abstract void onReceive(Context context,Intent intent)

从以下版本开始:API Level 1当BroadcastReceiver正在接收Intent广播时,将调用此方法。 在此期间,您可以使用BroadcastReceiver上的其他方法查看/修改当前的结果值。 该函数通常在其进程的主线程中调用,所以您不应该在其中执行长时间运行的操作(系统允许在超过10秒的时间内考虑接收器被阻塞并且候选者被终止) 。 你不能在你的onReceive()的实现中启动一个popup对话框。

你不能在你的onReceive()的实现中启动一个popup对话框

所以这似乎是不可能的

这是迟到了,但这可能有助于某人。

您不能在广播接收器中使用警报对话框,我们只能在活动或服务中使用它。 像这样尝试

在你的onReceive方法的broadcastreceiver中添加

 Intent i = new Intent(context, yourclass.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); 

并在你的课堂上设置你的对话信息,以便它在你触发接收器事件时出现。 我试过这个,它使我工作。 希望这可以帮助一些人:-)

您可以创build一个新的透明活动,然后在该活动中创build警报对话框,每当您的警报显示时,从您的广播接收者处调用该活动,这可以工作,而不是testing

将AlertDilaog中的“this”一词replace为“context” – onRecieve方法中的第一个参数。

  public void onReceive(Context context, Intent intent)