38

我一直在使用onTaskRemoved()服务中的方法来检测应用程序何时从设备最近列表中删除。当发生这种情况时,我会执行一些日志记录和一些其他操作。它完美地工作。

然后我在运行Android 6.0的华为设备上检查了这个方法。该方法永远不会被调用。我还添加了一个 Log.d 调用,正如预期的那样,这个日志从未出现过。同样的情况也发生在 XIAOMI 设备上。

任何想法为什么会发生这种情况以及如何解决这个问题?或者是否有另一种方法来检测应用程序已从最近列表中删除而不依赖onTaskRemoved()

谢谢

4

4 回答 4

32

在某些设备(一些 LG、华为、小米和其他设备)上,您的应用程序需要手动添加到“受保护的应用程序”或“允许在后台运行的应用程序”列表中,以便 Android 重新启动 STICKY 服务。如果您的应用尚未手动添加到此列表中,Android 只会终止您的进程,不会重新启动它们,也不会调用onTaskRemoved(). 这样做是为了通过限制可以在后台运行 STICKY 服务的应用程序数量来延长电池寿命。

在此类设备上,您应该会在“设置”中看到一个页面,有时在“电源管理”下,有时在您需要明确添加应用程序的其他地方。您还需要告诉您的用户明确地将您的应用添加到此列表中。

于 2017-02-08T17:54:15.640 回答
16

当用户在小米设备上安装您的应用程序时,将用户重定向到自动启动活动并告诉用户打开:

if (Build.BRAND.equalsIgnoreCase("xiaomi")) {
                Intent intent = new Intent();
                intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
                startActivity(intent);
            }

使用上面的代码在小米上启动自动启动活动页面

于 2017-02-15T07:17:45.247 回答
6

我一直在 Service 中使用 onTaskRemoved() 方法来检测应用程序何时从设备最近列表中删除。

随着大卫·瓦瑟提供的答案更加清晰

这对小米来说并不新鲜,因为小米有一个叫做应用权限的功能,用户必须允许应用自动启动(服务)。在您的情况下Service,一旦从堆栈中终止,就不会调用它。

像这样让你的应用程序自动启动:

Settings > permissions > Autostart

于 2017-02-14T12:33:55.920 回答
3

在我的华为中,我也面临着问题,只需去设置 => 省电 => 保护应用程序 => 找到您的应用程序并启用它.. 服务将开始运行..

于 2017-11-18T08:21:57.373 回答