前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android-ContentProvider使用

Android-ContentProvider使用

作者头像
全栈程序员站长
发布2022-07-11 09:47:33
2820
发布2022-07-11 09:47:33
举报

大家好,又见面了,我是全栈君。

Android-ContentProvider使用

一 建立ContentProviderserver端 1 建立一个继承自ContentProvider的类并重写接口方法(这里仅打一些log做代表)

代码语言:javascript
复制
package com.chengzhi.androidcontentprovider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
import android.widget.Toast;

/** * ContentProvider的server端类 * @author chengzhi * */
public class MyContentProvider extends ContentProvider {
    1。 //重写delete方法
    @Override
    public int delete(Uri arg0, String arg1, String[] arg2)
    {
        // TODO Auto-generated method stub
        if (arg0.getAuthority().contains("com.chengzhi.androidcontentprovider"))
        {
            Log.i("chengzhi log", "delete");
        }
        return 0;
    }
    2。 //重写getType方法
    @Override
    public String getType(Uri arg0)
    {
        // TODO Auto-generated method stub
        if (arg0.getAuthority().contains("com.chengzhi.androidcontentprovider"))
        {
            Log.i("chengzhi log", "getType");
        }
        return null;
    }
    3, //重写insert方法
    @Override
    public Uri insert(Uri arg0, ContentValues arg1)
    {
        // TODO Auto-generated method stub
        if (arg0.getAuthority().contains("com.chengzhi.androidcontentprovider"))
        {
            Log.i("chengzhi log", "insert");
        }
        return null;
    } 
    @Override
    public boolean onCreate()
    {
        // TODO Auto-generated method stub
        return false;
    }
    4, //重写query方法
    @Override
    public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
            String arg4)
    {
        // TODO Auto-generated method stub
        if (arg0.getAuthority().contains("com.chengzhi.myprovider"))
        {
            Log.i("chengzhi log", "query");
        }
        return null;
    }
    5。 //重写update方法
    @Override
    public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3)
    {
        // TODO Auto-generated method stub
        if (arg0.getAuthority().contains("com.chengzhi.androidcontentprovider"))
        {
            Log.i("chengzhi log", "updata");
        }
        return 0;
    }

}

2 在manifest文件里注冊这个类

代码语言:javascript
复制
<provider android:name="MyContentProvider" android:authorities="com.chengzhi.myprovider"(可以自己定义)></provider>

二 建立client的类 主要使用ContentResolve对象来操作server端的接口方法 //设置一个按钮的事件监听

代码语言:javascript
复制
Button _buttonQuery = (Button)findViewById(R.id.buttonQuery);
        _buttonQuery.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View arg0)
            {
                // TODO Auto-generated method stub
                ContentResolver _contentResolver = getContentResolver();
                //必须加上content://标准前缀
                Cursor _cursor = _contentResolver.query(Uri.parse("content://com.chengzhi.myprovider"), null, null, null, null);

            }
        });

三 注意 1 在server端查询方法中。使用getContentResolver().query()后,尽量使用startManagerCursor(Cursor)方法来将Cursor的 生命周期托管给当前的Activity。这样Cursor的生命周期和Activity便可以自己主动同步,防止当前的Activity退出后,cursor依旧存在导致内存泄露

2 当前Activity调用另外一个没有启动的进程的ContentProvider, 将当前项目的manifest文件里的provider中的android:multiprocess=”true”即同意其它进程訪问

3 ContentProVider的机制 在程序安装和卸载的时候,会将ContentProvider类register和unregister到系统的ProviderManager中。 当使用ContentResolver来传入Uri的时候 在Providermanager中在链表找到该Uri来匹配并启动不同的进程 因此进程不是通过Activity启动。而是通过Provider来启动的 binder机制

4 宿主进程的生命周期 接收调用的时候启动宿主进程,操作完成后,宿主进程为empty

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115215.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年2月7,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档