Android
AlarmManager
수색…
나중에 인 텐트를 실행하십시오.
- 수신자를 만듭니다. 이 수업은 의도를 받아들이고 원하는 방식으로 처리합니다.
public class AlarmReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// Handle intent
int reqCode = intent.getExtras().getInt("requestCode");
...
}
}
- AlarmManager에 인 텐트를 지정하십시오. 이 예제는 1 분 후에 AlarmReceiver로 보낼 의도를 트리거합니다.
final int requestCode = 1337;
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
am.set( AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 60000 , pendingIntent );
경보를 취소하는 방법
알람을 취소하려는 경우 알람을 설정하는 데 사용 된 원래의 PendingIntent에 대한 참조가없는 경우 PendingIntent를 원래 생성되었을 때와 똑같이 다시 작성해야합니다.
인 텐트는 AlarmManager에 의해 동등한 것으로 간주됩니다 .
데이터, 유형, 클래스 및 카테고리가 동일한 경우 이는 인 텐트에 포함 된 추가 데이터를 비교하지 않습니다.
일반적으로 각 알람의 요청 코드는 상수로 정의됩니다.
public static final int requestCode = 9999;
그래서 다음과 같이 간단한 경보를 설정하십시오 :
Intent intent = new Intent(this, AlarmReceiver.class);
intent.setAction("SomeAction");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.setExact(AlarmManager.RTC_WAKEUP, targetTimeInMillis, pendingIntent);
새 AlarmManager 참조로 알람을 취소하는 데 사용할 수있는 새 PendingIntent 참조를 만드는 방법은 다음과 같습니다.
Intent intent = new Intent(this, AlarmReceiver.class);
intent.setAction("SomeAction");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, requestCode, intent, PendingIntent.FLAG_NO_CREATE);
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
if(pendingIntent != null) {
alarmManager.cancel(pendingIntent);
}
모든 Android 버전에서 정확한 알람 생성
시간이 지남에 따라 Android 시스템에 점점 더 많은 배터리 최적화가 AlarmManager
에 따라 AlarmManager
의 메소드 또한 크게 변경되었습니다 (더 관대 한 타이밍을 허용하기 위해). 그러나 일부 애플리케이션의 경우 모든 Android 버전에서 최대한 정확하게 수행해야합니다. 다음 도우미는 모든 플랫폼에서 사용 가능한 가장 정확한 방법을 사용하여 PendingIntent
를 예약합니다.
public static void setExactAndAllowWhileIdle(AlarmManager alarmManager, int type, long triggerAtMillis, PendingIntent operation) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
alarmManager.setExactAndAllowWhileIdle(type, triggerAtMillis, operation);
} else if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
alarmManager.setExact(type, triggerAtMillis, operation);
} else {
alarmManager.set(type, triggerAtMillis, operation);
}
}
API23 + Doze 모드가 AlarmManager와 충돌합니다.
Android 6 (API23)은 Doze 모드를 도입하여 AlarmManager를 방해합니다. 특정 유지 관리 창을 사용하여 경보를 처리하므로 setExactAndAllowWhileIdle()
을 사용 setExactAndAllowWhileIdle()
원하는 시점에 경보가 발 생하는지 확인할 수 없습니다.
휴대 전화 설정 ( Settings/General/Battery & power saving/Battery usage/Ignore optimizations
또는 유사)을 사용하여 앱의 동작을 끌 수 있습니다.
앱 내부에서이 설정을 확인할 수 있습니다 ...
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (pm.isIgnoringBatteryOptimizations(packageName)) {
// your app is ignoring Doze battery optimization
}
... 그리고 결국 각각의 설정 대화 상자를 보여줍니다 :
Intent intent = new Intent();
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);