수색…


나중에 인 텐트를 실행하십시오.

  1. 수신자를 만듭니다. 이 수업은 의도를 받아들이고 원하는 방식으로 처리합니다.
public class AlarmReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        // Handle intent
        int reqCode = intent.getExtras().getInt("requestCode");
        ...
    }
}
  1. 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);


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow