Android警报对话框导致.show()崩溃

时间:2013-09-18 00:19:06

标签: android dialog alertdialog

所以我的应用程序有一个计时器,当它倒计时显示在主要活动中。我希望在计时器完成时播放闹钟,因此我使用AlarmManager和类来安排发出警报的意图以扩展BroadcastReceiver。

一切正常,直到闹钟响起。我将崩溃追踪到我在AlertDialog上调用show()的行。我觉得它与应用程序上下文和不在MainActivity中的代码有关,但我似乎无法找到具有类似配置和相同崩溃源的任何内容。

以下是警告对话框代码

public class SoundAlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        ...///Play sound code is here and works

            final CharSequence [] options = {"OK"};
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setTitle("Title");
            builder.setMessage("Beer is done!");
            builder.setCancelable(false);
            builder.setItems(options, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    if(which == 0) {
                        mp.stop();
                        mp.release();
                    }
                }
            });

            AlertDialog alert = builder.create();
            alert.show();
... //other stuff

以下是使用MainActivity.java中的AlarmManager进行计划的代码:

//Schedule the alarm
    Intent alarmIntent = new Intent(MainActivity.this, SoundAlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    Calendar fireTime = Calendar.getInstance();
    fireTime.setTimeInMillis(System.currentTimeMillis());
    fireTime.add(Calendar.MILLISECOND, time);

    alarmManager.set(AlarmManager.RTC_WAKEUP, fireTime.getTimeInMillis(), pendingIntent);

另外,另外,将待处理意图的MainActivity.this更改为getApplicationContext()并不能解决崩溃问题。看到很多人建议使用其中一个,但无论我使用哪一个,我的崩溃都会持续存在。

1 个答案:

答案 0 :(得分:1)

  

我觉得它与应用程序上下文和不在MainActivity中的代码有关,

是的,您需要Activity才能显示Dialog

您可以做的是与您想要的Activity建立单独的layout,并从Receiver开始。您可以将以下代码添加到<activity>的{​​{1}}标记中,使其显示为manifest.xml

Dialog

From the Docs

  

注意:活动提供了管理对话框的创建,保存和恢复的工具。