我们有一个应用程序,几乎总是使用前台服务,并在系统托盘上使用通知进行正常初始化。该应用程序简单地依赖于这个服务。在我们测试的每个设备上,即使任务被移除,服务仍然保持运行状态,但在小米设备上,在从最近列表中滑动后,服务突然停止,然后根据ActivityManager重新打开服务的方式再次启动。我们从小米设备(例如小米MI9)获取以下日志:
“计划重启已崩溃的服务:com.example.myapp/.MyService在1000毫秒内”
这不应该发生,但确实发生了。每次我们打开并从最近列表中关闭应用程序时,“1000ms”部分都会增加到“4000ms、16000ms、64000ms”等等。我认为它没有限制,64秒对于关键的前台服务来说已经太长了。因此,我正在寻找将我们的应用程序添加为例外或其他内容的方法,但我找到的唯一内容是这个:https://dontkillmyapp.com/xiaomi 如果应用程序在最近屏幕上使用“X”按钮被杀死,那么情况会更糟,因为我注意到设备会杀死所有服务并安排它们在10秒间隔内重新启动。我认为我们的服务安排在3个小时后启动,这破坏了应用程序的目的。
我们现在使用的解决方案是警告用户此问题并重定向到此链接,以将我们的应用程序添加到例外项中,启用自动启动等。但是,我们知道几乎没有人会这样做,因此我们正在寻找可以通过编程方式实现的解决方案。
下面是演示如何在清单中注册服务以及如何启动它的一些代码。(演示比原始代码简单,但描述了主要逻辑。)
发布通知部分:
“计划重启已崩溃的服务:com.example.myapp/.MyService在1000毫秒内”
这不应该发生,但确实发生了。每次我们打开并从最近列表中关闭应用程序时,“1000ms”部分都会增加到“4000ms、16000ms、64000ms”等等。我认为它没有限制,64秒对于关键的前台服务来说已经太长了。因此,我正在寻找将我们的应用程序添加为例外或其他内容的方法,但我找到的唯一内容是这个:https://dontkillmyapp.com/xiaomi 如果应用程序在最近屏幕上使用“X”按钮被杀死,那么情况会更糟,因为我注意到设备会杀死所有服务并安排它们在10秒间隔内重新启动。我认为我们的服务安排在3个小时后启动,这破坏了应用程序的目的。
我们现在使用的解决方案是警告用户此问题并重定向到此链接,以将我们的应用程序添加到例外项中,启用自动启动等。但是,我们知道几乎没有人会这样做,因此我们正在寻找可以通过编程方式实现的解决方案。
下面是演示如何在清单中注册服务以及如何启动它的一些代码。(演示比原始代码简单,但描述了主要逻辑。)
<service android:name=".MyService"
android:stopWithTask="false" />
开始服务部分:
// Starts the service as foreground.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
context.startForegroundService(new Intent(context, MyService.class));
else
context.startService(new Intent(context, MyService.class));
发布通知部分:
// Post the notification on both onCreate and
// onStartCommand so we can only hope that
// the app won't throw the unavoidable exception
// which occurs 5 seconds after calling
// Context.startForegroundService().
@Override
public void onCreate()
{
super.onCreate();
// Handles how the notification
// is shown, content is not important.
// Calls startForeground inside.
showNotification();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
showNotification();
// Some other service code that is irrelevant
// Return START_STICKY so we can ensure that if the
// service dies for some reason, it should start back.
return START_STICKY;
}
我认为我们的所有操作都是正确的,因为这种情况只发生在小米设备上,但我们无法找到一个长期保持这项服务运行的解决方案。是否还有其他人遇到了类似的问题?我们应该如何继续,以免使我们的服务停止运行?感谢大家的帮助。