私のアプリケーションの目的は、位置情報の更新を 20 分ごとに保存することです。
サービスを使用しましたが、正常に機能しましたが、画面をロックしたり、自動的にロックされたりすると、サービスの実行が停止します。ロックを解除すると、サービスが再び実行されます。
私のコードでハイライト:
サービス()
onCreat(){
call timer();
}
timer(){
code
}
すべての条件で常にコードを実行するにはどうすればよいですか?
私のアプリケーションの目的は、位置情報の更新を 20 分ごとに保存することです。
サービスを使用しましたが、正常に機能しましたが、画面をロックしたり、自動的にロックされたりすると、サービスの実行が停止します。ロックを解除すると、サービスが再び実行されます。
私のコードでハイライト:
サービス()
onCreat(){
call timer();
}
timer(){
code
}
すべての条件で常にコードを実行するにはどうすればよいですか?
はい、AlarmManager を使用して、たとえば以下のように setRepeating を使用して 10 分ごとにサービスを開始します。サービスのタイマーを取り除き、サービスが oncreate または onCommand で開始から完了までタスクを実行できるようにします。
int SECS = 1000;
int MINS = 60 * SECS;
Calendar cal = Calendar.getInstance();
Intent in = new Intent(context, YourService.class);
PendingIntent pi = PendingIntent.getService(context, 0, in, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarms = (AlarmManager)context.getSystemService(
Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
10 * MINS, pi);
ボタンから onclick ハンドラーにこのコードを含めるアクティビティを作成して、サービスを開始できます。起動時に実行したい場合は、デバイスが起動したときに通知されるブロードキャストレシーバーにこれを配置する必要がありますが、それ自体は別のトピックです。
デバイスがスリープ状態のときにサービスとタイマーが機能しない理由は、CPU がオフになっていて、コードにウェイク ロックがないためです。AlarmManager は、サービスを実行するために CPU をわずかに起動します。
デバイスのウェイクアップを含め、サービスがスケジュールに基づいて動作するように調整する正しい方法 (例: "call timer()") は、おそらく myまたは類似のものとAlarmManager
一緒にを使用することです。WakefulIntentService