的Android AlarmManager发出的定期传感器读数

问题描述 投票:1回答:2

我有任务在后台定期读取手机传感器(例如,WiFi,加速器)。

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

具体来说,我们有:

在“主”计划(活动),我们使用PendingIntent.getService:

public class Main extends Activity {
...
Intent intent = new Intent(this, AutoLogging.class);
mAlarmSender = PendingIntent.getService(this, 0, intent, 0);
am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC, 0, 5*1000, mAlarmSender);
}

在“自动记录”程序(服务),我们定期报警响应:

public class AutoLogging extends Service {
...
@Override
public void onCreate() {
   Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
}

@Override
public void onDestroy() {
   super.onDestroy();
   Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
}

@Override
public boolean onUnbind(Intent intent) {
   Toast.makeText(this, "onUnbind", Toast.LENGTH_SHORT).show()
   return super.onUnbind(intent);
}

@Override
public void onStart(Intent intent, int startId) {
   super.onStart(intent, startId);
   Toast.makeText(this, "onStart", Toast.LENGTH_SHORT).show();
   // Read sensor data here
}

@Override
   public IBinder onBind(Intent intent) {
   Toast.makeText(this, "onBind", Toast.LENGTH_SHORT).show();
   return null;
}
}

我的问题是:

当我使用这个报警服务,只有在OnCreate和OnStart中被称为在每个警报。

我的问题是:

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

(2)这是使用AlarmManager(用“broadcase接收器”相比),正确的方法是什么?

谢谢!文森特

android alarmmanager
2个回答
0
投票

AlarmManager只使用挂起的意图和执行的意图动作,即开始服务于您的case.On报警期满服务使用的onCreate(如果它尚未运行)被创建,然后通过调用在onStart启动。你读完传感器数据之后,可以停止使用stopSelf(),这将最终调用的onDestroy()的服务,你不应该调用的onDestroy(),onBind()或onUnBind()明确的服务。

如果您使用的广播接收器与报警经理,你必须开始在receiver.Using服务的onReceive这项服务似乎是适当的我在这种情况下。


0
投票

如果您想安排在android系统工作周期,而不是通过报警的经理,你可以使用GCM网络管理与周期性任务。这在内部使用取决于Android版本的警报管理器或作业调度程序。它也更容易与更灵活的选项来使用。这篇文章是伟大的 - https://www.bignerdranch.com/blog/optimize-battery-life-with-androids-gcm-network-manager/

© www.soinside.com 2019 - 2024. All rights reserved.