定期运行任务,*即使设备处于空闲状态*

时间:2016-08-18 09:35:43

标签: android

我正在编写一个应用程序,它应该每隔10秒左右收集一些传感器数据并将其写入磁盘。

到目前为止,我有一个启动服务的Activity。该服务具有runnable,它使用处理程序通过handler.postDelayed()定期运行我的任务。请参阅下面的(缩短的)代码。

到目前为止,只要设备处于活动状态,这样就可以正常运行。一旦设备进入空闲状态,它就不会运行我的任务,直到它再次唤醒。

所以,我的问题是如何始终运行我的任务。

使用setExactAndAllowWhileIdle(),AlarmManager似乎提供了我需要的东西,但是......

  

为减少滥用行为,对特定应用程序的警报响应频率有限制。在正常的系统操作下,它不会大约每分钟发送这些警报(此时会发送每个这样的待处理警报);当处于低功率空闲模式时,此持续时间可能会明显更长,例如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);
    }

}

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找的是STICKY SERVICE。

Officail Docs:如果系统在onStartCommand()返回后终止服务,则重新创建服务并调用onStartCommand(),但不要重新传递最后一个意图。相反,系统使用null intent调用onStartCommand(),除非有待启动的意图来启动服务,在这种情况下,这些意图被传递。这适用于不执行命令但无限期运行并等待工作的媒体播放器(或类似服务)。

你只需要在调用服务时传递一个标志。