4

我的任务是定期读取后端的手机传感器(例如 WiFi、加速度计)。

我目前的解决方案是使用 AlarmManager。

具体来说,我们有:

在“主”程序(一个活动)中,我们使用 PendingIntent.getService:

公共类主要扩展活动{
...
Intent intent = new Intent(this, AutoLogging.class);
mAlarmSender = PendingIntent.getService(this, 0, intent, 0);
上午 = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC, 0, 5*1000, mAlarmSender);
}

在“AutoLogging”程序(一项服务)中,我们会定期响应警报:

公共类 AutoLogging 扩展服务 {
...
@覆盖
公共无效 onCreate() {
   Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
}

@覆盖
公共无效 onDestroy() {
   super.onDestroy();
   Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
}

@覆盖
公共布尔onUnbind(意图意图){
   Toast.makeText(this, "onUnbind", Toast.LENGTH_SHORT).show()
   返回 super.onUnbind(intent);
}

@覆盖
公共无效onStart(意图意图,int startId){
   super.onStart(intent, startId);
   Toast.makeText(this, "onStart", Toast.LENGTH_SHORT).show();
   // 在此处读取传感器数据
}

@覆盖
   公共IBinder onBind(意图意图){
   Toast.makeText(this, "onBind", Toast.LENGTH_SHORT).show();
   返回空值;
}
}

我的问题是:

当我使用这个报警服务时,每次报警只调用 OnCreate 和 OnStart。

我的问题是:

(1)我们需要调用OnDestroy(或者onBind,onUnbind)吗?

(2)这是使用AlarmManager的正确方法(与“大写接收器”相比)吗?

谢谢!文森特

4

3 回答 3

0

AlarmManager 仅使用挂起的意图并执行意图操作,即在您的情况下启动服务。使用 onCreate(如果尚未运行)创建警报到期服务,然后通过调用 onStart 启动。读取完传感器数据后,您可以使用 stopSelf() 停止服务,该服务最终将调用 onDestroy()。您不应在服务中显式调用 onDestroy()、onBind() 或 onUnBind()。

如果您将广播接收器与警报管理器一起使用,则必须在接收器的 onReceive 中启动此服务。在这种情况下,使用服务似乎适合我。

于 2010-11-29T14:58:50.053 回答
0

任何偶然发现这一点的人都会迟到几年。

关于服务时调用哪个方法,请参见此处的帖子:

Android onCreate 或 onStartCommand 用于启动服务

您想在 onStartCommand 中触发。

于 2020-08-12T06:48:15.687 回答
0

如果您想在 android 中定期安排作业而不是使用警报管理器,您可以将 GCM 网络管理器与定期任务一起使用。这在内部使用警报管理器或作业调度程序,具体取决于 Android 版本。使用更灵活的选项也更容易使用。这篇文章很棒 - https://www.bignerdranch.com/blog/optimize-battery-life-with-androids-gcm-network-manager/

于 2019-02-11T03:48:48.750 回答