内容提供者
来源:互联网 发布:淘宝网君子兰小苗价格 编辑:程序博客网 时间:2024/04/26 08:01
内容提供者
一、内容提供者是android 四大组件之一。
内容提供者包括三个部分:内容提供者(ContentProvider)、访问内容提供者(ContentResolver)、内容观察者(ContentObserver)
1.ContentProvider是不同应用程序之间进行数据交换的标准API,它以URI的形式对外提供数据,允许其他应用操作本应用数据。其他应用使用ContentResolver,并根据ContentProvider提供的URI操作制定数据。
2.ContentObserver是用来观察制定URI所代表的数据。当ContentObserver观察到指定的URI发生变化时,就会触发ContentObserver的onchange 方法。在此方法中使用ContentResolver就可以查询到变化的数据。
二、短信备份
1.布局文件
在住布局文件中添加一个Button按钮
<Button
android:id="@+id/button"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="备份短信"
android:onClick="click"/>
2.Activity
public class MainActivityextends AppCompatActivity {
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void click(View view){
//创建用来查询系统短信的 uri
Uri uri = Uri.parse("content://sms/");
//获取 ContentResolver 对象
ContentResolver resolver = getContentResolver();
//通过 ContentResolver 对象查询系统短信
Cursor cursor = resolver.query(uri,newString []{"address","date","type","body"},null,null,null,null);
List<SmsInfo> smsInfoList = new ArrayList<>();
while(cursor.moveToNext()){
String address = cursor.getString(0);
long date = cursor.getLong(1);
int type = cursor.getInt(2);
String body = cursor.getString(3);
SmsInfo smsInfo = new SmsInfo(date,type,body,address);
smsInfoList.add(smsInfo);
}
cursor.close();
SmsUtils.backupSms(smsInfoList,this);
}
}
3.SmsInfo方法
public class SmsInfo {
private long date;
private int type;
private String body;
private String address;
private int id;
public SmsInfo(){}
public SmsInfo(longdate,int type,String body,String address,intid){
this.date= date;
this.body= body;
this.address= address;
this.id= id;
}
public SmsInfo(longdate,int type,String body,String address){
this.date= date;
this.body= body;
this.address= address;
}
public long getDate() {
return date;
}
public void setDate(longdate) {
this.date= date;
}
public int getType() {
return type;
}
public void setType(inttype) {
this.type= type;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body= body;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address= address;
}
public int getId() {
return id;
}
public void setId(intid) {
this.id= id;
}
}
4.工具类
public class SmsUtils {
public static void backupSms(List<SmsInfo> smsinfos, Context context){
try {
XmlSerializer serializer = Xml.newSerializer();
File file = new File(Environment.getExternalStorageDirectory(),"sms.xml");
FileOutputStream os = new FileOutputStream(file);
//初始化序列器号,指定 xml 数据写入到那个文件中,并指定文件的编码方式
serializer.setOutput(os,"utf-8");
serializer.startDocument("utf-8",true);
//创建根节点
serializer.startTag(null,"smss");
for(SmsInfo info : smsinfos){
//创建父节点开始标签
serializer.startTag(null,"sms");
serializer.attribute(null,"id",info.getId()+"");
//创建子节点body
serializer.startTag(null,"body");
serializer.text(info.getBody());
serializer.endTag(null,"body");
//创建子节点 address
serializer.startTag(null,"address");
serializer.text(info.getAddress());
serializer.endTag(null,"address");
//创建子节点 type
serializer.startTag(null,"type");
serializer.text(info.getType()+"");
serializer.endTag(null,"type");
//创建子节点 date
serializer.startTag(null,"date");
serializer.text(info.getDate()+"");
serializer.endTag(null,"date");
//父节点结束标签
serializer.endTag(null,"sms");
}
serializer.endTag(null,"smss");
serializer.endDocument();
os.close();
Toast.makeText(context,"备份成功",Toast.LENGTH_SHORT).show();
Log.d("SmsUtils","backupSms: "+file);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context,"备份失败",Toast.LENGTH_SHORT).show();
}
}
}
5.添加权限
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
三、短信接收器
重点看
1.布局文件:在住布局文件中添加一个TextView
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="短信内容"/>
2.MainActivity文件
public class Main2Activityextends AppCompatActivity {
private TextView textView;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
textView = (TextView) findViewById(R.id.textview);
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://sms/");
//注册内容观察者
resolver.registerContentObserver(uri,true,newMyObserve(new Handler()));
}
public class MyObserveextends ContentObserver{
/**
* Creates a content observer.
*
* @paramhandler The handler to run {@link#onChange} on, or null if none.
*/
publicMyObserve(Handler handler) {
super(handler);
}
//当内容观察者观察到数据库发生变化了,调用这个方法
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public voidonChange(boolean selfChange) {
super.onChange(selfChange);
Toast.makeText(Main2Activity.this,"数据库发生变化了", Toast.LENGTH_SHORT).show();
Uri uri = Uri.parse("content://sms/");
//获取 contentresolver 对象
ContentResolver resolver = getContentResolver();
//查询变化的数据
Cursor cursor = resolver.query(uri,newString [] {"address","date","type","body"},null,null,null,null);
//获取最新的短信
cursor.moveToLast();
String address = cursor.getString(0);
String body = cursor.getString(3);
//更改UI界面
textView.setText("短信内容"+body+"\n"+"短信地址"+address);
cursor.close();
}
}
}
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 非凸问题与凸问题求解
- 为什么使用 Linux 和开源软件?
- 【Machine Learning】使用随机森林进行特征选择
- Spring注入值到bean四中方式
- could not find the main class : program will exit解决方案
- 内容提供者
- [sicily] 1003. 相连的1
- JSP状态管理
- java四类八种基本数据类型
- Hibernate的初探
- JAVA基础-数组
- 高性能MYSQL(复制)
- bzoj 3681: Arietta 主席树优化建图+网络流+dsu on tree
- 企业的组织架构对技术架构的影响