我创建了一个粘性的Foreground服务,该服务在每次被杀死时都重新启动,它似乎运行良好,但是我注意到在某些情况下(当操作系统将其杀死时),它不会重新启动。我如何才能使它每杀死一次就重新启动?我希望该服务始终运行。
像那些服务。
这是我在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;
}
答案 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 :(得分:1)
目前,我正在从事需要在后台运行服务的同一项目。我们需要注意几件事
1.在 onDestroy()服务方法中,使用 startService Intent
重新启动自身
2.对于具有Kitkat及以下版本的操作系统,请在 onStartCommand()方法中使用 onTaskRemoved(intent);
3.在onStartCommand()
然后,您还需要了解一件事,该设备的电话管理器倾向于根据电池优化策略杀死后台进程。 检查测试设备的电话管理器设置,然后重试。
此外,如果要使用通知使服务保持活动状态,则需要重新检查通过应用程序发送通知的权限。
答案 2 :(得分:0)
您不能创建始终在最新OS版本上运行的服务。但是您可以使用ForegroundService with notification,这是无法杀死的。原则是用户应该始终看到您的应用程序正在运行并且正在消耗OS资源。
答案 3 :(得分:0)
我也在做一个需要永生的服务的项目,因此您应该为此目的使用Job Scheduler。