我的任务是定期读取后端的手机传感器(例如WiFi,加速度计)。
我目前的解决方案是使用AlarmManager。
具体来说,我们有:
在“main”程序(活动)中,我们使用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 receiver”相比)吗?
谢谢! 文森特
答案 0 :(得分:0)
AlarmManager只使用挂起的意图并执行意图操作,即在您的情况下启动服务。使用onCreate创建警报到期服务(如果它尚未运行),然后通过调用onStart启动。读完传感器数据后,可以使用stopSelf()停止服务,最终调用onDestroy()。不应该在服务中显式调用onDestroy(),onBind()或onUnBind()。
如果您使用带闹钟管理器的广播接收器,您必须在接收器的onReceive上启动此服务。在这种情况下,使用服务似乎是合适的。
答案 1 :(得分:0)
如果您要定期在android中安排作业,而不是使用警报管理器,则可以将GCM网络管理器用于定期任务。这在内部使用警报管理器或作业调度程序,具体取决于Android版本。使用更灵活的选项也更容易使用。 这篇文章很棒- https://www.bignerdranch.com/blog/optimize-battery-life-with-androids-gcm-network-manager/
答案 2 :(得分:0)
偶然发现这个问题的人迟到了数年。
关于何时在服务中调用哪种方法,请参见此处:
Android onCreate or onStartCommand for starting service
您要在onStartCommand中触发。