Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓KitKat 4.4终止了Alarm Manager启动的我的服务_Android_Service_Alarmmanager_Android 4.4 Kitkat_Kill Process - Fatal编程技术网

Android 安卓KitKat 4.4终止了Alarm Manager启动的我的服务

Android 安卓KitKat 4.4终止了Alarm Manager启动的我的服务,android,service,alarmmanager,android-4.4-kitkat,kill-process,Android,Service,Alarmmanager,Android 4.4 Kitkat,Kill Process,我对Android KitKat和Alarm Manager有一个大问题 我所有的应用程序都使用一个始终在后台运行的服务,而不需要Android kill 在Android 4.4 KitKat之前,我找到的解决方案是通过AlarmManager触发的广播接收器启动服务 ... Intent intent = new Intent(c, MyReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(c,

我对Android KitKat和Alarm Manager有一个大问题

我所有的应用程序都使用一个始终在后台运行的服务,而不需要Android kill

在Android 4.4 KitKat之前,我找到的解决方案是通过AlarmManager触发的广播接收器启动服务

...

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);
     }

}
。。。
Intent Intent=新Intent(c,MyReceiver.class);
PendingEvent PendingEvent=PendingEvent.getBroadcast(c,0,intent,PendingEvent.FLAG_ONE_SHOT);
AlarmManager am=(AlarmManager)c.getSystemService(Context.ALARM\u服务);

Android Kitkat版本的if(Build.VERSION.SDK_INT)

如果您的应用程序使用AlarmManager。。。 当您将应用程序的targetSdkVersion设置为“19”或更高版本时,使用set()或setRepeating()创建的报警将不准确

为了提高电源效率,Android现在将所有应用程序中在合理相似的时间出现的警报集中在一起,这样系统将唤醒设备一次,而不是多次来处理每个警报

如果您的闹钟与确切的时钟时间没有关联,但在特定的时间范围内(例如下午2点到4点之间)调用闹钟仍然很重要,那么您可以使用新的setWindow()方法,该方法接受闹钟的“最早”时间和“窗口”系统应调用警报的最早时间之后的时间

如果必须将闹钟固定到精确的时钟时间(例如日历事件提醒),则可以使用新的setExact()方法

这种不精确的批处理行为仅适用于已更新的应用程序。如果您已将targetSdkVersion设置为“18”或更低,则在Android 4.4上运行时,您的警报将继续像以前版本一样运行

原始资料来源:

在kitkat中,使用下面的代码段自动重新启动te服务:

@Override
public void onTaskRemoved(Intent rootIntent) {
    // TODO Auto-generated method stub
    Intent restartService = new Intent(getApplicationContext(),
            this.getClass());
    restartService.setPackage(getPackageName());
    PendingIntent restartServicePI = PendingIntent.getService(
            getApplicationContext(), 1, restartService,
            PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +1000, restartServicePI);

}

因此,没有Android KitKat就无法让我的服务运行。对吗?也许我来晚了,你为什么不使用START STICKY?还可以使用traceview优化你的服务。后台服务获取的问题与AlarmManager没有具体关系。请参阅以下问题,忽略我之前的评论。看看这个问题回答: