0

したがって、私のアプリには、カウントダウン中にメインアクティビティに表示されるタイマーがあります。タイマーが終了したらアラームを鳴らしたいので、AlarmManager とクラスを使用してアラームを鳴らすインテントをスケジュールし、Br​​oadcastReceiver を拡張します。

アラームが鳴るまで、すべて正常に動作します。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() に変更しても、クラッシュは修正されません。多くの人がどちらか一方を使用することを提案しているのを見ましたが、どちらを使用してもクラッシュが続きます。

4

1 に答える 1

1

アプリケーションのコンテキストと、コードが MainActivity にないなどの関係があるような気がします。

はい、Activityを表示するには が必要Dialogです。

できることは、必要な を使用して別Activityの を作成し、layoutから開始することですReceiver。次のコードを の<activity>タグに追加しmanifest.xmlて、 として表示させることができますDialog

    android:theme="@android:style/Theme.Dialog"

ドキュメントから

注: アクティビティは、ダイアログの作成、保存、復元を管理する機能を提供します。

于 2013-09-18T00:26:22.850 に答える