package com.example.tyxiong.myapplication;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import android.widget.Toast;
/*
* ContentProvider实现数据共享>>>
* 3句概述:
* 1 ContentProvide是各应用程序之间共享数据的标准API
* 2 应用想要暴露其数据,可借用ContentProvider来实现,其它应用通过ContentResolver来操作暴露的数据.
* 3 四大组件之一需要在AndroidManifest.xml中显式配置.
*
* ContentProvider:对象6方法,insert()/delete()/update()/query()/onCreate()唯一生命周期方法/getType(Uri uri)当前Uri代表的数据的MIME类型
* 如果Uri代表的数据可能有多条记录,MIME类型字符串应以vnd.android.cursor.dir/开头 一条记录的话vnd.android.cursor.item开头.
ContentProvider就像一个网站.
使用2步:
1 要实现自己的ContentProvider就要继承基类.重写方法6方法.
2 向AndroidManiest.xml注册网站. 3属性<provider sendmessage: authorities: exported> 名称 权限(网站主机) 允许其它应用调用
Uri:资源统一标识符 content://authorities/资源
协议 (authorities)主机 资源(路径)动态改变的.如content://com.example.tyxiong.myapplication/words/2
words/2为资源部分(路径)---2为记录(ID)若后面还有,数据列
1方法 URi.parse()---String--->URi
ContentResolver:就像HttpClient(客户端),有4方法 insert()/delete()/update()/query()
使用步骤2步:
1 ContentResolver对象.. contextr的getContentResolver();
2 调用4个方法来操作ContentProvider的共享数据啦..(实现4个方法间接的是调用的ContentProvider的4个对应方法.)
**ContentProvider一般为单实例的,多个应用的ContentProvider请求会交由一个ContentProvider来处理.
ContentProvider只有一个onCreate()生命周期方法,当ContentResolver第一次访问ContentProvider时,被回调一次.
UriMatcher类:用来匹配ContentProvider的Uri.---不匹配的Uri不能访问ContentProvider.
使用3步:
1 实例化 new UriMatcher()
2 addUri()向该UriMatcher对象注册Uri authority path 标识符...解析出来匹配会返回相应标识符,#为通配符.
3 match()对象方法匹配Uri
ContentUtils类:操作Uri字符串的工具类.
2静态方法 withAppendedId(uri,id)为路径加上ID(记录)
parseId(uri)从Uri中解析出ID
操作系统的ContentProvider---系统的应用也会暴露出数据,允许访问,加权限,查Uri 同样的方法可获取 如联系人 多媒体内容.
ContentProvider数据改变时,也要添加监听来,来监听数据的改变.
ContentProvider有方法注册registerContentObserver();为指定Uri注册监听,其数据将会触发监听方法.
ContentObserver--监听器.
系统的ContentProvider
监听用户发出的短信....
Uri为content://sms/outbox 发信箱
需要权限:READ_SMS
2步:1 ContentResolver对象,注册监听.
2 调用增删改查方法.操作ContentProvider的共享的数据.
3 处理结果集Cursor
*/
public class MainActivity extends Activity {
public static final String SMS_URI = "content://sms";
ContentResolver contentResolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
contentResolver = getContentResolver();
contentResolver.registerContentObserver(Uri.parse(SMS_URI), true,
new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {//uri对应数据改变触发方法,需要有
// contentResolver.notify()哦.
super.onChange(selfChange);
Cursor cursor = contentResolver.query(Uri.parse(SMS_URI + "/outbox"), //发信箱数据改变触发
null, null, null, null);//查询所有记录.
StringBuilder sb = null;
while (cursor.moveToNext()) {
sb = new StringBuilder();
sb.append("正在向"+cursor.getString(cursor.getColumnIndex("address"))+"发送信息>>");//地址
sb.append("内容为"+cursor.getString(cursor.getColumnIndex("body")));//内容
sb.append(cursor.getString(cursor.getColumnIndex("date")));//时间
}
Toast.makeText(MainActivity.this, sb, Toast.LENGTH_SHORT).show();
}
});
}
}
ContentProvider概述 获取系统ContentProvider 发信箱
最新推荐文章于 2021-02-12 15:10:13 发布