Android Service在快速连续被杀死后无法重新启动

4
我建立了一个简单的Android应用程序来解决一个烦人的问题。每当你加入我的大学的无线网络时,你都会被重定向到一个登录页面,在那里你必须提供你的学号和密码。
我建立了一个Android应用程序,让你输入你的详细信息,然后一个服务注册了一个带有意图过滤器WifiManager.NETWORK_STATE_CHANGED_ACTION的接收器。 每当设备连接到大学网络时,就会进行HTTP post webrequest并使用登录详细信息。从而解决了被重定向的问题。
一切都工作得很完美... 但是在我的扩展测试中,我发现一个非常奇怪的问题。当我按下“Go Power Master”应用程序的闪电按钮一次,然后打开设置>应用程序>运行时,我会看到我的服务正在重新启动(连同Facebook等许多其他服务)。大约30秒后,服务重新启动,一切又恢复正常。
然而,如果我快速地按下闪电按钮多次(3次或更多次),然后进入设置>应用程序>运行时,我不再看到我的服务了。就像它从未尝试重新启动过一样。Facebook服务和其他服务经历了正常的重新启动阶段,最终成功。
有人知道发生了什么吗?为什么当我多次按下闪电按钮时,我的服务永远死亡?

在你回答之前,请知道我已经将我的应用程序更改为使用startForeground(),并且在我所有的扩展测试中都能正常工作。然而,这不是一个有效的解决方案,因为我不希望我的应用程序在状态栏中有一个持续的通知。

P.S. 如果您想重新创建此奇怪的问题,我的项目已上传到github https://github.com/ccoffey/NUIMWiFi

P.P.S. "Go Power Master" 应用程序是Google Play上的免费应用程序,闪电按钮应该可以恢复丢失的RAM?我猜它会强制所有后台服务停止。无论如何,它似乎确实是这样做的。

编辑以包含LogCat日志

好的,我已经部分回答了自己的问题。下面是仅包括 ie.cathalcoffey.android 的 Service 的 LogCat 输出结果。我已经突出显示了重要的行。结果发现,每次你杀死一个 Service ,它的重启时间都会增加。最初是 135096 毫秒,第二次杀死 Service 后变成了 540384 毫秒,最后一次杀死 Service 后变成了 2161536 毫秒。

现在我知道为什么我的服务在快速连续被杀死后似乎无法重新启动。但我仍然不知道为什么Facebook服务每次被杀死后都能够非常快速地重新启动(重新启动时间没有增加)。有没有什么解决方法?

05-08 09:52:20.997: I/ActivityManager(192): START   
{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] 
flg=0x10000000 cmp=ie.cathalcoffey.android/.MyActivity} from pid 3364 05-08 
09:52:21.403: I/ActivityManager(192): Displayed 
ie.cathalcoffey.android/.MyActivity: +290ms (total +41s557ms) 05-08
 09:53:01.888: I/ActivityManager(192): Killing proc 
3330:ie.cathalcoffey.android/10033: kill background 05-08 09:53:01.888: 
W/ActivityManager(192): Scheduling restart of crashed service 
ie.cathalcoffey.android/.MyService in 135096ms 05-08 09:55:17.013: 
I/ActivityManager(192): Start proc ie.cathalcoffey.android for service 
ie.cathalcoffey.android/.MyService: pid=3633 uid=10033 gids={3003} 05-08 
09:56:21.325: I/ActivityManager(192): Killing proc 
3633:ie.cathalcoffey.android/10033: kill background 05-08 09:56:21.333: 
W/ActivityManager(192): Scheduling restart of crashed service 
ie.cathalcoffey.android/.MyService in 540384ms 05-08 10:05:21.747: 
I/ActivityManager(192): Start proc ie.cathalcoffey.android for service 
ie.cathalcoffey.android/.MyService: pid=3943 uid=10033 gids={3003} 05-08 
10:17:20.786: I/ActivityManager(192): Killing proc 
3943:ie.cathalcoffey.android/10033: kill background 05-08 10:17:20.786: 
W/ActivityManager(192): Scheduling restart of crashed service 
ie.cathalcoffey.android/.MyService in 2161536ms

好的,使用facebook过滤LogCat会返回以下有趣的信息,再次强调有趣的部分已用粗体标出。他们是如何做到这一点的?我该如何将这种无杀死逻辑融入我的服务中。

05-08 10:47:15.896: I/ActivityManager(192): Killing proc 
4530:com.facebook.katana/10077: kill background 05-08 10:47:15.896: 
W/ActivityManager(192): Scheduling restart of crashed service 
com.facebook.katana/.service.MediaUploadService in 24955ms 05-08 
10:47:16.552: W/ActivityManager(192): Permission Denial: Accessing service
ComponentInfo{com.facebook.katana/com.facebook.katana.service.MediaUploadService } from pid=907, uid=10069 that is not exported from uid 10077 05-08 10:47:16.560: W/System.err(907): java.lang.SecurityException: Not allowed to stop service Intent { cmp=com.facebook.katana/.service.MediaUploadService } 05-08 10:47:17.263: W/System.err(907): java.lang.SecurityException: Not allowed to stop service Intent { cmp=com.facebook.katana/.service.MediaUploadService } 05-08 10:47:17.263: W/ActivityManager(192): Permission Denial: Accessing service ComponentInfo{com.facebook.katana/com.facebook.katana.service.MediaUploadService} from pid=907, uid=10069 that is not exported from uid 10077 05-08 10:47:17.778: W/System.err(907): java.lang.SecurityException: Not allowed to stop service Intent { cmp=com.facebook.katana/.service.MediaUploadService } 05-08 10:47:17.778: W/ActivityManager(192): Permission Denial: Accessing service ComponentInfo{com.facebook.katana/com.facebook.katana.service.MediaUploadService} from pid=907, uid=10069 that is not exported from uid 10077

当这种情况发生时,Android日志显示了什么内容? - Femi
你尝试过除了BOOT_COMPLETE之外的其他意图吗?例如,在boot_complete之后广播的EXTERNAL_APPLICATIONS_AVAILABLE。这也将带来额外的好处,允许用户将其挂载在SD卡上。 - TomJ
1个回答

5
解决方案是在AndroidManifest.xml文件中的服务中添加exported="false"。

请将您的帖子拆分为问题和答案。在这里留下答案,并将您的问题作为单独的问题发布。 - eeerahul

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