【问题标题】:How and when to use a ContentProviderClient obtained using acquireUnstableContentProviderClient?如何以及何时使用通过 acquireUnstableContentProviderClient 获得的 ContentProviderClient?
【发布时间】:2015-11-07 01:29:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: android android-contentprovider


    【解决方案1】:

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

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

    当您收到DeadObjectException 时,您需要为不稳定版本编写额外的代码来处理恢复。你可以在ContentResolver.java中看到query方法的默认android实现

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

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

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

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

    【讨论】:

    • 感谢您的回答。您能否指出当 ContentProvider 消失时,AOSP android 会在哪里杀死持有 ContentProviderClient 的进程?另外,正如我在问题中提到的那样,我相信 ContentProvider 可能会因为崩溃而消失,那么当您连接到另一个 APK 中的 ContentProvider 并且该 APK 重新安装了更新版本时呢?跨度>
    • 我会尝试查找进程被杀死的位置。至于重新安装 APK,属于该 APK 的任何进程都会被杀死——不仅仅是内容提供者。提供程序在下次任何应用程序访问它时启动。这部分启动内容提供者的代码在ActivityManagerService.java::startProcessLocked()
    • 当远程 ContentProvider 因崩溃而死时,我没有看到在持有通过 ContentResolver#acquireContentProviderClient 获得的活动 ContentProviderClient 的进程中发生任何崩溃。我在这里发布了我的测试代码:github.com/satur9nine/AndroidCallTest 我将尝试另一个测试,其中 ContentProvider 实际上位于另一个 APK 中,并且在 ContentProviderClient 处于活动状态时卸载了 APK。
    • 不要介意我之前的评论。 Android 有点古怪,因为当一个线程抛出未捕获的异常时,它会保持其他线程运行,直到用户关闭崩溃对话框。如果在持有稳定的 ContentProviderClient 时发生崩溃,则该持有过程确实会崩溃。如果 ContentProviderClient 不稳定,那么你会得到android.os.DeadObjectException
    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多