我有一个 GPS 服务,其工作是将坐标获取到服务器中。该服务假设 24/7 运行。但它以某种方式在两者之间被杀死。这仅在 android v 2.3 中发生。在 android v2.2 上运行良好。
在这个服务中,我使用“LocationManager”,它的方法“requestLocationUpdates”正在创建一个循环。这个循环负责获取坐标。所以我的目标是保持循环运行。
那么该怎么办,让服务运行 24/7。
我有一个 GPS 服务,其工作是将坐标获取到服务器中。该服务假设 24/7 运行。但它以某种方式在两者之间被杀死。这仅在 android v 2.3 中发生。在 android v2.2 上运行良好。
在这个服务中,我使用“LocationManager”,它的方法“requestLocationUpdates”正在创建一个循环。这个循环负责获取坐标。所以我的目标是保持循环运行。
那么该怎么办,让服务运行 24/7。
This server suppose to be run 24/7
你不能那样做。正如您所发现的,这在任何真正意义上的术语中都是不可能的。这也不是一个好的设计选择。
如果您绝对需要它一直运行,则需要获取PARTIAL_WAKE_LOCK
via PowerManager
。这将使 CPU 始终保持开启状态,并使您的程序运行。为电池寿命的惊人下降做好准备。
而是使用AlarmManager。您可以通过 AlarmManager安排PendingIntent ,它会在相关时间点启动服务以完成工作。完成后,再次终止服务。
下面是一个示例代码,展示了如何使用 AlarmManager,它将在 5 分钟后启动启动 YourService 的意图:
// get a calendar with the current time
Calendar cal = Calendar.getInstance();
// add 5 minutes to the calendar object
cal.add(Calendar.MINUTE, 5);
Intent intent = new Intent(ctx, YourService.class);
PendingIntent pi = PendingIntent.getService(this, 123, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pi);
请使用在给定时间段后启动您的服务的重复警报管理器
private void setAlarm() {
AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(getApplicationContext(), LocationUpdateService.class);
intent.putExtra("locationSendingAlarm", true);
PendingIntent pendingIntent = PendingIntent.getService(this, AppConstants.PENDING_INTENET_LOCATION_SENDING_ALARM_ID, intent,0);
try {
alarmManager.cancel(pendingIntent);
} catch (Exception e) {
}
int timeForAlarm=5*1000*60; // 5 minutes
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+timeForAlarm, timeForAlarm,pendingIntent);
}