如何以及何时使用通过acquireUnstableContentProviderClient 获得的ContentProviderClient?

sat*_*ine 4 android android-contentprovider

如何使用ContentProviderClientContentResolver#acquireContentProviderClient(...)任何不同的获得ContentResolver#acquireUnstableContentProviderClient(...)

似乎无论我使用哪种方法,我都会编写相同的代码。如果获取的 ContentProvider 消失并且我使用非不稳定方法获取客户端,我的应用程序中是否会出现某种泄漏?

所以我猜如果你想使用的 ContentProvider 在同一个进程中运行或者它正在运行,system_server那么你可以继续使用 stable 方法获取客户端,否则你应该使用不稳定的方法以防其他进程崩溃或者托管 ContentProvider 的应用程序在您使用它时被卸载/重新安装。但这让我问,使用稳定版本的获取方法是否有某种优势,为什么不总是使用不稳定版本的方法以防万一?

当他们说以下内容时,他们究竟是什么意思?

如果该内容提供者的进程消失,这将关闭平台中的机制清理依赖于该内容提供者的进程。

Roc*_*dom 5

如果您使用,acquireContentProviderClient那么如果内容提供者死亡,您的进程将被终止。

如果您使用,acquireUnstableContentProviderClient那么如果内容提供者死亡,您的进程将不会被终止 - 相反,您将获得一个DeadObjectException- 您需要在代码中处理。

当您获得DeadObjectException. 您可以在中看到query方法的默认android实现ContentResolver.java

据我了解,您的应用程序不会因使用不稳定版本而导致泄漏。

至于为什么不总是选择使用不稳定的版本 - 我相信它反过来。很少有应用程序需要处理内容提供​​商崩溃并从中恢复。最简单的方法是让您的应用程序死亡并重新启动。内容提供者崩溃应该是极其罕见的——内存损坏、磁盘损坏等。除非您有自己的提供程序,但由于某些特定/奇怪的原因预计会崩溃,否则您不需要使用不稳定的版本。

如果该内容提供者的进程消失,这将关闭平台中的机制清理依赖于该内容提供者的进程。

这是杀死所有使用内容提供程序的进程的平台逻辑。这意味着如果您使用不稳定版本,您的应用程序不会被终止