小米设备停止前台服务

4
我们有一个应用程序,几乎总是使用前台服务,并在系统托盘上使用通知进行正常初始化。该应用程序简单地依赖于这个服务。在我们测试的每个设备上,即使任务被移除,服务仍然保持运行状态,但在小米设备上,在从最近列表中滑动后,服务突然停止,然后根据ActivityManager重新打开服务的方式再次启动。我们从小米设备(例如小米MI9)获取以下日志:
“计划重启已崩溃的服务: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;
}

我认为我们的所有操作都是正确的,因为这种情况只发生在小米设备上,但我们无法找到一个长期保持这项服务运行的解决方案。是否还有其他人遇到了类似的问题?我们应该如何继续,以免使我们的服务停止运行?感谢大家的帮助。


1
有其他人也遇到同样的问题吗?是的,每个人都有。怪小米。除了你已经在做的事情之外,你真的无法做任何事情。请查看https://dontkillmyapp.com/。 - Tim
@Tim Castelijns,是的,我知道它说开发方面没有什么要做的,但我们仍然需要想出一种解决方法。 - Furkan Yurdakul
并不是所有的问题都有解决方案。据我所知,你正在浪费时间。也许其他人知道一个巧妙的解决方法。但不要抱太大希望。 - Tim
2
我遇到了同样的问题。 你可以像这样获取权限。 - Behrad Ranjbar
@BehradRanjbar 哇,谢谢! - Furkan Yurdakul
即时通讯应用和xRecorder应用已经有解决方案了...但还需要一个解决方案,但我还不知道 :c - Alejandro Ibague
1个回答

1
转到设置->权限->自启动,然后选择您的应用程序。

这并不会删除打印为“在1000ms内安排重新启动崩溃的服务:com.example.myapp/.MyService”的消息,因此它只会重新启动服务,而不会保持它。我需要的是将服务保持在前台,而不会像其他设备那样导致系统崩溃。 - Furkan Yurdakul
只有在设置->权限->自动启动启用之后,即使应用程序被强制关闭,该服务仍将保持活动状态。 - iCantC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接