如何在Android上运行无限服务(前台服务已终止)?

时间:2018-09-26 08:46:39

标签: android android-service

我创建了一个粘性的Foreground服务,该服务在每次被杀死时都重新启动,它似乎运行良好,但是我注意到在某些情况下(当操作系统将其杀死时),它不会重新启动。我如何才能使它每杀死一次就重新启动?我希望该服务始终运行。

I want it to run like those

像那些服务。

这是我在StartCommand上的前台服务:

# You also want to inherit from GroupManager, some code
# relies on extra stuff defined here

from django.contrib.auth.models import GroupManager

class DefaultGroupManager(GroupManager):    
    def get_queryset(self):
        tests_ids = Test.objects.values_list('virtual_group_id', flat=True)
        return super(DefaultGroupManager, self).get_queryset().exclude(id__in=tests_ids)


manager = DefaultManager()
manager.contribute_to_class(Group, "objects")
Group._meta.managers_map["objects"] = manager

这就是我在MainActivity onCreate()中调用服务的方式:

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

    Intent notificationIntent = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this,
            0, notificationIntent, 0);

    Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle("InsiteMobile Service")
            .setContentText("Run the app by clicking here")
            .setSmallIcon(R.drawable.ic_launcher)
            .setContentIntent(pendingIntent)
            .build();
    Log.i("InsiteMobileLog", "Service Started");
    startForeground(1, notification);

    //do heavy work on a background thread
    //stopSelf();

    return START_STICKY;
}

4 个答案:

答案 0 :(得分:1)

Android Oreo有一些关于服务的limitations。您可以查看此线程https://stackoverflow.com/a/47611385/4082934。 Evernote团队也很好地library谈到了与Android Oreo(API级别26)兼容的后台服务。 JobScheduler库使用JobInfo.Builder.setPeriodic(long intervalMillis,long flexMillis)方法提供定期服务。此服务的最短工作时间为15分钟。一些前台服务教程:

  1. https://blog.klinkerapps.com/android-o-background-services/
  2. https://medium.com/exploring-android/exploring-background-execution-limits-on-android-oreo-ab384762a66c

答案 1 :(得分:1)

目前,我正在从事需要在后台运行服务的同一项目。我们需要注意几件事
1.在 onDestroy()服务方法中,使用 startService Intent
重新启动自身 2.对于具有Kitkat及以下版本的操作系统,请在 onStartCommand()方法中使用 onTaskRemoved(intent);
3.在onStartCommand()

中返回 START_STICKY

然后,您还需要了解一件事,该设备​​的电话管理器倾向于根据电池优化策略杀死后台进程。 检查测试设备的电话管理器设置,然后重试。

此外,如果要使用通知使服务保持活动状态,则需要重新检查通过应用程序发送通知的权限。

答案 2 :(得分:0)

您不能创建始终在最新OS版本上运行的服务。但是您可以使用ForegroundService with notification,这是无法杀死的。原则是用户应该始终看到您的应用程序正在运行并且正在消耗OS资源。

答案 3 :(得分:0)

我也在做一个需要永生的服务的项目,因此您应该为此目的使用Job Scheduler。