36

ユーザー向けのメモのようなものを書いています。ユーザーはイベントのリマインダーを設定します。時間になると、繰り返しアラームが設定され、ステータス バー通知がトリガーされます。しかし、通知を選択したり、通知をクリアしたりした後、アラームが止まらないようです。この繰り返しアラームをキャンセルする場所がわかりません。以下にコードの一部を示します。 メイン アクティビティで繰り返しアラームを設定する

alarmTime = Calendar.getInstance();
Intent intent = new Intent(this, AlarmReceive.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

alarmTime.add(Calendar.MINUTE,offset_time);

//Schedule the alarm
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime.getTimeInMillis(), 30 * 1000, sender);

私の OnReceive メソッドでは、ステータス バーに通知を表示し、フラグを次のように設定するだけです。FLAG_AUTO_CANCEL

manager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);

// Set the icon, scrolling text and timestamp
Notification notification = new Notification(R.drawable.medical, text, System.currentTimeMillis());

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, i, 0);

notification.flags = Notification.FLAG_AUTO_CANCEL;

manager.notify(R.string.service_text, notification);

ユーザーが通知を選択またはクリアしたときにアラームを停止するにはどうすればよいですか?

4

3 に答える 3

83

cancel()で使用したものとAlarmManager同等のものを呼び出します。PendingIntentsetRepeating()

Intent intent = new Intent(this, AlarmReceive.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

alarmManager.cancel(sender);
于 2010-07-25T19:56:40.707 に答える
5

いろいろな方法を試してみましたがうまくいかなかったので、汚いトリックをすることにしました。繰り返しアラームをキャンセルしたい場合は、アラームを作成したのと同じ方法を使用して (したがって、古いアラームを置き換えて)、すぐにキャンセルします。このメソッドでは、boolean 変数が true に設定されている場合、アラームが作成され、置換後に同じ ID を持つ置換がキャンセルされます。

static void CancelRepeatingAlarm(Context context, boolean creating){
    //if it already exists, then replace it with this one
    Intent alertIntent = new Intent(context, AlertReceiver.class);
    PendingIntent timerAlarmIntent = PendingIntent
            .getBroadcast(context, 100, alertIntent,PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    if (creating){
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), INTERVAL, timerAlarmIntent);
    }else{
        alarmManager.cancel(timerAlarmIntent);
    }
于 2016-11-15T06:14:33.163 に答える
3

MainActivityで、アラーム時刻を設定します。複数のアラームを使用する場合はSharedPreferences、それぞれの ID を保存するために使用します。コードは次のとおりです。

PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, _id,intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),
            pendingIntent);

public static Context getContext() {
    return mContext;
}
mContext=mainactivity.this;

2 番目Activityに から同じ ID を使用しますSharedPreferences。私のコードでは、ArrayList から ID を取得しますAlarm_id。最後に、ここで MainActivity コンテキストを で使用できますMainActivity.getContext()。コードは次のとおりです。

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intentAlarm = new Intent(AlarmListviewActivity.this,
        MainActivity.class);
PendingIntent morningIntent = PendingIntent.getBroadcast(MainActivity.getContext(), Alarm_id.get(positon),
        intentAlarm, PendingIntent.FLAG_CANCEL_CURRENT);

alarmManager.cancel(morningIntent);
morningIntent.cancel();
于 2015-06-26T06:27:07.363 に答える