我有一项任务是定期读取后端的手机传感器(例如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 receiver”相比)吗?
谢谢!文森特
1 回答
AlarmManager只使用挂起的意图并执行意图操作,即在您的情况下启动服务 . 使用onCreate创建警报到期服务(如果它尚未运行),然后通过调用onStart启动 . 读完传感器数据后,可以使用stopSelf()停止服务,最终调用onDestroy() . 不应该在服务中显式调用onDestroy(),onBind()或onUnBind() .
如果您使用带有警报管理器的广播接收器,您必须在接收器的onReceive上启动此服务 . 在这种情况下,使用服务似乎是合适的 .