AlarmManagerに問題があります。繰り返しアラームをスケジュールするコードを設定し、アプリケーションを実行した後にアラームが正常に実行されます。ホームボタンをクリックしてもアプリケーションが一時停止しても、アラームはその間隔で実行されます。アプリケーションを閉じた後にAndroidアラームがキャンセルされる
問題は、タスクマネージャを開いて強制的にアプリケーションを閉じるとアラームが実行されなくなることです。
これは正常な動作ですか?これを回避し、アプリケーションを終了した後にアラームを作動させ続ける方法はありますか?
コードは以下のとおりです。メソッドはApplicationContextクラスのonCreate()によって呼び出されます。
private void scheduleAlarm() {
if (alarmScheduled == true) { return; } // we only need to schedule once.
int alarmInterval = Def.pref(getApplicationContext()).getInt("alarmInterval", 30);
final Intent intent = new Intent(getApplicationContext(), CollectorAlarmReceiver.class);
final PendingIntent pending = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
AlarmManager alarmMgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmMgr.cancel(pending); // cancel others.
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000,
alarmInterval*1000, pending);
Def.log(TAG,"scheduleAlarm(): alarm scheduled, interval: "+alarmInterval+" seconds");
alarmScheduled = true;
}
レシーバーコード:
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "CollectorAlarmReceiver invoked, starting CollectorService in background");
context.startService(new Intent(context, CollectorService.class));
Intent collectorService = new Intent(context,CollectorService.class);
collectorService.putExtra("action", CollectorService.ACTION_BACKGROUND_REQUEST_MESSAGES);
context.sendBroadcast(collectorService);
}
ありがとう!
レシーバコードとalarmIntervalの例を投稿できますか? – ninjasense
私はReceiverのコードを掲載しました。 alarmIntervalは30秒です。 onReceiveにログがあることがわかるので、Receiverが呼び出されたときに追跡できます。そして、アプリケーションを実行している間、正常に動作し、問題は、それが閉じているときです。 –
システムのデフォルトクロックにアラームクロックを設定しないのはなぜですか?その後、タスクマネージャーによってそれを殺して、あなたのアプリのように動作するかどうかを確認します。それもあなたに警戒することができない場合。私はそれがあなたのアプリのために大丈夫だと思うし、あなたは何もする必要はありません。 –