使用用ContentProviderClient
获得的ContentResolver#acquireContentProviderClient(...)
与ContentResolver#acquireUnstableContentProviderClient(...)
有何不同?
无论使用哪种方法,我似乎都会编写相同的代码。如果获得的ContentProvider消失了,而我使用非不稳定的方法来获取客户端,我的应用程序中会有某种漏洞吗?
因此,如果您想要使用的ContentProvider运行在同一个进程中,或者如果它运行在system_server
中,那么您可以继续使用稳定的方法获取客户机,否则您应该使用不稳定的方法,以防其他进程崩溃,或者在使用时卸载/重新安装承载ContentProvider的应用程序。但这让我不禁要问,使用稳定版本的获取方法有什么好处,为什么不总是使用不稳定版本的方法,以防万一呢?
当他们说下面的话时,他们到底是什么意思?
这将关闭平台中的机制,在内容提供者的进程消失时,清理依赖于内容提供者的进程。
发布于 2015-11-06 08:16:48
如果您使用acquireContentProviderClient
,那么如果内容提供者死了,您的进程就会被终止。
如果您使用acquireUnstableContentProviderClient
,那么如果内容提供者死了,您的进程就不会被终止--相反,您将得到一个需要在代码中处理的DeadObjectException
。
当您得到一个DeadObjectException
时,您需要使用不稳定版本编写额外的代码来处理恢复问题。您可以看到query
方法在ContentResolver.java
中的默认实现。
据我所知,您的应用程序不会因使用不稳定版本而导致泄漏。
至于为什么不选择总是使用不稳定的版本--我相信恰恰相反。很少有应用程序需要处理内容提供者崩溃并从崩溃中恢复。最简单的方法是让应用程序死掉并重新启动。内容提供者崩溃应该是非常罕见的-内存损坏、磁盘损坏等。除非您有自己的提供者,因为某些特定/奇怪的原因,您将不需要使用不稳定的版本。
这将关闭平台中的机制,在内容提供者的进程消失时,清理依赖于内容提供者的进程。
这是杀死所有使用内容提供程序的进程的平台逻辑。这意味着如果使用不稳定版本,应用程序将不会被关闭。
https://stackoverflow.com/questions/33423825
复制相似问题