我有任务在后台定期读取手机传感器(例如,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接收器”相比),正确的方法是什么?
谢谢!文森特
AlarmManager只使用挂起的意图和执行的意图动作,即开始服务于您的case.On报警期满服务使用的onCreate(如果它尚未运行)被创建,然后通过调用在onStart启动。你读完传感器数据之后,可以停止使用stopSelf(),这将最终调用的onDestroy()的服务,你不应该调用的onDestroy(),onBind()或onUnBind()明确的服务。
如果您使用的广播接收器与报警经理,你必须开始在receiver.Using服务的onReceive这项服务似乎是适当的我在这种情况下。
如果您想安排在android系统工作周期,而不是通过报警的经理,你可以使用GCM网络管理与周期性任务。这在内部使用取决于Android版本的警报管理器或作业调度程序。它也更容易与更灵活的选项来使用。这篇文章是伟大的 - https://www.bignerdranch.com/blog/optimize-battery-life-with-androids-gcm-network-manager/