2010-09-03 41 views
7

提供程序在应用程序和应用程序更新提供程序数据中实现,并触发远程服务,该服务查询提供程序以检索存储的值。应用程序在某段时间后关闭但服务继续访问内容提供者。在某些情况下,logcat中会引发以下错误,并且远程服务会崩溃。因为提供者<my provider>处于死亡过程中<my app>

“杀应用(PID 1724),因为供应商是在死亡过程”

我用Google搜索这个错误,找不到任何关于为什么会出现此错误信息。

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

+0

我会在标题一点,而不是他们可能是<一些供应商>和改变。 – phreed 2012-03-26 22:29:40

回答

3

嗯,困难的运气,迄今为止没有答案。我想到了上周造成这次事故的原因!我想我应该在这里分享一下。

提供者P在应用程序A中定义,该应用程序具有服务S1,该服务禁用包并因某种原因杀死包。现在有另一个应用程序B具有服务S2并使用提供者P.在某些时刻,服务S1禁用应用程序A的某些组件并杀死该进程,这使提供者找到所有连接到它的进程并杀死那些进程通过一个,这使得应用程序B运行的过程中出现错误“杀死应用程序,因为提供程序正在死亡过程中。

将提供程序移动到新应用程序解决了问题,以便它在其自己的进程中运行解决的问题。

+0

我面临同样的问题,并发现杀应用程序的源代码,就像你所说:在这里:https://android.googlesource.com/platform/frameworks/base/+/6ae8d1821822296df0606c9cd1c46708cc21cb58%5E!/ – dreamtale 2015-10-28 09:35:46

+0

“Moving the provider到一个新的应用程序“?有一个'android:process =“:otherProcessInSameApp”'你可以把任何东西放在清单中。 – TWiStErRob 2016-09-08 15:30:35

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 

,它没有重新启动的主要过程,当包卸载,即供应商...

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

并且ContentProviderClient有两种“类型” - stableunstable不稳定客户端由您的应用程序管理。但是稳定一个是由Android为你管理,所以当应用程序停止时,ActivityManager knows that it's time to kill all clients

看到这个承诺的更多详细信息不稳定内容提供商的客户:https://android.googlesource.com/platform/frameworks/base/+/6ae8d1821822296df0606c9cd1c46708cc21cb58

0

我遇到了同样的问题。就我而言,提供者不是第三方,而是由系统包提供。日志表明提供者已经崩溃,并且由于我的IntentService正在使用该提供者,因此我的IntentService被终止。

对于我的情况,我修改了我的IntentService以返回START_STICKYonStartCommand()。这有助于我的情况,因为在我的服务中断后,操作系统再次重新启动我的服务并重新运行一切。从文档

提取有关START_STICKY标志:

...如果同时启动该服务的过程中被杀死(后 从onStartCommand(Intent, int, int))回来,然后把它留在 启动状态,但不保留此交付意图。后来系统 将尝试重新创建该服务,因为它处于启动状态, 这将保证 创建新的服务实例后打电话到onStartCommand(Intent, int, int) ......

此模式对于明确开始的事件以及 停止运行任意时间段(例如执行背景音乐播放的服务 )有意义。

https://developer.android.com/reference/android/app/Service.html#START_STICKY

相关问题