提供程序在应用程序和应用程序更新提供程序数据中实现,并触发远程服务,该服务查询提供程序以检索存储的值。应用程序在某个时间关闭但服务继续访问内容提供程序。在某些时候出现以下错误在logcat中抛出,远程服务崩溃。
“杀死app(pid 1724),因为提供者正处于死亡过程中”
我搜索了此错误,但无法找到有关此错误发生原因的信息。
更新:在其中一个地方使用getApplicationContext返回的上下文而不是Service来获取内容解析器来查询内容提供者。它会导致任何问题吗?
答案 0 :(得分:3)
提供者P在应用程序A中定义,其具有服务S1,该服务S1由于某种原因禁用包并杀死包。现在有另一个应用程序B具有服务S2并使用提供者P.在某些时候,服务S1禁用应用程序包的一些组件并杀死进程,这使得提供者找到连接到它的所有进程并杀死那些进程通过一个,这使得应用程序B运行的过程死亡时出现错误“Killing app,因为提供程序正处于死亡过程中。
将提供程序移动到新应用程序解决了问题,以便它在自己的进程中运行解决了问题。
答案 1 :(得分:0)
以下论坛帖子似乎相关。 https://groups.google.com/forum/?fromgroups#!topic/android-developers/7aOLy1DXdhQ
似乎有一个进程“A”运行内容提供程序,进程“B”带有游标(或ContentObserver)到该内容提供程序并且进程“A”因例如卸载而死亡“A”的包裹。
答案 2 :(得分:0)
试试这个解决方案:
Context ctx = context.createPackageContext("package of the provider", Context.CONTEXT_IGNORE_SECURITY);
cursor = ctx.getContentResolver().query(uri, null, null, null, null);
// do something with cursor
当包卸载时,它没有重新启动主进程,它提供了提供程序......
答案 3 :(得分:0)
<强> TL; DR 强>
使用不稳定的ContentProviderClient。
以下是其他作者的解释:https://stackoverflow.com/a/33562256/87383
长时间阅读
面对同样的问题并在下一步解决(解决方法):
首先,您应该了解ContentResolver.registerContentObserver和ContentResolver.query
之间的区别因此, ContentResolver.registerContentObserver 只是将您的本地 ContentObserver 实例与 ContentService 相关联。它是通过建立一个桥梁来实现的。使用 ContentObserver.Transport 类实例(基本上是一个活页夹)并将其传递给 ContentService 。见ContentObserver.getContentObserver()
为什么它很重要?因为这些观察员不是由ActivityManagerService管理(注册)。
那么, ContentResolver.query 方法有什么特别之处?要回答这个问题,我们必须查看ContentProviderClient。因为实际查询是通过 ContentProviderClient 实例执行的,这些实例负责与远程 ContentProvider 联系。
有两种&#34;类型&#34; ContentProviderClient - stable和unstable。 不稳定客户端由您的应用程序管理。但稳定一个由Android管理,因此当应用程序停止时,ActivityManager knows that it's time to kill all clients。
有关不稳定内容提供商客户端的更多详细信息,请参阅此提交:https://android.googlesource.com/platform/frameworks/base/+/6ae8d1821822296df0606c9cd1c46708cc21cb58
答案 4 :(得分:0)
我遇到了同样的问题。就我而言,提供商不是第三方,而是由系统包提供。日志表明提供程序已崩溃,并且由于我的IntentService正在使用该提供程序,因此我的IntentService被终止。
就我而言,我修改了我的IntentService以在START_STICKY
中返回onStartCommand()
。这有助于我的情况,因为在我的服务被杀之后,操作系统再次重新启动我的服务并重新运行所有内容。
摘自有关START_STICKY
标志的文档:
...如果此服务的进程在启动时被终止(之后) 从
onStartCommand(Intent, int, int))
返回,然后留在。{1}} 开始状态,但不保留这个意图。后来的系统 将尝试重新创建服务。因为它处于启动状态, 它将保证在之后致电onStartCommand(Intent, int, int)
创建新的服务实例......此模式适用于将明确启动的内容 停止运行任意时间段,例如服务 表演背景音乐播放。
https://developer.android.com/reference/android/app/Service.html#START_STICKY