Android : AlarmManager로 설정된 모든 PendingIntents 가져 오기
다음과 같이 알람을 설정합니다.
alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingEvent);
이전에 설정 한 모든 알람을 제거하고 지우는 데 관심이 있습니다.
그렇게하거나 현재 설정된 모든 알람을 가져와 수동으로 삭제할 수있는 방법이 있습니까?
보류중인 인 텐트를 생성 한 다음 취소해야합니다.
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent updateServiceIntent = new Intent(context, MyPendingIntentService.class);
PendingIntent pendingUpdateIntent = PendingIntent.getService(context, 0, updateServiceIntent, 0);
// Cancel alarms
try {
alarmManager.cancel(pendingUpdateIntent);
} catch (Exception e) {
Log.e(TAG, "AlarmManager update was not canceled. " + e.toString());
}
당신은 그것에 대한 참조를 유지할 필요가 없습니다. 새 PendingIntent를 만들 때 정의한 것과 똑같이 정의하면됩니다.
예를 들면 :
다음과 같이 AlarmManager에 의해 실행될 PendingIntent를 만든 경우 :
Intent alarmIntent = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class);
alarmIntent.setData(Uri.parse("custom://" + alarm.ID));
alarmIntent.setAction(String.valueOf(alarm.ID));
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
PendingIntent displayIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0);
alarmManager.set(AlarmManager.RTC_WAKEUP, alarmDateTime, displayIntent);
그런 다음 다른 코드 (다른 활동 포함) 어딘가에 이렇게하면 취소 할 수 있습니다.
Intent alarmIntent = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class);
alarmIntent.setData(Uri.parse("custom://" + alarm.ID));
alarmIntent.setAction(String.valueOf(alarm.ID));
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
PendingIntent displayIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0);
alarmManager.cancel(displayIntent);
여기서 중요한 것은 PendingIntent를 정확히 동일한 데이터와 작업 및 여기에 명시된 다른 기준으로 설정하는 것입니다. http://developer.android.com/reference/android/app/AlarmManager.html#cancel%28android.app .PendingIntent % 29
경보를 취소하려면 동일한 PendingIntent를 다시 생성하고 동일한 요청 코드를 전달해야합니다.
따라서 필요한 경우 나중에 취소 할 수 있도록 모든 요청 코드를 기본 설정에 저장하는 데 도움이되는 AlarmUtils를 만들었습니다. 다음 클래스를 사용하고 다음 메서드를 호출하기 만하면됩니다.
addAlarm
새 알람을 추가하고 요청 코드를 전달합니다.cancelAlarm
알람을 제거하려면 동일한 인
텐트 를 다시 생성 하고 동일한 요청 코드를 전달해야합니다.hasAlarm
해당 알람이 추가되었는지 확인하려면 동일한 인 텐트를 다시 생성하고 동일한 요청 코드를 전달해야합니다.cancelAllAlarms
설정된 모든 경보를 제거합니다.
내 AlarmUtils
public class AlarmUtils {
private static final String sTagAlarms = ":alarms";
public static void addAlarm(Context context, Intent intent, int notificationId, Calendar calendar) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
saveAlarmId(context, notificationId);
}
public static void cancelAlarm(Context context, Intent intent, int notificationId) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.cancel(pendingIntent);
pendingIntent.cancel();
removeAlarmId(context, notificationId);
}
public static void cancelAllAlarms(Context context, Intent intent) {
for (int idAlarm : getAlarmIds(context)) {
cancelAlarm(context, intent, idAlarm);
}
}
public static boolean hasAlarm(Context context, Intent intent, int notificationId) {
return PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_NO_CREATE) != null;
}
private static void saveAlarmId(Context context, int id) {
List<Integer> idsAlarms = getAlarmIds(context);
if (idsAlarms.contains(id)) {
return;
}
idsAlarms.add(id);
saveIdsInPreferences(context, idsAlarms);
}
private static void removeAlarmId(Context context, int id) {
List<Integer> idsAlarms = getAlarmIds(context);
for (int i = 0; i < idsAlarms.size(); i++) {
if (idsAlarms.get(i) == id)
idsAlarms.remove(i);
}
saveIdsInPreferences(context, idsAlarms);
}
private static List<Integer> getAlarmIds(Context context) {
List<Integer> ids = new ArrayList<>();
try {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
JSONArray jsonArray2 = new JSONArray(prefs.getString(context.getPackageName() + sTagAlarms, "[]"));
for (int i = 0; i < jsonArray2.length(); i++) {
ids.add(jsonArray2.getInt(i));
}
} catch (Exception e) {
e.printStackTrace();
}
return ids;
}
private static void saveIdsInPreferences(Context context, List<Integer> lstIds) {
JSONArray jsonArray = new JSONArray();
for (Integer idAlarm : lstIds) {
jsonArray.put(idAlarm);
}
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(context.getPackageName() + sTagAlarms, jsonArray.toString());
editor.apply();
}
}
참고 URL : https://stackoverflow.com/questions/4315611/android-get-all-pendingintents-set-with-alarmmanager
'program story' 카테고리의 다른 글
“누락 된 마케팅 아이콘을 해결하는 방법. (0) | 2020.11.08 |
---|---|
SQL Server 2005에 비해 SQL Server 2008의 장점은 무엇입니까? (0) | 2020.11.08 |
캐스팅하지 않고 짧은 int 리터럴을 지정하는 방법은 무엇입니까? (0) | 2020.11.07 |
범위에 텍스트 설정 (0) | 2020.11.07 |
왜 'extern“C ++”'를 사용합니까? (0) | 2020.11.07 |