サーチ…


インテントを後で実行する

  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のメソッドも(寛大なタイミングを可能にするために)大幅に変更されています。しかし、一部のアプリケーションでは、すべての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);


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow