华为和小米设备上onTaskRemoved()方法未被调用

38

我一直在使用Service中的onTaskRemoved()方法来检测用户通过从RECENT列表中向右滑动将应用程序移除设备。当这种情况发生时,我会记录一些日志和执行其他操作。

它的工作完美。

然后我在运行Android 6.0的华为设备上检查了这个方法。

这个方法从未被调用过。我还添加了一个Log.d调用,正如预期的那样,这个日志从未出现过。在小米设备上也是一样的情况。

有任何想法为什么会这样发生以及如何解决这个问题吗?或者有没有其他方法可以检测应用程序是否已从RECENT列表中移除而不依赖于onTaskRemoved()

谢谢

4个回答

32

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

在这些设备上,您应该能够在“设置”中找到一个页面,有时位于“电源管理”下面,有时是其他位置,需要在其中明确添加您的应用程序。您还需要告诉您的用户明确将您的应用程序添加到此列表中。


有没有强制将应用程序放入这样的列表的方法?在清单中有任何选项可以执行吗? - Naveen Kumar M
不行,用户必须自己添加应用程序。你不能通过编程来实现。在某些设备上,如果从Play商店安装应用程序(而不是通过ADB安装),则该应用程序可能会自动添加,但我不确定哪些设备会这样做。并非所有设备都支持此功能。 - David Wasser
1
一些联想手机有“后台应用程序管理”设置。然而,看起来很多人在使用联想手机时都遇到了这个问题。可能是联想出了什么问题。请参见https://forums.lenovo.com/t5/P1-P1m-P70-P90-Series/Apps-stop-running-in-background-in-VIBE-P1m/td-p/2250275。 - David Wasser
1
答案是正确和有效的。它引导了我走向正确的方向,但Vishnu Prasad的答案有一个实际的操作解决了问题,所以我给了他标记 :) - Alon Minski
1
令我困惑的是Facebook和WhatsApp等应用如何在不要求用户手动操作的情况下完成此操作,它们是否具有更高级别的权限或其他原因? - Tosin John
2
@TosinJohn 这些公司与制造商达成协议,允许他们的应用程序“预先批准”此功能。这些应用通常已经预装在设备上了。 - David Wasser

16

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

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

使用上述代码在小米设备上启动自启动活动页面。


谢谢,结合David Wasser的回答,我成功解决了这个问题。我正在向用户解释他需要手动激活此系统功能,然后我也可以将他发送到正确的设置屏幕。 - Alon Minski
我也遇到了困难,请指导我。上面的解决方案中,我们需要放置更多的内容。对于华为设备,我们需要做什么? - Rajaji subramanian
1
多年来,实现这个可能需要大量的维护工作。 - Someone Somewhere
@SomeoneSomewhere 好像换个方向就需要做的更少一样。在这个问题上似乎所有的事情都显得很平凡。即使是安装量达到数百万的应用也会受到影响,这就是为什么有一个团队创建了 https://dontkillmyapp.com,但好像没有人真正关心它。 - Farid

6
我一直在使用Service中的onTaskRemoved()方法来检测应用程序是否被从设备的RECENT列表中通过滑动而删除。根据David Wasser提供的答案,小米手机上不需要这样做,因为小米有一个名为应用程序权限的功能,用户必须允许应用程序自动启动(Service)。在您的情况下,一旦Service从堆栈中终止,它就不会被调用。请按照以下步骤允许您的应用程序自动启动:设置->权限->自动启动。

如何以编程方式启用自动启动程序,是否可以在安装时的清单中实现? - Naveen Kumar M
首先,这只发生在小米和其他一些日本和中国手机上。由于这不是全球性的手机问题,因此无法通过编程方式启用。首选方法是在“onDestroy”中添加消息以通知用户。我仍在寻找解决方案。 - W4R10CK
@NaveenKumarM 不,这在这些设备上无法通过编程实现。一些LG、华为和联想设备也具有此功能。 - David Wasser

3
在我的华为手机上也遇到了问题,只需要进入“设置”=>“电量管理”=>“受保护应用程序”=>找到你的应用并启用它。这样服务就会开始运行了。

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