我正在编写一个应用程序,它应该每隔10秒左右收集一些传感器数据并将其写入磁盘。
到目前为止,我有一个启动服务的Activity。该服务具有runnable,它使用处理程序通过handler.postDelayed()
定期运行我的任务。请参阅下面的(缩短的)代码。
到目前为止,只要设备处于活动状态,这样就可以正常运行。一旦设备进入空闲状态,它就不会运行我的任务,直到它再次唤醒。
所以,我的问题是如何始终运行我的任务。
使用setExactAndAllowWhileIdle()
,AlarmManager似乎提供了我需要的东西,但是......
为减少滥用行为,对特定应用程序的警报响应频率有限制。在正常的系统操作下,它不会大约每分钟发送这些警报(此时会发送每个这样的待处理警报);当处于低功率空闲模式时,此持续时间可能会明显更长,例如15分钟。
电池续航时间只是次要优先考虑,但不会觉醒,整个时间都没问题。 (不确定android是否可以在一秒左右醒来)
...
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));
}
....
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");
}
}
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 :(得分:0)
我认为您正在寻找的是STICKY SERVICE。
Officail Docs:如果系统在onStartCommand()返回后终止服务,则重新创建服务并调用onStartCommand(),但不要重新传递最后一个意图。相反,系统使用null intent调用onStartCommand(),除非有待启动的意图来启动服务,在这种情况下,这些意图被传递。这适用于不执行命令但无限期运行并等待工作的媒体播放器(或类似服务)。
你只需要在调用服务时传递一个标志。