ハマった。アプリケーションが起動したら、以前に設定したアラームが有効かどうかを確認したいと思います。そうでない場合は、設定します。
このソリューション を参照しました。私はこのように意図を一致させようとしています:
Intent intent = new Intent();
intent.setAction("com.vit.upload");
PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE);
しかし、それは機能しません。他に何がうまくいきますか?
まず最初に、以前に作成したアラームにアクセスする方法に関する小さなチュートリアル:
次のような一意のIDでアラームを作成することにより、アラームを区別できます。
_Intent intent = new Intent(this, AlarmReceiverActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,UNIQUE_ID_GOES_HERE, intent, 0);
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi);
_
このアラームにアクセスする場合は、同じPendingIntentを同じ一意のIDで作成する必要があります。たとえば、次はPendingIntent id 1234で作成したアラームにのみアクセスします。次に、以前のアラームをキャンセルしてリセットします。
_Intent intent = new Intent(this, AlarmReceiverActivity.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 1234, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi);
_
アイデアは簡単です。 IDを追跡し、それらを使用してそれぞれのアラームにアクセスします。同じIDで複数のアラームを作成すると、最新のアラームが以前のアラームをキャンセルします。
主な問題については、アプリケーションを起動するたびにアラームがアクティブかどうかを確認する代わりに、アクティビティのonCreate()
メソッドでアラームを再設定するだけです。上記と同じPendingIntentを使用します。これにより、以前にアラームが設定されているかどうかを確認する手間が省けます。アラームを維持することを目的としているため、アプリケーションを起動するたびに以前に設定したアラームを上書きしても問題はありません。同じIDを使用してPendingIntentを作成するようにしてください。
アラームがすぐにトリガーされる過去の時間にアラームを設定しようとしないように、アラームの時間がすでに経過しているかどうかを確認することを忘れないでください。
別のケースを考えてみましょう:デバイスをオフにすると、すべてのアラームがキャンセルされます。これにより、再起動時に再度設定するしか選択肢がなくなります。これを行うには、 BroadcastReceiver を使用する必要があります。
この答え はその方法を説明します。上記のようにBroadcastReceiverのonReceive()メソッドでアラームを再作成するだけです。
Androidの保留中のインテントは一意のIDを使用します
int REQUEST_CODE=2344; // Unique ID
PendingIntent pIntent = PendingIntent.getBroadcast(context, REQUEST_CODE, intent, PendingIntent.FLAG_NO_CREATE);
システムの再起動時にブートレシーバーブロードキャストを使用してから、同じリクエストコードREQUEST_CODE=2344;
でalaramを再作成する必要があります
基本的に私の経験から、同じインテントと FLAG_UPDATE_CURRENT を使用すると、同じインテントに2つのアラームが設定されないことが確実になります。また、get関数で使用される FLAG_NO_CREATE をよく見て、記述されたインテントを持つpendingintentが既に存在する場合はnullを返します。
また、区別できるため、保留中のインテントには同じリクエストIDを使用してください。
here の情報に基づいて、アラームが存在するかどうかを直接確認するための呼び出しはないようですが、回避策がいくつかあります。