如何使外部应用程序的内容提供程序保持运行

时间:2018-02-17 18:49:04

标签: android android-service android-contentprovider shared

我有一个“数据中心”,其中包含我希望从其他外部应用程序访问的ContentProvider。到目前为止,我已成功设置了所需的权限和合同类,以通过ContentResolver访问数据,只要数据中心应用程序仍在运行,该工作就可以正常运行。如果我关闭数据中心,似乎ContentResolver会关闭它(例如CursorLoader.LoadInBackgroundv返回null)。因此,即使拥有应用程序关闭,我也会尝试找到一种方法来保持提供程序处于活动状态。我最初的想法是在远程流程服务中运行提供程序,但我找不到任何具体的实现,我太新了,不相信我的直觉并烧毁我的电池。据我所知,这是一个相当常见的用例场景,所以有人知道如何使ContentProvider适用于外部应用程序,即使主应用程序已关闭吗?

修改

以下是我遇到问题的代码。当包含ContentProvider的应用正在运行时,会加载cursor。否则,它是null。所以要重申这个问题,我是否需要保持ContentProvider的应用程序运行,或者我可以将提供程序移动到一个单独的远程进程中,即使应用程序关闭它也会继续运行吗?

    private IReadOnlyCollection<ITranslationData> ReadTranslations(string selection, string[] selectionArgs)
    {
        var uri = TranslationConstants.ContentUri;
        string[] projection =
        {
            TranslationConstants.Id,
            TranslationConstants.Name,
            TranslationConstants.Abbrev,
            TranslationConstants.Info,
            TranslationConstants.OsisUrl
        };

        var loader = new CursorLoader(this.context, uri, projection, selection, selectionArgs, TranslationConstants.Abbrev);
        var cursor = loader.LoadInBackground() as ICursor;

        var translations = new List<ITranslationData>();
        if (cursor.MoveToFirst())
        {
            var hasData = true;
            while (hasData)
            {
                translations.Add(new TranslationData(
                    cursor.GetInt(cursor.GetColumnIndex(TranslationConstants.Id)),
                    cursor.GetString(cursor.GetColumnIndex(TranslationConstants.Name)),
                    cursor.GetString(cursor.GetColumnIndex(TranslationConstants.Abbrev)),
                    cursor.GetString(cursor.GetColumnIndex(TranslationConstants.Info)),
                    cursor.GetString(cursor.GetColumnIndex(TranslationConstants.OsisUrl))));

                hasData = cursor.MoveToNext();
            }
        }

        return translations.AsReadOnly();
    }

0 个答案:

没有答案