Android总结

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 标明处出:

相关推荐