編輯:關於android開發
一.Android四大組件
Android四大組件是Activity, Service, Content Provider,Broadcast Receiver。
Activity作為程序界面,直接與用戶交互
Service運行在後台,沒有界面,完成特定的功能
ContentProvider維護應用數據,方便應用本身或其它應用訪問
Broadcast Receiver提供異步廣播消息接收機制,便於各應用/組件進行交互
二.什麼是ContentProvider
ContentProvider(內容提供者)是Android中的四大組件之一。主要用於對外共享數據,也就是通過ContentProvider把應用中的數據共享給其他應用訪問,其他應用可以通過ContentProvider對指定應用中的數據進行操作。ContentProvider分為系統的和自定義的,系統的也就是例如聯系人,圖片等數據。
1.ContentProvider
Android提供了一些主要數據類型的ContentProvider,比如音頻、視頻、圖片和私人通訊錄等。可在android.provider包下面找到一些Android提供的ContentProvider。通過獲得這些ContentProvider可以查詢它們包含的數據,當然前提是已獲得適當的讀取權限。
主要方法:
public boolean onCreate() 在創建ContentProvider時調用 public Cursor query(Uri, String[], String, String[], String) 用於查詢指定Uri的ContentProvider,返回一個Cursor public Uri insert(Uri, ContentValues) 用於添加數據到指定Uri的ContentProvider中 public int update(Uri, ContentValues, String, String[]) 用於更新指定Uri的ContentProvider中的數據 public int delete(Uri, String, String[]) 用於從指定Uri的ContentProvider中刪除數據 public String getType(Uri) 用於返回指定的Uri中的數據的MIME類型 *如果操作的數據屬於集合類型,那麼MIME類型字符串應該以vnd.android.cursor.dir/開頭。 例如:要得到所有person記錄的Uri為content://contacts/person,那麼返回的MIME類型字符串為"vnd.android.cursor.dir/person"。 *如果要操作的數據屬於非集合類型數據,那麼MIME類型字符串應該以vnd.android.cursor.item/開頭。 例如:要得到id為10的person記錄的Uri為content://contacts/person/10,那麼返回的MIME類型字符串應為"vnd.android.cursor.item/person"。
2.ContentResolver
當外部應用需要對ContentProvider中的數據進行添加、刪除、修改和查詢操作時,可以使用ContentResolver類來完成,要獲取ContentResolver對象,可以使用Context提供的getContentResolver()方法。
ContentResolver cr = getContentResolver();ContentResolver提供的方法和ContentProvider提供的方法對應的有以下幾個方法。
public Uri insert(Uri uri, ContentValues values) 用於添加數據到指定Uri的ContentProvider中。 public int delete(Uri uri, String selection, String[] selectionArgs) 用於從指定Uri的ContentProvider中刪除數據。 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用於更新指定Uri的ContentProvider中的數據。 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用於查詢指定Uri的ContentProvider。3.Uri
Uri 代表了要操作的數據,Uri 主要包含了兩部分信息:1、需要操作的
ContentProvider;2、對ContentProvider中的什麼數據進行操作。一個Uri由以
下幾部分組成:

三、UriMatcher類使用介紹
因為Uri代表了要操作的數據,所以我們經常需要解析Uri,並從Uri中獲取數據。Android系統提供了兩個用於操作Uri的工具類,分別為UriMatcher和ContentUris 。掌握它們的使用,會便於我們的開發工作。
UriMatcher類用於匹配Uri,它的用法如下:
首先第一步把你需要匹配Uri路徑全部給注冊上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼
UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content:
//com.ljq.provider.personprovider/person路徑,返回匹配碼為1,匹配Uri注冊如下:
sMatcher.addURI("com.ljq.provider.personprovider", person", 1);
//添加需要匹配uri,如果匹配就會返回匹配碼
//如果match()方法匹配content://com.ljq.provider.personprovider/person/230路徑,返回匹配碼為2,配Uri注冊如下:
sMatcher.addURI("com.ljq.provider.personprovider", "person/#", 2);
//#號為通配符
//傳入Uri,進行匹配
switch (sMatcher.match(Uri.parse("content://com.ljq.provider.personprovider/person/10"))) {
case 1
break;
case 2
break;
default://不匹配
break;
}
注冊完需要匹配的Uri後,就可以使用sMatcher.match(uri)對輸入的uri進
Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person")
Uri resultUri = ContentUris.withAppendedId(uri, 10);
//生成後的Uri為:content://com.ljq.provider.personprovider/person/10
parseId(uri)用於從路徑中獲取Id,如下:
Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person/10")
long personid = ContentUris.parseId(uri);
//獲取的結果為:10
public class PersonContentProvider extends ContentProvider {
public Uri insert(Uri uri, ContentValues values) {
db.insert("person", "personid", values);
getContext().getContentResolver().notifyChange(uri, null);
}
}
如果ContentProvider 的訪問者需要得到數據變化通知,必須使用ContentObserver對數據(數據采用Uri描述)進行監聽,當監聽到數據變化通知時,系統就會調用ContentObserver的onChange()方法,如下:
getContentResolver().registerContentObserver(Uri.parse("content://com.ljq.providers.personprovider/person"),
true, new PersonObserver(new Handler()));
public class PersonObserver extends ContentObserver{
public PersonObserver(Handler handler) {
super(handler);
}
public void onChange(boolean selfChange) {
//此處可以進行相應的業務處理
}
}
public class FirstContentProvider extends ContentProvider {
// UriMatcher類主要用來匹配Uri
private static final UriMatcher uriMatcher = new UriMatcher(
UriMatcher.NO_MATCH);
private MySqlite mysqlite;
static {
// 注冊向外部程序提供的Uri
uriMatcher.addURI(UserInfo.AUTOR, "userinfo", 1);
uriMatcher.addURI(UserInfo.AUTOR, "userinfoall", 2);
}
//刪除數據
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int number = 0;
if (uriMatcher.match(uri) == 1) {
// 根據條件刪除數據,並獲取刪除的行數
number = mysqlite.getReadableDatabase().delete("user_info",
selection, selectionArgs);
}
// 通知數據已經改變
getContext().getContentResolver().notifyChange(uri, null);
return number;
}
@Override
public String getType(Uri uri) {
return null;
}
//插入數據
@Override
public Uri insert(Uri uri, ContentValues values) {
String name = values.getAsString(UserInfo.User.NAME).toString();
String age = values.getAsInteger(UserInfo.User.AGE).toString();
String maxId = "select max(id) id from user_info";
Cursor cursor = mysqlite.getReadableDatabase().rawQuery(maxId, null);
cursor.moveToFirst();
int userid = cursor.getInt(0) + 1;
if (uriMatcher.match(uri) == 1) {
mysqlite.getWritableDatabase().execSQL(
"insert into user_info values(?,?,?)",
new String[] { String.valueOf(userid), name, age });
}
return uri;
}
// 連接數據庫
@Override
public boolean onCreate() {
mysqlite = new MySqlite(getContext(), "userinfo.db", null, 1);
return true;
}
//查詢數據
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase sqlite = mysqlite.getReadableDatabase();
String str = "select name,age from user_info";
if (uriMatcher.match(uri) == 1) {
str += " where " + selection;
}
Cursor cursor = sqlite.rawQuery(str, selectionArgs);
return cursor;
}
//修改數據
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase sqlite = mysqlite.getReadableDatabase();
int number = 0;
if (uriMatcher.match(uri) == 1) {
number = sqlite.update("user_info", values, selection,
selectionArgs);
}
return number;
}
}
Android開發學習之路--網絡編程之初體驗
Android開發學習之路--網絡編程之初體驗 一般手機都是需要上網的,一般我們的浏覽器就是個webview。這裡簡單實現下下功能,先編寫Android的layout
ArcGIS for Android地圖控件的5大常見操作轉,arcgisandroid
ArcGIS for Android地圖控件的5大常見操作轉,arcgisandroidhttp://blog.csdn.net/arcgis_mobile/articl
圓形背景的TextView,圓形背景TextView
圓形背景的TextView,圓形背景TextView【應用場景】: 【需要的xml】:shape_circle.xml <?xml version=1.0 enc
[Android學習筆記]Adapter如何進行視圖與數據綁定資料
[Android學習筆記]Adapter如何進行視圖與數據綁定資料 Android開發中視圖和數據的綁定離不開Adapt系列