Android-ContentProvider使用

Android-ContentProvider使用

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

Android-ContentProvider使用

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

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文件里注冊这个类

<provider android:name="MyContentProvider" android:authorities="com.chengzhi.myprovider"(可以自己定义)></provider>

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 虚拟机连不上网怎么办

    虚拟机连不上网怎么办 打开 控制面板\网络和Internet\网络和共享中心,单击更改适配器设置 2 右击本地连接,点击共享,勾选允许其他网络用户通过此计算机的Internet连接来连接(N)  文本框下选择 VMwareNetworkAdapterVMnet8 即VMwareNAT连接模式的网卡 3 右击VMwareNetworkAdapter…

  • C++ 顶层 const

    C++ 顶层 const

  • 阿里云设置端口访问、使用_阿里云服务器端口号

    阿里云设置端口访问、使用_阿里云服务器端口号登录阿里云账号后,点击控制台点击自定义视图→再点击云服务器ECS点击实例id进入实例:点击本实例安全组:点击安全组id或者配置规则进入安全组规则配置界面,可以选择添加方式,这里以手动添加作为演示点击手动添加后,会出现添加栏,我们配置521端口,源选择0.0.0.0/0(意思是开放给所有人),最后点击保存放行端口就设置完毕了此外也可以从另一个地方进入本地实例安全组:(1)点击云服务器ECS后(上述步骤3)进入实例页面后,可以直接点击实例(2)选择自..

  • 查看linux内核版本号的方法_查看系统型号命令

    查看linux内核版本号的方法_查看系统型号命令小编给大家分享一下关于查看Linux系统版本、内核版本、查看Linux的IP地址以及Terminal终端最常用到的几个命令符:一、查看Linux系统版本(cat/etc/issue或者lsb_release-a)二、查看Linux内核版本命令(cat/proc/version或者uname-a)三、查看Linux的IP地址:四、常用命令:1、tab键命令补全2、cle…

    2022年10月10日
  • Java 程序员们值得一看的好书推荐

    Java 程序员们值得一看的好书推荐“学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会。个人认为看书有两点好处:能出版出来的书一定是经过反复的思考、雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他资料对着书上的代码自己敲的时候方便“看完书之后再次提升自我的最好途径是看一些相关的好博文“,我个人认为这是学习的第二步,因为一本书往往有好几百页,好的博文是自己看书学习之后的一些总结和提

  • latex插入编号{itemize}和{enumerate}

    latex插入编号{itemize}和{enumerate}{itemize}命令 {itemize}命令对文本进行简单的排列,不是采用序号,而是实心圆点符号。这个命令需要和\item配合使用。作为演示,输入如下代码;编译后可以看出在每一段前都加上了实心圆点符号进行排列。 如果我们不想使用…

    2022年10月22日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号