当我清除所有最新应用时,Android系统终止了我的服务

zam*_*mim 12 service android

我已经startforeground()在我用了Service,但是Service当我清除所有最近的应用程序时,Android一直在杀死我.

这是我的服务代码:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Notification notification = new NotificationCompat.Builder(this)
            .setContentTitle("Text")
            .setTicker("Text")
            .setContentText("Text")
            .setSmallIcon(R.drawable.icon)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon))
            .build();

    startForeground(100, notification);

    return START_STICKY;
}
Run Code Online (Sandbox Code Playgroud)

我用这段代码做错了吗?

S.D*_*.D. 19

长时间运行的服务需要以下内容才能使其不太可能被终止:

  1. START_STICKY从... 返回onStartCommand().有了这个,系统将重新启动服务,即使必须停止资源限制.

  2. 当服务未绑定到任何UI组件(例如,活动)时,服务必须通过显示前景通知进入前台模式.前台服务不太可能被系统终止.

  3. "stopWithTask"=false<service>清单文件的相应标记中设置属性.

此外,请注意,由于自定义,某些制造商的设备即使具有上述属性也会终止服务:

  1. 自定义任务经理.
  2. 节电功能可以禁止非系统服务.

一些应用程序服务需要保持在后台,并且必须积极地保持活力.虽然不建议使用此方法,但可以执行以下步骤:

  1. 添加服务启动触发器:例如Boot Complete和Network Connected broadcasts.

  2. 如果服务FLAG_RECEIVER_FOREGROUND在意图中接收意图/广播.

  3. 一种极端的手段是在调用时手动调度服务重启的待定意图.AlarmManageronTaskRemoved()

另见,见:

  1. START_STICKY无法在Android KitKat上运行


小智 7

Android系统可以在他们想要停止维持设备性能或功耗时随时停止服务.Android系统有很多情况可以停止你的服务,如电池电量不足,app长时间不处于活动状态,设备处于休眠模式,省电模式等.

我开发了一个技巧或黑客(你可以这么说)使用没有人可以阻止你的服务(Android系统,第三方应用程序,用户).

注意:使用此功能,您的服务永远不会停止,也可能耗尽电池电量.

请按照以下步骤操作: -

1)在onStartCommand中返回START_STICKY.

2)然后修改服务中的onDestroy()和onTaskRemoved()方法,如下所示:

@Override
public void onDestroy() {
    super.onDestroy();
    Toast.makeText(getApplicationContext(), "Service Task destroyed", Toast.LENGTH_LONG).show();


    Intent myIntent = new Intent(getApplicationContext(), YourService.class);

    PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0);

    AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();

    calendar.setTimeInMillis(System.currentTimeMillis());

    calendar.add(Calendar.SECOND, 10);

    alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

  Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show();

}




@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);


        Intent myIntent = new Intent(getApplicationContext(), YourService.class);

        PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0);

        AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE);

        Calendar calendar = Calendar.getInstance();

        calendar.setTimeInMillis(System.currentTimeMillis());

        calendar.add(Calendar.SECOND, 10);

        alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

        Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show();


    }




@Override

    public int onStartCommand(Intent intent, int flags, int startId) {
     Toast.makeText(getApplicationContext(), "Service Starts", Toast.LENGTH_SHORT).show();
        return START_STICKY;
    }
Run Code Online (Sandbox Code Playgroud)

每当服务停止时(通过android系统或用户手动),我每次都会在10秒内使用PendindIntent重启服务.