activity_main.xml で onClick を setAlarm にバインドして同じアクティビティ内の 1 つのボタンにバインドし、unsetAlarm を別のボタンにバインドする場合、次のコードでは unsetAlarm メソッドにリンクされたボタンをクリックしてもアラームの設定を解除できません。
...package name and includes ommitted...
public class MainActivity extends Activity {
private AlarmManager alarmManager;
private PendingIntent notifyIntent;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
}
public void setAlarm(View v) {
Intent myIntent = new Intent(MainActivity.this,
NotificationService.class);
notifyIntent = PendingIntent.getService(MainActivity.this, 0,
myIntent, 0);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE, 1);
Log.v(TAG, "time for alarm trigger:" + calendar.getTime().toString());
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), 1 * 60 * 1000, notifyIntent);
}
public void unsetAlarm(View v) {
alarmManager.cancel(notifyIntent);
Log.v(TAG, "cancelling notification");
}
}
解決策は、unsetAlarm メソッドで pendingIntent を再作成することでした (通知と AlarmManagerで提供されたように、設定したアラームをキャンセルします)。
public void unsetAlarm(View v) {
Intent myIntent = new Intent(MainActivity.this,
NotificationService.class);
notifyIntent = PendingIntent.getService(MainActivity.this, 0,
myIntent, 0); // recreate it here before calling cancel
alarmManager.cancel(notifyIntent);
Log.v(TAG, "cancelling notification");
}
私の質問は、最初のコード スニペットの「notifyIntent」フィールドに保存されている PendingIntent を再利用できないのはなぜですか? キャンセルするには、なぜ再作成する必要があるのですか? MainActivity に属性android:launchMode="singleInstance"を設定したので、NotificationService で作成された通知をクリックしたときに同じインスタンスを使用していると考えるべきです (省略しましたが、通知が表示されるだけです)。