声明:转载请注明出处:http://blog.csdn.net/Hello_Chillax/article/details/45669473

开题:对android稍微有些了解的朋友都知道,android中有四大组件,分别是:Activity,Service,ContentProvider,BrocastReserver。今天来介绍其一:ContentProvider。

ContentProvider:
顾名思义,内容提供者。实现了不同程序之间数据的分享。简单地说,就是程序B可以通过得到程序A中的Provider来获取A中的数据。

下面通过一个例子来讲解ContentProvider的完整使用过程。

1 首先我们来创建提供数据的程序A:

1.1 创建一个Provider:

public class MyProvider extends ContentProvider {    private static final String AUTHORITY = "com.example.a_provider.MyProvider";    private static final int INSERT_CODE = 0;    private static final int DELETE_CODE = 1;    private static final int UPDATE_CODE = 2;    private static final int QUARY_CODE = 3;    private static UriMatcher uriMatcher;    static {        // 静态代码块,只在创建之初执行一次        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);        // 添加访问的方式:        // 添加插入操作:AUTHORITY/insert,下面的类似        //查找时可以用:content://com.example.a_provider.MyProvider/insert        uriMatcher.addURI(AUTHORITY, "insert", INSERT_CODE);        // 同上,删        uriMatcher.addURI(AUTHORITY, "delete", DELETE_CODE);        // 改        uriMatcher.addURI(AUTHORITY, "update", UPDATE_CODE);        // 查单个数据        uriMatcher.addURI(AUTHORITY, "quary", QUARY_CODE);    }    @Override    public boolean onCreate() {        return true;    }    @Override    public Cursor query(Uri uri, String[] projection, String selection,            String[] selectionArgs, String sortOrder) {        // 查询是否是匹配该内容提供者的authority,这里authority的作用就体现出来了。                switch (uriMatcher.match(uri)) {                // 如果返回码是QUARY_CODE,说明应该执行query操作:                case QUARY_CODE:                    return null;                default:                    throw new IllegalArgumentException("not match query!");                }    }    @Override    public String getType(Uri uri) {        return "vnd.android.cursor.item" ;    }    @Override    public Uri insert(Uri uri, ContentValues values) {        // 查询是否是匹配该内容提供者的authority,这里authority的作用就体现出来了。        switch (uriMatcher.match(uri)) {        // 如果返回码是INSERT_CODE,说明应该执行insert操作:        case INSERT_CODE:            return Uri.parse("insert success");        default:            throw new IllegalArgumentException("not match insert!");        }    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        // 查询是否是匹配该内容提供者的authority,这里authority的作用就体现出来了。        switch (uriMatcher.match(uri)) {        // 如果返回码是DELETE_CODE,说明应该执行delete操作:        case DELETE_CODE:            return 0;        default:            throw new IllegalArgumentException("not match delete!");        }    }    @Override    public int update(Uri uri, ContentValues values, String selection,            String[] selectionArgs) {        // 查询是否是匹配该内容提供者的authority,这里authority的作用就体现出来了。        switch (uriMatcher.match(uri)) {        // 如果返回码是UPDATE_CODE,说明应该执行update操作:        case UPDATE_CODE:            return 0;        default:            throw new IllegalArgumentException("not match update!");        }    }}

1.2 然后需要在manifest中声明这个provider,和Activity类似。

<provider  <!-- android:exported必须设置为true,否则外界访问不到 --> android:exported="true" android:name="com.example.a_provider.MyProvider" <!-- 设置provider的主机名,也就是外界通过这个字符串来找到这个provider。 --> android:authorities="com.example.a_provider.MyProvider" <!-- 设置访问该provider所需要声明的权限(以前都是使用权限,这里我们反过来给使用者设置权限) --> <!-- 权限的名字是随便起的,只要是不重复就行,而且权限的数目也不固定 --> android:readPermission="aa.bb.cc.reader" android:writePermission="aa.bb.cc.writer" > </provider>

1.3 我们为访问这个provider的程序提供了两个permission,需要声明一下

<permission android:name="aa.bb.cc.reader" >    </permission>    <permission android:name="aa.bb.cc.writer" >    </permission>

好了,到此,我们的provider已经设置成功了。

2 然后我们来调用这个provider。

2.1 在MainActivity中:

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        insert();    }    public void insert(){    //这里的Uri就是provider的访问路径,还记得我们上面设置的那个authorities吗,这里用到了:content://authorities/#    //使用的格式是:        Uri uri=Uri.parse("content://com.example.a_provider.MyProvider/insert");        //内容提供者访问对象:        ContentResolver resolver=getContentResolver();        ContentValues values=new ContentValues();        //可以添加数据        values.put("凤姐", 20);        //进行插入操作:        Uri uri2 =resolver.insert(uri, values);        //输出结果:uri2:inset success        System.out.println("uri2:"+uri2.toString());    }

2.2 最后,别忘了再manifest中声明权限:

<uses-permission android:name="aa.bb.cc.writer"/><uses-permission android:name="aa.bb.cc.reader"/>

至此,我们实现了provider的创建,设置权限,并通过另一个程序进行访问,整个流程就是这么简单~

OK,有不懂的欢迎留言询问。demo很简单,不用提供了吧~

更多相关文章

  1. Android(安卓)的提权 (root) 原理是什么?
  2. Android(安卓)系统常用权限
  3. Android访问WCF服务(使用json实现参数传递)
  4. Android灯光系统(硬件访问服务框架)
  5. Android四大组件之~~ContentProvider
  6. Android(安卓)是否前台运行
  7. Android(安卓)10 定位问题,获取NMEA(支持5.0~10.0)
  8. Android(安卓)版本兼容 — Android(安卓)6.0 和 7.0后获取Mac地
  9. Android(安卓)给 app默认权限(不弹窗申请权限)

随机推荐

  1. andriod 4.0以上版本不调用onConfigratio
  2. Android(安卓)抽象回调函数以及接口回调
  3. coredump在Android上的应用
  4. Android(安卓)虚拟按键驱动实现
  5. android 信息(mms)的故事(五)-- 发彩信
  6. android支持有线网--网络上看到
  7. Android(安卓)源代码编后的目录分析
  8. android中实现返回首页功能
  9. android 存储简要分析
  10. Haisi3716C (海思)源代码 编译并烧写