2016-08-18 3 views
0

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); 
    } 

} 
+0

これがMarshmellow Dozeについてのものなら、あなたはこれを読むことができます:バッテリーの例外を作成するには、http://stackoverflow.com/documentation/android/1361/alarmmanager/14777/api23-doze-mode-interferes-with-armarmmanagerアプリの最適化しかし、これがアラームの最小間隔に影響するかどうかはわかりません... – devnull69

+0

@ devnull69:興味深いことに、これはAlarmManagerが許す最大レートには影響しないと私は考えています。 – sweber

答えて

0

探しているのはスティックサービスです。

オフィシャルドキュメント:onStartCommand()が返った後にシステムがサービスを終了する場合、サービスを再作成してonStartCommand()を呼び出しますが、最後のインテントは再配信しません。代わりに、システムは、サービスを開始するための保留中のインテントが存在しない限り、そのインテントが配信される場合を除いて、onStartCommand()をnullインテントで呼び出します。これは、コマンドを実行していないが、無限に実行され、ジョブを待っているメディアプレーヤー(または同様のサービス)に適しています。

サービスを呼び出すときにフラグを渡すだけで済みます。

+0

ありがとうございます。ドキュメントで言うように:サービスは、アンドロイドが他のタスクのためのリソースを必要とするなら、殺すことができます。スティッキーサービスは殺される可能性が低く、そうであれば後でシステムを再作成します。私のサービスは殺されず、ただ眠ります。 (私のサービスは、起動時に新しいファイルを作成し、タイムスタンプ付きのファイルをすべてそのファイルに書き込みます。ギャップがあるファイルが1つあります。サービスが終了すると、再起動ごとに1つのファイルが作成されます) – sweber

関連する問題