我有一个“数据中心”,其中包含我希望从其他外部应用程序访问的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();
}