要求是每90秒记录一次位置并将其写入数据库(sqlite),如果网络可用,则调用api,即使应用程序已关闭。 这将是实现这一目标的最佳方式? 我应该开始一个意向服务吗?或者我应该去报警管理器。我已经读过某个地方,只有在持续时间超过10分钟的情况下才能使用警报管理器。
答案 0 :(得分:4)
我建议使用AlarmManager,因为即使设备处于睡眠状态,它也可以运行。 请注意,对于API v> 19,警报传递不精确,你必须使用setExact api来实现。 参见
注意:从API 19开始,传递给此方法的触发时间被视为不精确:警报将不会在此时间之前传递,但可能会延迟并在稍后传递。操作系统将使用此策略在整个系统中将警报“批处理”在一起,从而最大限度地减少设备需要“唤醒”并最大限度地减少电池使用的次数。一般而言,只要在将来安排的警报,就不会延迟在不久的将来安排的警报。 采用新的配料政策,交货订单保证不像以前那么强大。如果应用程序设置了多个警报,则这些警报的实际交付顺序可能与其请求的交付时间的顺序不匹配。如果您的应用程序具有强大的订购要求,则可以使用其他API来获取必要的行为;请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。
答案 1 :(得分:1)
报警管理器将是您的理想选择。设备处于睡眠状态时会保留已注册的警报,但如果已关闭并重新启动,则会清除此警报。 因此,您可以使用它以90秒的间隔运行您的工作。它可能仅在设备重新启动后第一次中断间隔。
答案 2 :(得分:1)
我发现的另一种方法是使用Firebase作业调度程序。对于在棉花糖上运行或进一步运行的设备,这是最佳选择。它易于集成和定制。 https://github.com/firebase/firebase-jobdispatcher-android
答案 3 :(得分:0)
服务是一个可以执行长时间运行的应用程序组件 在后台运行并且不提供用户界面。
https://developer.android.com/guide/components/services.html
警报管理器适用于您想要的情况 应用程序代码在特定时间运行,即使您的应用程序是 目前没有运行。 只要报警,报警管理器就会保持CPU唤醒锁定 接收者的onReceive()方法正在执行。这保证了 在完成广播处理之后,手机才会睡眠。
https://developer.android.com/reference/android/app/AlarmManager.html
使用该服务。
答案 4 :(得分:0)
您使用Intent服务和Broadcastreceiver组件,因为即使您关闭应用程序,这些组件也只能连续监听。
你希望得到一些90秒的东西,所以使用Alarm Manager。
AlarmManager manager = (AlarmManager) (context)
.getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(context, YourAlarmReceuver.class);
//alarmIntent.putExtra("syncData", favoritesArrayList);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis(), 90*1000, pendingIntent);
您的Receiver类喜欢这个
public class SyncAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent stIntent = new Intent(context,
YourService.class);
context.startService(stIntent);
}
和你的意图服务类一样
public class DataSyncService extends IntentService {
public DataSyncService() {
super(DataSyncService.class.getName());
// TODO Auto-generated constructor stub
}
@Override
protected void onHandleIntent(Intent intent) {
//write your logic here
// get the location and update the database
}
}
您还应该实例化警报管理器启动。