即使我强制停止WhatsApp应用程序,它的服务是如何重新启动的?

27

我正在设备A上运行WhatsApp(从现在开始我们可以叫它appX)。我进入“管理应用程序”->强制关闭,这样appX被关闭后,我再也看不到它作为正在运行的服务。

现在,过了5分钟,我从另一台设备B上的appX向设备A上的appX发送一条消息(那个我们杀死的)。以下是我测试过的两种情况:

  • 安卓2.1的设备A:它永远不会收到消息,因此我们可以说appX的服务没有重新启动。只有手动重启应用程序,它才能接收消息。

  • 安卓2.3.6的设备A:由于某些神奇的原因,无论appX被杀死多长时间,一旦我们从设备B发送消息,设备A就会收到消息,因此appX的服务得到重启。注意:在所有appX关闭且没有收到任何通知的时间内,在“管理应用程序”中我无法看到任何正在运行的appX服务,这意味着该神奇服务在收到消息/通知后立即重新启动。

我知道这听起来很奇怪,很多人会说这是不可能的,但确实已经在这两个设备上测试过。

我正在尝试实现相同的行为,因此任何帮助都将不胜感激。


我在Android 4.4.4上尝试了这个。我从应用程序->强制停止中停止了WhatsApp。之后,我没有自动收到任何消息。我必须手动启动WhatsApp才能获取任何消息。这只发生在2.3.6上吗? - RocketRandom
4个回答

49
我认为这里发生的并不是什么奇迹!只是使用了Android C2DM(参见:https://developers.google.com/android/c2dm/),应用程序已经注册了一个接收器(Receiver)来接收推送通知,并由此消息唤醒。 Android C2DM在Android 2.2中可用,这就是为什么您无法在运行Android 2.1的设备上看到相同的行为的原因。 顺便说一下:正如您所看到的,C2DM自2012年6月26日起已弃用。因此,应该使用GCM(参见:http://developer.android.com/guide/google/gcm/gs.html)。 有用的评论:GCM需要可用的互联网连接。您可以使用任何其他广播接收器,如SMSReceiver,以绕过此限制。

1
最好的答案!感谢herom提供准确的回答! - cesarmax
4
不用谢。如果这个答案对您有帮助,请考虑将其标记为正确答案(点击复选框),以便将此问题标记为已解决 ;) - herom
1
我已经实现了GCM,但是当我关闭服务时它无法接收推送通知,所以即使我们关闭服务仍然能够收到消息,我认为GCM并没有起到帮助的作用。 - Hunt
1
GCM需要可用的互联网连接。您可以使用任何其他广播接收器,例如SMSReceiver来绕过此限制。 - Vahid Ghadiri
我不确定WhatsApp是否使用GCM,因为它可以在未安装Google应用的设备上运行。 - harveyslash
显示剩余4条评论

13

Android 3.1(API 12)开始,如果应用程序被强制停止,它将不会重新启动,直到用户手动再次运行该应用程序。

即使应用程序包含一个Service或者一个活动的BroadcastReceiver,这种情况也会发生。

你可以在这里找到官方文档。


1
最好的解决方案之一。 - Punith K
这个解决方案让我开心了一整天。 - Sabari Karthik

2

我不了解WhatsApp服务。

但是在强制停止应用程序后,重新启动应用程序的服务是可能的。

我使用START_STICKY服务来提供我的聊天应用程序。我必须做同样的事情,所以我使用START_STICKY服务,这样当我的应用程序被杀死或从设置中强制停止后,几秒钟后我的服务会重新启动,我就能够登录到我的XMPP服务器并接收到消息。


2
START_STICKY在棒棒糖版本中无法重新启动服务..所有都正常工作。 - Ranjithkumar

1

这里没有什么神奇的地方,appX使用Android GCM平台(https://developer.android.com/google/gcm/index.html)通过推送通知。在GCM中,应用程序注册广播接收器,广播接收器在接收到推送通知后启动服务。 Android GCM依赖于Google Play服务,在Android 2.2及以上版本中可用,因此您无法在2.1设备上看到消息。


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