したがって、私のアプリには、カウントダウン中にメインアクティビティに表示されるタイマーがあります。タイマーが終了したらアラームを鳴らしたいので、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() に変更しても、クラッシュは修正されません。多くの人がどちらか一方を使用することを提案しているのを見ましたが、どちらを使用してもクラッシュが続きます。