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

Android-ContentProvider使用的更多相关文章

  1. Android基础 : Android ContentProvider

    Android 应用程序通过ContentProvider实现方式统一的数据共享功能. 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activi ...

  2. Android ContentProvider完整案例

    ContentData类,提供数据常量: /** * 提供ContentProvider对外的各种常量,当外部数据需要访问的时候,就可以参考这些常量操作数据. * @author HB * */ pu ...

  3. Android ContentProvider基本用法

    转自:https://www.jianshu.com/p/601086916c8f 一.基本概念 ContentProvider是Android系统中提供的专门用户不同应用间进行数据共享的组件,提供了 ...

  4. Android ContentProvider 启动分析

    对于 ContentProvider 还不是很熟悉的同学,可以阅读上一篇 Android ContentProvider 基本原理和使用详解.本文主要是对 contentProvider 的源码进行分 ...

  5. Android ContentProvider介绍

    在Android中数据的存储一共有五种形式,分别是:Shared Preferences.网络存储.文件存储,外储存储.SQLite.但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据 ...

  6. Android ContentProvider 简单学习

    当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.以前我们学习过文件的操作模式,通过指定文件的操作模式为Context.MODE_WORL ...

  7. Android ContentProvider的实现

    当Android中的应用需要访问其他应用的数据时,用ContentProvider可以很好的解决这个问题.今天介绍一下ContentProvider的用法. 首先开发ContentProvider有两 ...

  8. Android ContentProvider和Uri详解 (绝对全面)

        ContentProvider的基本概念 : 1.ContentProvider为存储和读取数据提供了统一的接口 2.使用ContentProvider,应用程序可以实现数据共享 3.andr ...

  9. Android ContentProvider和getContentResolver

    安卓系统中的数据库SqlLite操作和java中mysql的数据库操作很不一样,造成这样的原因是因为在安卓中数据库是属于进程的不存在数据库客户端,也不存在数据库服务器. 关于SqlLite数据库的文章 ...

  10. android ContentProvider学习

    1.ContentProvider提供位存储或获取数据提供了统一的接口. 2.使用ContentProvider可以在不同的应用程序之间共享数据. 3.Android为常见的一些数据提供了Conten ...

随机推荐

  1. 洛谷P1099 树网的核

    传送门 80分 $ Floyd $ 树的直径可以通过枚举求出.直径的两个端点$ maxi,maxj $ ,由此可知对于一个点 $ k $ ,如果满足 $ d[maxi][k]+d[k][maxj]== ...

  2. tcpdump使用示例

    前言 这段时间一直在研究kubernetes当中的网络, 包括通过keepalived来实现VIP的高可用时常常不得不排查一些网络方面的问题, 在这里顺道梳理一下tcpdump的使用姿势, 若有写的不 ...

  3. openj 4004 01背包问题求方案数

    #include<iostream> #include<cstring> #include<cstdio> using namespace std; #define ...

  4. linux + docker + selenium grid 实现分布式执行selenium脚本

    Selenium Grid 有两个概念 hub :主节点,你可以看作 "北京总公司的测试经理". node:分支节点,你可以看作 "北京总公司的测试小兵A" 和 ...

  5. 51nod1185 威佐夫游戏 V2 (模拟乘法)

    1185 威佐夫游戏 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取 ...

  6. Extjs MVC模式开发,循序渐进(一)

    本文讲述extjs mvc的Helloworld,tabPanel,event,页面布局layout等内容. 本页包含:MVC模式案例(一)~MVC模式案例(六),从搭建extjs mvc到点击按钮生 ...

  7. 《剑指offer》-逐层打印二叉树

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 乍一看就是一个BFS,但是因为太久没刷题都忘记了要使用queue来作为空间存储容器了. 先参考milolip的代码,写出这样 ...

  8. tomcat启动慢解决方案

    一.环境 centos6.7  tomcat8    jdk1.8 二.现象 启动tomcat会花费10多分钟,正常情况下几秒就可以了. 三.解决办法 度娘了一下是因为jdk在生成随机数上耗时,找到j ...

  9. linux下实现shell脚本自动连接mongodb数据库并创建索引

    在linux下创建shell脚本

  10. BZOJ1263 [SCOI2006]整数划分 高精度

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1263 题意概括 将n写成若干个正整数之和,并且使这些正整数的乘积最大. 例如,n=13,则当n表示 ...