Android-Contentprovider
contentProvider对外共享数据,统一数据访问接口,多个项目可以访问。
1. Uri
Uri的作用为互联网上所涉及的所有资源——HTML文档,图像,视频片段,程序等,提供一种统一 的唯一标识。
Uri的组成:
协议(scheme)+该资源的主机名称或IP地址+主机资源的主题地址
示例:/u.mp4
将一个字符串转换成Uri。Uri.parse();
Uri uri=Uri.parse(“content://com.example.hxx/word/2”);
2. ContentProvider
一:开发ContentProvider步骤:
1.定义自己的ContentProvider类,并继承ContentProvider基类,并实现oncreat,gettype,insert,delete,query,update,方法。
2.向Android清单文件(AndroidManifest.xml)的“application”标签注册此ContentProvider。需注册“name”和“authorities”属性。
为了实现Contentprovider的方法,需要确定能匹配的Uri,确定Uri参数所操作的数据需用到UriMatcher工具类。
UriMatcher的两个方法:
1,addURI(String authorities,String path,int code):此方法用于注册访问ContentProvider的Uri。
Static{
UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
Matcher.addURI(“com.example.hxx”,”info”,1);
Matcher.addURI(“com.example.hxx”,”info/#”,0);
}
2,matcher(Uri uri)根据注册的Uri返回指定的标识码。对于输入的Uri进行匹配,若找不到,返回-1。
Switch(matcher.matcher(uri)){
case 1:
***
break;
case 0:
***
break;
default:
throw new IllegalArgumentException("URI" + uri + "无法解析!"); }
定义ContentProvider类先注册ContentProvider
Static{
UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
Matcher.addURI(“com.example.hxx”,”info”,1);
Matcher.addURI(“com.example.hxx”,”info/#”,0);
}
实现方法:
···Gettype方法:返回指定Uri参数对应的数据的MIME类型
Switch(matcher.matcher(uri)){
case 1:
return “vnd.android.cursor.dir/info”
break;
case 0:
return “vnd.android.cursor.item/info”
break;
default:
throw new IllegalArgumentException("URI" + uri + "无法解析!"); }
···Insert方法:添加数据
Uri insert(Uri uri, ContentValues values)
参数1:需要操作的ContentProvider数据的Uri
参数2:需要插入的值
根据传入的Uri判断指定的标识码,并进行匹配,执行添加数据操作。
switch (matcher.match(uri)) {
case CONTACTS:
long id = 添加数据;//返回指定列的ID值
Uri insertUri = ContentUris.withAppendedId(uri, id);
return insertUri;
default:
throw new IllegalArgumentException("URI" + uri + "无法解析!");
}
···Update方法:更新数据
int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 参数1:需要操作的ContentProvider数据的Uri
参数2:需要修改的值
参数3:需要修改条件语句
参数4:需要修改条件对应的值
int rowNum = 0;
switch (matcher.match(uri)) {
case CONTACTS:
rowNum =更新数据;//返回删除的行数
return rowNum;
case CONTACT:
long id = ContentUris.parseId(uri);
String whereClause = "_id=" + id;
if (selection != null) {
whereClause += "and" + selection;
}
rowNum =更新数据;//返回删除的行数
return rowNum;
default:
} throw new IllegalArgumentException("URI" + uri + "无法解析!");
···delete方法:删除数据
int delete(Uri uri, String selection, String[] selectionArgs)
参数1:需要操作的ContentProvider数据的Uri
参数2:删除条件语句
参数3:删除条件中占位符对应值
int rowNum = 0;
switch (matcher.match(uri)) {
case CONTACTS:
rowNum = 删除数据;
return rowNum;
case CONTACT:
long id = ContentUris.parseId(uri);
String whereClause = "_id=" + id;
if (selection != null) {
whereClause += "and" + selection;
}
rowNum = 删除数据;
return rowNum;
default:
throw new IllegalArgumentException("URI" + uri + "无法解析!");
}
···query方法:查询数据
Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 参数1:需要操作的ContentProvider数据的Uri
参数2:查询显示的列
参数3:查询条件
参数4:查询条件对应值
参数5:排序
Cursor cur;
switch (matcher.match(uri)) {
case CONTACTS:
cur=查询数据;
return cur; case CONTACT: long id = ContentUris.parseId(uri); String whereClause = "_id=" + id; if (selection != null) { whereClause += "and" + selection; } cur=查询数据; return cur; default: } throw new IllegalArgumentException("URI" + uri + "无法解析!");
二:在项目中使用定义好的ContentProvider要用到ContentResolver对象 Activity.getContentResolver方法获取ContentResolver对象。
ContentResolver对象操作数据的方法:
Insert():添加数据
Update():更新数据
Delete():删除数据
Query():查询数据
3. ContentObserver
对ContentProvider数据进行监听
注册监听:registerContentObserver
重写OnChange()方法
数据变化通知:
getContext().getContentResolver().notifyChange(uri, null);
Uri为数据变化的ContentProvider的Uri。
4. 系统ContentProvider
管理联系人的Uri:
content://contacts/people //本地联系人列表信息
content://contacts/phones //本地联系人列表信息
content://call_log/calls/ //本地通话记录
管理系统短信的Uri;
content://sms
系统多媒体的Uri管理:
存储在外部内存上的音频,图片,视频文件ContentProvider的Uri: MediaStore.Audio. Media/Images/Video.EXTERNAL_CONTENT_URI 存储在手机上的音频,图片,视频文件ContentProvider的Uri: MediaStore.Audio. Media/Images/Video.INTERNAL_CONTENT_URI
第二篇:android Handler整理总结
android:Handler整理总结 收藏
首先声明,以下是我转载整理的。
感谢
/Android_Tutor/archive/2010/05/08/5568806.aspx
/20100814/45.html
这些朋友的共享!
当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序还会挂掉。Handler就是把这些功能放到一个单独的线程里执行,与Activity互不影响。
我们简单用例子来说明:
小实例一:5秒钟更新一下Title(标题),如图:
代码如下:
view plaincopy to clipboardprint?
package com.android.tutor;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class HandlerDemo extends Activity {
// title为setTitle方法提供变量,这里为了方便我设置成了int型
private int title = 0;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
updateTitle();
break;
}
};
};
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new MyTask(), 1, 5000); }
private class MyTask extends TimerTask {
@Override
public void run() {
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);
}
}
public void updateTitle() {
setTitle("Welcome to Mr Wei's blog " + title);
title++;
}
}
package com.android.tutor;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class HandlerDemo extends Activity {
// title为setTitle方法提供变量,这里为了方便我设置成了int型 private int title = 0;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
updateTitle();
break;
}
};
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new MyTask(), 1, 5000);
}
private class MyTask extends TimerTask {
@Override
public void run() {
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);
}
}
public void updateTitle() {
setTitle("Welcome to Mr Wei's blog " + title);
title++;
}
}
小实例二:用Handler更新进度条ProgressBar ;如图:当按开始按钮时,进度条会每隔500毫秒加1,直到加到100或者按停止时停止
代码:
view plaincopy to clipboardprint?
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class main extends Activity {
/** Called when the activity is first created. */
ProgressBar pb1;
Handler handle = new Handler();
// 新建一个Handler对象
Button b1;
Button b2;
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main);
pb1 = (ProgressBar) findViewById(R.id.pb1); pb1.setProgress(0);
b1 = (Button) findViewById(R.id.b1);
b1.setOnClickListener(b1Lis);
b2 = (Button) findViewById(R.id.b2);
b2.setOnClickListener(b2Lis);
}
private OnClickListener b1Lis = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub handle.post(add);
// 开始执行add
}
};
private OnClickListener b2Lis = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
handle.removeCallbacks(add);
// 停止执行
pb1.setProgress(0);
}
};
int pro = 0;
Runnable add = new Runnable() {
// 定义add
@Override
public void run() {
// TODO Auto-generated method stub
pro = pb1.getProgress() + 1;
pb1.setProgress(pro);
setTitle(String.valueOf(pro));
if (pro < 100) {
handle.postDelayed(add, 500);
// 如果进度小于100,,则延迟500毫秒后重复执行add }
}
};
}
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class main extends Activity {
/** Called when the activity is first created. */
ProgressBar pb1;
Handler handle = new Handler();
// 新建一个Handler对象
Button b1;
Button b2;
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); pb1 = (ProgressBar) findViewById(R.id.pb1); pb1.setProgress(0); b1 = (Button) findViewById(R.id.b1); b1.setOnClickListener(b1Lis); b2 = (Button) findViewById(R.id.b2); b2.setOnClickListener(b2Lis); } private OnClickListener b1Lis = new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub handle.post(add); // 开始执行add } }; private OnClickListener b2Lis = new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub handle.removeCallbacks(add); // 停止执行 pb1.setProgress(0); } }; int pro = 0; Runnable add = new Runnable() { // 定义add @Override public void run() { // TODO Auto-generated method stub pro = pb1.getProgress() + 1; pb1.setProgress(pro); setTitle(String.valueOf(pro)); if (pro < 100) { handle.postDelayed(add, 500);
// 如果进度小于100,,则延迟500毫秒后重复执行add }
}
};
}
本文来自CSDN博客,转载请/wufenglong/archive/2010/08/27/5843513.aspx 标明处出: