gpt4 book ai didi

android - 奇怪 - Android IntentService 杀死了我应用程序的其余部分,但继续自行运行

转载 作者:太空狗 更新时间:2023-10-29 15:04:31 25 4
gpt4 key购买 nike

我有一个关于 Services/IntentServices 的奇怪的 Android 问题...

我有一个启动管理器类的服务,它从 Google Play 服务请求 ActivityRecognition 更新(即获取连接,然后在 ActivityRecognitionClient 上调用 requestActivityUpdates() 传递 PendingIntent)。

PendingIntent 引用实现了 onHandleIntent(Intent) 的 IntentService - 它只是将最可能的当前物理 Activity 打印到日志。

到目前为止一切顺利。一切正常——服务被绑定(bind),管理器连接,IntentService 被触发,用户的 body Activity 被写入日志。

问题来了...

我希望它只是坐在后台并监听 Activity 更新,即使我的用户在“最近的应用程序”屏幕中关闭了 UI Activity 。我已经在我的应用程序中使用这种技术进行位置更新 - 即使应用程序的 UI 部分被用户或系统破坏,我的位置服务也会继续跟踪位置。

事情是,由于添加了这个新的 Activity 识别内容,当用户终止 UI 时,IntentService 收到的下一个 PendingIntent 将终止,整个应用程序的其余部分包括所有其他服务。一切都停止/死亡/消失。但是没有警告,没有异常,没有日志条目,什么都没有!

唯一继续工作的是该死的 IntentService!每当有新 Intent 进来时,就好像什么都没发生一样。

如果我注释掉我注册 Activity 更新的代码(因此不使用 PendingIntent 并且不调用 IntentService)一切正常。

我不知道是什么导致了这次崩溃,日志中也没有任何线索。

我在 Google/SO 上搜索了又搜索,但一片空白。我找不到任何人描述类似的行为。

那么是否有另一种类型的 Android 组件能够由我可以尝试的 Intent 而不是 IntentService 触发? IntentService 真的是问题所在吗? Activity识别能不能这样在后台做?我还可以尝试哪些其他事情?

更新:当 IntentService 上的 onHandleIntent() 方法完成时,操作系统是否会终止我的应用程序中的所有线程,而不仅仅是为 IntentService 创建的线程?

这是日志中的内容...

--User is shutting down the App UI, but the Services are left running as intended...
19:41:12.146 13679-13679/tripcomputer I/tripcomputer.TripComputer? STOPPED TripComputer Activity: 1107344720
19:41:12.153 1258-4401/? W/ContextImpl? Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1244 android.content.ContextWrapper.sendBroadcast:365 com.motorola.motocare.util.TriggerHelper$TriggerBuilder.send:76 com.motorola.motocare.internal.frameworkevents.PauseResumeTrigger.handleFrameworkEvent:53 com.motorola.motocare.internal.frameworkevents.FwEventMonitor$FrameworkListener.processFrameworkEvent:114
19:41:12.645 13679-13679/tripcomputer I/tripcomputer.TripComputer? DESTROYING TripComputer Activity: 1107344720
19:41:12.646 13679-13679/tripcomputer I/tripcomputer.services.JourneyServiceConnectionManager? Activity 1107344720 is STOPPING the JourneyService...
19:41:12.652 13679-13679/tripcomputer I/tripcomputer.services.JourneyServiceConnectionManager? IGNORING request to STOP the JourneyService - Journey in progress.
19:41:12.655 13679-13679/tripcomputer I/tripcomputer.services.ActivityServiceConnectionManager? Activity 1107344720 is STOPPING the ActivityService...
19:41:12.657 13679-13679/tripcomputer I/tripcomputer.services.ActivityServiceConnectionManager? IGNORING request to STOP the ActivityService - Activity in progress.
19:41:12.659 13679-13679/tripcomputer I/tripcomputer.TripComputer? DESTROYED TripComputer Activity: 1107344720

--The UI has closed down sucessfully.
--The next activity update arrives at the IntentService and gets printed...
19:41:19.703 13679-14095/tripcomputer I/tripcomputer.services.ActivityUpdateIntentService? The most probable user Activity is still (50)

--Then, the system kills the IntentService?
19:41:19.704 969-979/? I/ActivityManager? Killing 13679:tripcomputer/u0a152 (adj 0): remove task
19:41:19.706 1258-4401/? W/ContextImpl? Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1244 android.content.ContextWrapper.sendBroadcast:365 com.motorola.motocare.util.TriggerHelper$TriggerBuilder.send:76 com.motorola.motocare.internal.frameworkevents.ProcessKillTrigger.sendTrigger:147 com.motorola.motocare.internal.frameworkevents.ProcessKillTrigger.handleFrameworkEvent:164

--Boom!, everything else has gone but there's nothing in the Log
--System schedules the Crashed Services for restart
19:41:19.727 969-1273/? W/ActivityManager? Scheduling restart of crashed service tripcomputer/.services.JourneyService in 1000ms
19:41:19.736 969-1273/? W/ActivityManager? Scheduling restart of crashed service tripcomputer/.services.ActivityService in 1000ms

最佳答案

我最终确实找到了一种有效的替代方法...

我在上面遇到的问题可能与 IntentService 线程的处理方式有关,但不幸的是,当 Intent 服务的 handleIntent 方法完成时,我从未找到更具体的解释来说明正在运行的应用程序完全丢失。

解决方法是切换到使用常规服务的组合来处理 ActivityRecognition PendingIntents(在 onStartCommand(Intent...) 中)以及自定义的 Runnable 线程以从 UI 线程离线处理实际工作。如果您这样做,应用程序将不再意外退出,您将获得预期的效果。

有趣的是,Google Play 服务的 Activity 识别功能的文档和示例代码只提到使用来自 android Activity 或 fragment 的用户 Activity 识别,而不是来自服务。难道只有在 UI 线程上运行的组件才能使用 IntentServices 进行 Activity 识别吗???

关于android - 奇怪 - Android IntentService 杀死了我应用程序的其余部分,但继续自行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23265899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com