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
のメソッドも(寛大なタイミングを可能にするために)大幅に変更されています。しかし、一部のアプリケーションでは、すべてのAndroidバージョンでできるだけ正確にする必要があります。次のヘルパーは、すべてのプラットフォームで使用可能な最も正確なメソッドを使用して、 PendingIntent
をスケジュールし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()
を使用しても、必要な時点でアラームが発生することを確認することはできません。
あなたの携帯電話の設定( 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);