我构建了一个简单的 Android 应用程序来解决一个恼人的问题。每当您在我的大学加入无线网络时,您都会被重定向到一个登录页面,您必须在其中提供您的学号和密码。
我已经构建了一个 Android 应用程序,可以让您输入您的详细信息,然后服务会使用意图过滤器注册接收器WifiManager.NETWORK_STATE_CHANGED_ACTION
。每当设备连接到大学网络时,都会使用登录详细信息发出 HTTP post webrequest。从而解决被重定向的问题。
一切都很完美......但是在我的扩展测试中,我发现了一个非常奇怪的问题。当我按下“Go Power Master”应用程序闪电按钮一次然后打开设置>应用程序>运行时,我看到我的服务正在重新启动(以及许多其他服务,例如 Facebook)。大约 30 秒后,服务重新启动,一切都恢复正常。
但是,如果我快速连续多次(3 次或更多)按下闪电按钮,然后转到设置>应用程序>运行,我不再看到我的服务。就像它从未尝试过重新启动一样。Facebook 服务和其他服务会经历正常的重启阶段并最终成功。
有谁知道发生了什么?当我多次按下闪电按钮时,为什么我的服务会永远死掉?
在您回答之前知道我已经更改了我的应用程序以使用它startForeground()
,这在我所有的扩展测试中都非常有效。然而,这不是一个有效的解决方案,因为我不希望我的应用程序在状态栏中有一个持续的通知。
PS 如果你想重新创建这个奇怪的问题,我的项目在 github 上https://github.com/ccoffey/NUIMWiFi
PPS “Go Power Master”应用程序是 Google Play 上的免费应用程序,闪电按钮应该可以回收丢失的 RAM?我想它会迫使所有后台服务死掉。无论如何,这肯定是它看起来要做的事情。
编辑以包含 LogCat 日志
好的,我已经部分回答了我自己的问题。下面是我的服务的 LogCat 输出,过滤后仅包含 ie.cathalcoffey.android。我已经强调了重要的行。事实证明,每次您终止服务时,它的重新启动时间都会增加。最初是 135096 毫秒,第二次杀死服务变成 540384 毫秒,最后一次杀死服务变成 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