編輯:關於Android編程
使用內容供應商共享數據
如果直接訪問磁盤文件(SDCard|File|SQLite數據庫|首選項),需要很多底層的交互細節,但該種方式,只使用url即可對應用程序進行訪問,並統一了數據訪問方式。
public class PersonContentProvider extends ContentProvider{
//在該生命周期中才能正確得到Content對象。
public boolean onCreate(){
//...
}
public Uri insert(Uri uri,ContentValues values);
....
}
<application android:icon="@drawable/icon"
Android:label="@string/app_name">
<!--注冊供應商-->
<provider android:name=".PersonContentProvider"
Android:authorities="cn.itcast.providers.personprovider"/>
</application>
URI:
Content://cn.itcast.provider.personprovider/person/10
Scheme 主機名或authority 路徑
Scheme:android規定,必須是content://
Authority:唯一標識該供應商。
path:代表操縱的數據。
將字符串轉換成Uri對象
Uri uri = Uri.parse("content://xxxx/person/10");
UriMatcher:
使用該類,可以判斷Uri如何哪一種模式
//若不匹配,返回UriMather.NO_MATCH
UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//一次添加匹配的模式串,以及匹配後返回的數值
//${authority} ${path}
sMatcher.addURI("cn.itcast.contentprovider","person",1);
sMatcher.addURI("cn.itcast.contentprovider","person/#",2);
switch(sMatcher.match(Uri)){
case 1:
case 2:
.....
}
//獲取uri後邊ID部分的話,可以通過
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");
Uri resultUri = ContentUris.withAppendedId(uri,10); //...person/10
Uri.parse("content://cn.itcast.provider.personprovider/person/10")
Long personid = ContentUris.parseId(uri);
XxxContentProvider extends ContentProvider{
....
//該方法用於返回當前Url所代表數據的MIME類型,如果操作的數據屬於集合類型,
//那麼MIME類型字符串應該以vnd.android.cursor.dir/開頭
//如:''vnd.android.cursor.dir/person"
//如果要操作的數據屬於非集合類型數據,那麼MIME類型字符串應該以
//vnd.android.cursor.item/開頭
//如:vnd.android.cursor.item/person
public String getType(Uri uri){..};
}
使用內容解析器(ContentResolver):
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");
ContentValues values = new ContentValues();
values.put("name", "itcast");
values.put("age", 25);
//插入
resolver.insert(uri, values);
//查詢
resolver.query(uri, null, null, null, "personid desc");
//更新
resolver.update(updateIdUri, updateValues, null, null);
//刪除
resolver.delete(deleteIdUri, null, null);
監聽contentprovider的數據變化
//供應商中的crud方法完成後需要發出數據變更的通知,以通知那些感興趣的監聽者
XxxContentProvider extends ContentProvider{
public long insert(){
...
getContext().getContentResolver().notifyChange(uri,null);
}
}
內容解析器如若要對數據變更,需要使用ContentObserver對uri進行監聽,收到通知後,回調處理方法onChange();
context.getContentResolver().registerContentObserver(uri,true,new MyContentObserver(new Handler()));
class MyContentObServer extends ContentObserer{
public MyContentObServer(Handler handler){
super(handler);
}
public void onChange(){...}
}
監聽用戶發送(接收)的短信
系統自帶的短信程序發送(或接收)短信時,會通過ContentProvider把短信保存進數據庫,並且
發出一個變更通知(notifyChange).使用ContentObserver對數據變化進行監聽,在用戶發送
短信時,就會被ContentObserver竊聽到短信.
//系統
Context.getContentResolver().notifyChange("content://sms",null);
//客戶端:
Context.getContentResolver().registerObserver(uri,false,new
ContentObserver(new Handler()){});
// content://sms/outbox
// content://sms/outbox
// content://sms/outbox
Cursor cursor = www.2cto.com
getContentResolver().query(Uri.parse("content://sms/outbox"),null,
cursor.getInt(cursor.getColumnIndex("_id")));
cursor.getString(cursor.getColumnIndex("address")));
cursor.getString(cursor.getColumnIndex("body")));
cursor.getLong(cursor.getColumnIndex("date")));
注:
<uses-permission android:name="android.permission.READ_SMS" />
作者:toto1297488504本文主要講解Android應用程序簽名相關的理論知識,包括:什麼是簽名、為什麼要給應用程序簽名、如何給應用程序簽名等。1、什麼是簽名?
在Android開發中經常會需要用到帶文字和圖片的button,下面來給大家介紹使用radiobutton實現圖片和文字上下布局或左右布局。代碼很簡單就不給大家多解釋了。
跟選擇銀行卡界面類似,也是用一個PopupWindow,不過輸入密碼界面是一個自定義view,當輸入六位密碼完成後用回調在Activity中獲取到輸入的密碼並以Toast
可能我們在開發中會時常用到計時器這玩意兒,比如在錄像的時候,我們可能需要在右上角顯示一個計時器。這個東西其實實現起來非常簡單。只需要用一個控件Chronometer,是的