杀死app <my service =“”>(pid 1724),因为提供商<my provider =“”>正处于死亡过程<我的app =“”> </my> </my> </my>

时间:2010-09-03 12:05:27

标签: android

提供程序在应用程序和应用程序更新提供程序数据中实现,并触发远程服务,该服务查询提供程序以检索存储的值。应用程序在某个时间关闭但服务继续访问内容提供程序。在某些时候出现以下错误在logcat中抛出,远程服务崩溃。

“杀死app(pid 1724),因为提供者正处于死亡过程中”

我搜索了此错误,但无法找到有关此错误发生原因的信息。

更新:在其中一个地方使用getApplicationContext返回的上下文而不是Service来获取内容解析器来查询内容提供者。它会导致任何问题吗?

5 个答案:

答案 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.registerContentObserverContentResolver.query

之间的区别

因此, ContentResolver.registerContentObserver 只是将您的本地 ContentObserver 实例与 ContentService 相关联。它是通过建立一个桥梁来实现的。使用 ContentObserver.Transport 类实例(基本上是一个活页夹)并将其传递给 ContentService 。见ContentObserver.getContentObserver()

为什么它很重要?因为这些观察员不是由ActivityManagerService管理(注册)。

那么, ContentResolver.query 方法有什么特别之处?要回答这个问题,我们必须查看ContentProviderClient。因为实际查询是通过 ContentProviderClient 实例执行的,这些实例负责与远程 ContentProvider 联系。

有两种&#34;类型&#34; ContentProviderClient - stableunstable不稳定客户端由您的应用程序管理。但稳定一个由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