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

时间:2013-06-20 22:13:54

标签: android android-contentresolver

我已阅读Android ContentResolver

上的文档

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

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

final Bundle     call(Uri uri, String method, String arg, Bundle extras)
Call a provider-defined method.

所以在我的代码中执行:

getContentResolver().call(uri, method, arg, extras);

但始终会返回 null 捆绑。实际上,提供程序中的方法永远不会被调用。

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

Bundle   call(String method, String arg, Bundle extras)
Call a provider-defined method.

我显然不理解某事。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:6)

  

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

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

  

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

是的,正如您在this sample ContentProvider中看到的那样:

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

    return(null);
  }

但是,您的构建目标(例如,在Eclipse,Project&gt; Properties&gt; Android中)必须设置为API级别11或更高。

来自the client的相应call()如下所示:

getContentResolver().call(Provider.Constants.CONTENT_URI,
                          Provider.SET_KEY_METHOD, "sekrit", null);
  

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

这不是它的工作原理。 call() ContentResolver上的call() ContentProvider {{1}}。{/ 1}

答案 1 :(得分:2)

要回答您的第二个问题,我的猜测是ContentProvider call()Uri版本不需要ContentResolver参数,因为与ContentProvider不同,它不会需要找到{{1}};它自己调用方法。