10秒ごとにセンサデータを収集してディスクに書き込むアプリケーションを作成しています。デバイスがアイドル状態であっても、定期的にタスクを実行する*
これまでのところ、私はサービスを開始するアクティビティを持っています。サービスには実行可能ファイルがあり、ハンドラを使用してタスクを定期的にhandler.postDelayed()
で実行します。 (短縮された)コードについては以下を参照してください。
これまでのところ、このデバイスはアクティブな限りとして正常に動作します。デバイスがアイドル状態になるとすぐに、デバイスが再び起動するまで私のタスクは実行されません。
私の質問は、いつも自分の仕事をどのように実行するかです。虐待を減らすためにsetExactAndAllowWhileIdle()
で
、AlarmManagerは私が必要とする正確に何を提供するようだが、...
、これらのアラームは、特定のアプリケーションのために消灯する頻度に制限があります。通常のシステム運用では、約1分以上かかるアラームはディスパッチされません(そのような保留中のアラームが送信されるたびに)。低電力アイドルモードの場合、この持続時間は15分といったようにかなり長くなります。
バッテリーの寿命はほんのわずかですが、目が覚めていなくても大丈夫です。私は何を考える(Androidはこれだけ秒かのために目を覚ましことができるかどうかわからない)
MyActivity
...
public void onStartService(View view) {
Intent i= new Intent(getBaseContext(), MyAppService.class);
getBaseContext().startService(i);
}
public void onStopService(View view) {
stopService(new Intent(getBaseContext(), MyAppService.class));
}
....
たMyService
public class MyAppService extends Service {
MyRunnable mr;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mr= new MyRunnable(getApplicationContext());
mr.Start();
return Service.START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
mr.Stop();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
MyRunnable
public class MyRunnable implements Runnable{
// context is needed for sensorListener (?)
private Context myContext;
private Handler handler;
public MyRunnable(Context c){
myContext=c;
handler= new Handler();
}
public void Start(){
run();
}
public void Stop(){
handler.removeCallbacks(this);
// some clean-up
}
@Override
public void run() {
//acquire and write to file some sensor data
handler.postDelayed(this, 10000);
}
}
これがMarshmellow Dozeについてのものなら、あなたはこれを読むことができます:バッテリーの例外を作成するには、http://stackoverflow.com/documentation/android/1361/alarmmanager/14777/api23-doze-mode-interferes-with-armarmmanagerアプリの最適化しかし、これがアラームの最小間隔に影響するかどうかはわかりません... – devnull69
@ devnull69:興味深いことに、これはAlarmManagerが許す最大レートには影響しないと私は考えています。 – sweber