Android KitKat和Alarm Manager存在很大问题 .
我的所有应用程序都使用一个始终在后台运行的服务,而不会杀死Android .
在Android 4.4 KitKat之前,我发现解决方案是通过AlarmManager触发的BroadcastReceiver启动服务 .
...
Intent intent = new Intent(c, MyReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(c, 0, intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager am = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);
if (Build.VERSION.SDK_INT<Build.VERSION_CODES.KITKAT) {
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pendingIntent);
} else {
setAlarmFromKitkat(am, System.currentTimeMillis(), pendingIntent);
}
...
@TargetApi(19)
private static void setAlarmFromKitkat(AlarmManager am, long ms, PendingIntent pi){
am.setExact(AlarmManager.RTC_WAKEUP, ms, pi);
}
...
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, MyService.class);
context.startService(service);
}
}
在Android 4.4 KitKat上通过这个解决方案我可以开始服务但是经过一段时间Android杀了它!
有没有办法在没有Android 4.4 KitKat杀死它的情况下让后台工作?
非常感谢
2 回答
对于Android Kitkat版本
如果您的应用使用AlarmManager ...
将应用程序的targetSdkVersion设置为“19”或更高时,使用set()或setRepeating()创建的警报将不准确 .
为了提高电源效率,Android现在将来自所有应用程序的警报进行批处理,这些警报发生在相当类似的时间,因此系统会唤醒设备一次,而不是多次处理每个警报 .
如果您的闹钟与确切的时钟时间无关,但在特定时间范围内(例如下午2点到4点之间)调用闹钟仍然很重要,那么您可以使用新的setWindow()方法,该方法接受“最早的“警报时间”和系统调用警报的最早时间之后的“窗口”时间 .
如果您的闹钟必须固定到确切的时钟时间(例如日历事件提醒),那么您可以使用新的setExact()方法 .
这种不精确的批处理行为仅适用于更新的应用程序 . 如果您将targetSdkVersion设置为“18”或更低,则在Android 4.4上运行时,您的警报将继续像以前的版本一样运行 .
原始来源:http://developer.android.com/about/versions/android-4.4.html
在kitkat中,使用下面的代码片段自动重启te服务: