BroadcastReceiver中的AlertDialog ??可以吗?

时间:2011-01-30 16:36:11

标签: java android broadcastreceiver alertdialog

BroadcastReceiver中的AlertDialog?可以吗?我正在开发一个应用程序,如果我收到短信,会弹出一个对话框。我试图在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();
    }

}

5 个答案:

答案 0 :(得分:14)

主要问题:尽量避免将耗时的功能放入BroadcastReceiver。它应该只接收并启动绑定的Activity / Service中的进一步处理。

更新:

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

关于StackOverflow的类似问题:

How to send data from BroadcastReceiver to an Activity in android?

Android SMS receiver not working

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中为此活动的主题标记下输入

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

答案 1 :(得分:7)

我一直在研究它,the documentation of the BroadcastReceiver实际上说:

  

public abstract void onReceive   (上下文上下文,意图意图)

     

从:API Level 1此方法是   当BroadcastReceiver是   收到意图广播。中   这次你可以使用另一个   BroadcastReceiver的方法   查看/修改当前结果值。   该函数通常在其中调用   它的过程的主线程,所以你   永远不应该长期运行   其中的操作(有一个超时   系统允许的10秒   在考虑接收器之前   被封锁和被杀的候选人)。   您无法启动弹出对话框   你的onReceive()实现。

您无法启动弹出式对话框 你的onReceive()

的实现

所以似乎不可能

答案 2 :(得分:3)

这已经很晚了,但这对某人有帮助。

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

在broadcastreceiver的onReceive方法中添加

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

并在您的类中设置对话框消息,以便在触发接收器事件时显示。我尝试了这个,它对我有用。希望这可能对某人有所帮助: - )

答案 3 :(得分:0)

您可以创建一个新的透明活动,然后在该活动中创建警报对话框,无论何时显示警报,都要从广播接收方调用该活动,这可能有效,未经过测试

答案 4 :(得分:-1)

将AlertDilaog中的“this”替换为“context” - 您在onRecieve方法上的第一个参数。

 public void onReceive(Context context, Intent intent)