什么是getContentResolver().call()以及如何使用它

Roy*_*ley 3 android android-contentresolver

我已阅读有关Android ContentResolver的文档

我也搜索了一个合适的例子无济于事.

根据文档,call当标准内容提供程序方法不足时,有一种方法可用作访问自定义提供程序方法的方法:

final Bundle     call(Uri uri, String method, String arg, Bundle extras)
Call a provider-defined method.
Run Code Online (Sandbox Code Playgroud)

所以在我的代码中我执行:

getContentResolver().call(uri, method, arg, extras);
Run Code Online (Sandbox Code Playgroud)

但它总是返回 null 捆绑.实际上,提供程序中的方法永远不会被调用.

进一步的研究指出合同的(感知​​的)差异,其中RESOLVER具有uri参数而没有等效的PROVIDER参数:

Bundle   call(String method, String arg, Bundle extras)
Call a provider-defined method.
Run Code Online (Sandbox Code Playgroud)

我显然不理解某事.谁能指出我正确的方向?

Com*_*are 6

进一步的研究指出合同的差异,其中RESOLVER具有uri参数而没有等效的PROVIDER参数

这就是他们写作的方式.这Uri只是为了识别ContentProvider- ContentProvider知道它是谁,因此不需要Uri.

提供者方法不允许@Override注释

是的,正如您在此示例中ContentProvider所看到的那样:

  @Override
  public Bundle call(String method, String arg, Bundle extras) {
    if (SET_KEY_METHOD.equals(method) && arg != null) {
      key=arg;
    }

    return(null);
  }
Run Code Online (Sandbox Code Playgroud)

但是,您的构建目标(例如,在Eclipse中,项目>属性> Android)必须设置为API级别11或更高级别.

相应的call(),从客户端的样子:

getContentResolver().call(Provider.Constants.CONTENT_URI,
                          Provider.SET_KEY_METHOD, "sekrit", null);
Run Code Online (Sandbox Code Playgroud)

是.我在提供程序中有一个声明为'public'的方法,该方法被传递给contentresolver参数'method'.

这不是它的工作原理.call()ContentResolver电话call()上你ContentProvider.

  • @sandrstar:"依靠这种方法是一种好习惯吗?" - 如果您是`ContentProvider`及其消费者的作者,请确定."仅定义了call()方法的ContentProvider是否显示正确的用法?" - 恕我直言,没有.`call()`充其量只是基于`ContentProvider`功能的附加组件.对于程序性工作,"ContentProvider"是无用的. (2认同)