一.菜單Menu
1.OptionsMenu? 選項菜單? 也叫系統菜單,右上角的三點
? ? (1)高版本的菜單
? ? ? ? ? ? ?Step1: 在menu文件夾中的XMl文件中寫菜單布局
? ? ? ? ? ? ? ? ? ? ? ? <item
? ? ? ? ? ? ? ? ? ? ? ? ?android:id="@+id/action_color"
? ? ? ? ? ? ? ? ? ? ? ? ?android:orderInCategory="100"控制再Menu中顯示的順序,數值越 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 小,越靠前
? ? ? ? ? ? ? ? ? ? ? ? ?android:showAsAction="never"控制該菜單項何時顯示再ActionBar中
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?屬性:never 永遠不現實再ActionBar中
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?always ?一直顯示再Action Bar中
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ifRoom如果有空間,則顯示再ActionBar中
? ? ? ? ? ? ? ? ? ? ? ? android:title=“菜單項的文本”/>
? ? ? ? ? ? ? ? ? ? ? ?//<item>元素中可嵌套<menu>元素形成二級菜單
? ? ? ? ? ?Step2:在Activity中調用onCreateOptionsMenu方法
? ? ? ? ? ? ? ? ? ? public boolean onCreateOptionsMenu(Menu menu){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //加載菜單布局?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? getMenuInflater().inflate(R.menu.main,menu);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? Step3:重寫點擊菜單回調的方法
? ? ? ? ? ? ? ? ? ? ? ? public boolean onOptionsItemSelected(MenuItem item){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? switch(item.getItemId()){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .......
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }
(2)低版本創建菜單,純java代碼
? ? ? ? ?在Activity中重寫onCreateOptionsMenu方法
public boolean onCreateOptionsMenu(Menu menu){
? ? ? ? ? menu.add(menu.NONE,1,menu.NONE,"低版本的菜單一");
? ? ? ? ? SubMenu subMenu = menu.addSubMenu(menu.NONE,2,menu.NONE,"sub 2");
? ? ? ? ? subMenu.add(menu.NONE,21,1,"sub 2_1");
? ? ? ? ? subMenu.add(menu.NONE,22,0,"sub 2_2");
? ? ? ? ? ?return true;
}
2.ContextMenu? 上下文菜單
? ? ? ? ? ? ? ? ? ? ? ? ? ? 可以為任意View指定上下文菜單,長按View顯示上下文菜單,
? ? ? ? ? ? ? ? ? ? ? ? ? ? 通常用于ListView和GridView中
(1)在menu文件夾下的XML文件中寫布局
(2)為View注冊上下文菜單
? ? ? ? registerForContextMenu(textView);
(3)重寫Activity中的onCreateContextMenu()方法
? ? ? ?/**
? ? ? *創建上下文菜單,長按View時調用該方法,每長按一次就會被調用一次
? ? ? *ContextMenu menu? ? ? ? 需要顯示的菜單
? ? ? ?*View view? ? ? ? ? ? ? 被長按的view,且經過注冊
? ? ? *ContextMenuInfo menuInfo所選擇界面的額外信息(ListView,GridView,Spinner)
? ? ? *? ? ? ? ? ? ? ? ? ? ? ? 攜帶的AdapterView中的position信息
? ? ? */
? ? ?public void onCreateContextMenu(ContextMenu menu,View view,ContextMenuinfo ? ? ? ? ? ? menuInfo){
? ? ? ? ? //加載菜單布局
? ? ? ? ? getMenuInflater().inflate(R.menu.xxx,menu);
? ? ? ? ? position = ((AdapterContextMenuInfo)menuInfo).position;
? ? }
(4)重寫onContextItemSelected方法,點擊上下文菜單項被回調的方法
public boolean onContextItemSelected(MenuItem item){
? ? ? ? ? switch(item.getItemId){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ........
? ? ? ? ? }
}
3.彈出式菜單 PopupMenu? API 11 以上,可以為任意一個View創建彈出式菜單
? ? ?(1)創建彈出式菜單
? ? ? ? ? /**
? ? ? ? ? ?*this? 上下文
? ? ? ? ? ?*v? ? 當前彈出式菜單參考顯示位置的UI控件
? ? ? ? ? ?*/
? ? ? ? ? ?PopupMenu popupMenu = new PopupMenu(this,v);
(2)加載菜單內容
? ? ? ? ? getMenuInflater().inflate(R.menu.xxx,popupMenu.getMenu());
(3)為彈出式菜單添加點擊事件
? ? ? popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener(){
? ? ? ? ? ? ? ?public boolean onMenuItemClick(Menuitem item){
? ? ? ? ? ? ? ? ? ? ?switch(item.getItemId){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?...........
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? }
? ? ? ?});
(4)顯示彈出式菜單
? ? ? ? popuMenu.show();
二、對話框
常用對話框
? ? ? ? ? ? ? ? ? ? ? ? 普通對話框? ? ? AlertDialog
? ? ? ? ? ? ? ? ? ? ? ? 進度條對話框? ? ProgressDialog
? ? ? ? ? ? ? ? ? ? ? ? 日期選擇對話框? DatePickerDialog
? ? ? ? ? ? ? ? ? ? ? ? 時間選擇對話框? TimePickerDialog
? ? ? ? ? ? ? ? ? ? ? ? 自定義對話框? ? setView()
列表對話框(在AlertDialog的基礎上設置某些屬性而得)
? ? ? ? ? ? ? ? ? ? ? ? ?普通列表對話框
? ? ? ? ? ? ? ? ? ? ? ? ? builder.setItems(數組,new Dialoginterface.OnClickListener{})
? ? ? ? ? ? ? ? ? ? ? ? ? 單選列表對話框
? ? ? ? ? ? ? ? ? ? ? ? ? builder.setSingleChoiceItems(數組,new ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Dialoginterface.OnclickListener{})
? ? ? ? ? ? ? ? ? ? ? ? ? 多選列表對話框
? ? ? ? ? ? ? ? ? ? ? ? ? builder.setMultiChoiceItems(數組,new ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OnMultiChoiceClickListener{})
? ? ? ? ? ? ? ? ? ? ? ? ? 適配器列表對話框
? ? ? ? ? ? ? ? ? ? ? ? ? ?builder.setAdapter(數組,new Dailoginterface.OnclickListener{})
對話框的通用屬性
? ? ? ? ? ? ? setIcon(R.drawable.ic_launcher)? 設置對話框的標題頭像
? ? ? ? ? ? ? setTitle("")? ? ? ? ? ? ? ? ? ? 設置標題
? ? ? ? ? ? ? setMessage("")? ? ? ? ? ? ? ? ? 設置內容文字
? ? ? ? ? ? ? setCancelable(ture/false)? ? ? ? 設置點擊空表出對話框是否消失
三、Android的存儲
一.共享參數存儲 (SharedPreferences)
(1)SharedPreferences的介紹
SharedPreferences是Android系統提供的一個通用的數據持久化框架,用于存儲和讀取key-value類型的原始基本數據類型對,目前支持String、int、long、float、boolean等基本類型的存儲,對于自定義的對象數據類型,無法使用SharedPreferences來存儲。
SharedPreferences主要用于存儲系統的配置信息。例如上次登錄的用戶名,上次最后設置的配置信息(如:是否打開音效、是否使用振動,小游戲的玩家積分等)。
當再次啟動程序后依然保持原有設置。SharedPreferences用鍵值對方式存儲,方便寫入和讀取。
SharedPreferences是Context上下文中的一個接口,Context提供了一個getSharedPreferences(name,mode)方法用于拿到SharedPreferences對象
SharedPreferences里又有一個Editor接口,SharedPreferences對象中提供了一個edit()方法用于拿到Editor對象
(2)SharedPreferences的特點
? ? ? 存放輕量級數據
? ? ?本質存儲形式是xml格式
? ? ?通常用于存儲簡單的數據信息,如記住賬號,配置信息等
? ? ?應用程序卸載后,文件也會被刪除
(3)SharedPreferences存儲的數據類型
? ? 可以存放boolean,int,string,long,float,
? ? 但不能存放對象.
(4)getSharedpreferences(name,mode)方法的介紹
? ? ? ? 該方法返回SharedPreferences對象,
? ? ? ? ?該方法有兩個參數:
? ? ? ? ? ? ? ? ? ? ? ? ? ? 第一個:String name? 文件名
? ? ? ? ? ? ? ? ? ? ? ? ? ? 第二個:int mode? ? 一些權限? Context中提供了一些常量
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Context.MODE_PRIVATE : 只有本應用可以訪問
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Context.MODE_WORLD_READABLE :其他應用可讀
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Context.MODE_WORLD_WRITEABLE : 其他應用可寫
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?這些權限可以用+號來連接
(5)SharedPreferences常用方法? ? ? ??
? ? ? sharedPreferences.edit();獲取Editor對象? ? ? ??
? ? ? sharedPreferences.getXXX(key,默認值); ? ? ? ? ? ? ? ?
? ? ? 如:sharedPreferences.getString(key,默認值);? ? ? ??
? ? ? sharedPreferences.getStringSet(key,默認set); 返回set? ? ? ?
? ? ? ?sharedpreferences.getAll()? 返回Map<String,?>
? ? ? ?sharedPreferences.contains(key) 判斷是否存在某鍵
? ? ? ?editor.putXXX(key,默認值)
? ? ? ?editor.putStringSet(key,默認Set)
? ? ? ?editor.remove(key);? 移除某鍵值對
? ? ? ?editor.clear();? 清楚所有數據.
? ? ? ?editor.commit();? 提交,如果不提交則寫不到文件中去
(6)SharedPreferences使用步驟
? ? ? ?①通過context對象得到sharedpreferences對象
? ? ? ? ? ? Sharedpreferences sharedpreferences = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? context.getSharedPreferences("name",Context.MODE_PRIVATE);
? ? ? ?②拿個Editor對象,并put數據
? ? ? ? ? ? ? Editor editor = sharedpreferences.editor();
? ? ? ? ? ? ? editor.putString(key,默認值);
? ? ? ? ? ? ? ? ? ? ?........
? ? ? ? ? ? ? ?editor.commit();數據成功存入
③通過sharedpreferences對象拿值
? ? ? ? ? ? ? ?sharedpreferences.getString(key,默認值);
? ? ? ? ? ? ? ? ? ? ? ? ? ?........
二.File存儲
(1)內部存儲? Internal Storage
? ? ? ? ? <1>特點: 文件只能被本應用訪問,其他應用不能訪問
? ? ? ? ? ? ? ? ? ? ? ? ? ? 當應用程勛卸載后,程序在內部存儲的文件也會被刪除
? ? ? ? ?<2>路徑:
? ? ? ? ? ? ? ? ? ? ? ? ? ?data/data/應用程序包名/files/***.**
? ? ? ? ? <3>核心方法:
? ? ? ? ? ? ? ?context提供了openInputStream(name); 根據指定文件名打開輸入流
? ? ? ? ? ? ? ? ? ? ? openOutputStream(name,mode); 根據文件名打開輸入流,無則創建.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?mode同SharedPreferences一樣
? ? ? ? ? ? ? ? ? ? ? String[] fileList()? ? 獲取所有文件名稱
? ? ? ? ? ? ? ? ? ? ? ?File? ? getFileDir()? 獲取文件的絕對路徑
? ? ? ? ? ? ? ? ? ? ? ?boolean? deleteFile(name)刪除某個文件?
(2)外部存儲? external storage(擴展卡 SD卡)
? ? ? ?<1>特點:SD卡公共目錄? SD卡的私有目錄
? ? ? ? ? ? ?公共目錄下的文件可以被應用程序共享,私有目錄中的文件只能當前應用程序使用.當程序卸載后,公共目錄中的文件不被清理,私有目錄中的文件會被清理
? ? ? ?<2>權限:
<!--寫SD卡的權限-->
<user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--讀SD卡的權限-->
<users-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<3>SD卡的根目錄
File file = Environment.getExternalStorageDirectory();
打印結果為:/mnt/sdcard
<4>SD卡公共目錄
Environment.getExternalStoragePublicDirectory(String type)
? ? ? ? ? ? ? ? ? ?參數type:
? ? ? ? ? ? ? ? ? ? ? ? ?DIRECTORY_ALARMS //警報的鈴聲
? ? ? ? ? ? ? ? ? ? ? ? ?DIRECTORY_DCIM //相機拍攝的圖片和視頻保存的位置
? ? ? ? ? ? ? ? ? ? ? ? ?DIRECTORY_DOWNLOADS //下載文件保存的位置
? ? ? ? ? ? ? ? ? ? ? ? ?DIRECTORY_MOVIES //電影保存的位置, 比如 通過google play下載 ? ? ? ? ? ? ? ? ? ? ? ? ?的電影
? ? ? ? ? ? ? ? ? ? ? ? ?DIRECTORY_MUSIC //音樂保存的位置
? ? ? ? ? ? ? ? ? ? ? ? ?DIRECTORY_NOTIFICATIONS //通知音保存的位置
? ? ? ? ? ? ? ? ? ? ? ? ?DIRECTORY_PICTURES //下載的圖片保存的位置
? ? ? ? ? ? ? ? ? ? ? ? ?DIRECTORY_PODCASTS //用于保存podcast(博客)的音頻文件
? ? ? ? ? ? ? ? ? ? ? ? ?DIRECTORY_RINGTONES //保存鈴聲的位置
? ? ? ? 打印結果為:/mnt/sdcard/alarms
<5>SD卡的私有目錄
? ? context.context.getExternalFilesDir(null)? SD卡的私有目錄的根目錄
? ? 打印結果為:/mnt/sdcard/Android/data/包名/files
? ? context.getExternalFilesDir(String type)? SD卡的私有目錄中的指定目錄
? ? context.getExternalCacheDir()? ? SD卡的私有目錄的緩存目錄
? ? ?打印結果為:/mnt/sdcard/Android/data/包名/cache
<6>獲取SD卡的狀態
? ? ? ? ?Environment.getExternalStorageState()
<7>讀寫SD卡的步驟
①判斷SD卡的狀態
? ? ? ? Environment.getExternalStorageState()
②獲取sdcard的路徑
? ? ? ? ?Environment.getExternalStorageDirectory()
③添加讀寫SD卡的權限
④執行IO操作
<8>利用StatFs獲取磁盤空間信息
? ? ? ? ? StatFs 一個模擬linux的df命令的一個類,獲得SD卡和手機內存的使用情況
? ? ? ? ? StatFs的常用方法: 以block為單位.
? ? ? ? ? ? ? ? ? ? ?getAvailableBlocks()? ? 返回int,可用數據塊個數
? ? ? ? ? ? ? ? ? ? ?getFreeBlocks()? ? ? ? ? 返回int,可用數據塊個數,與上一個方法一樣
? ? ? ? ? ? ? ? ? ? ?getBlockCount()? ? ? ? ? 返回int,總數據塊數
? ? ? ? ? ? ? ? ? ? ?getBlockSize()? ? ? ? ? 返回int,大小,以字節為單位,每個數據塊的大小
? ? ? ? ? ? ? ? ? ? ?restate(String path)? ? 執行一個由該對引用的文件系統
? ? ? ? ? ?SDK>=18時
? ? ? ? ? ? ? ? ? ? ? statFs.getFreeBytes()? ? 直接返回磁盤的剩余空間
? ? ? ? ? ? SDK<18時
? ? ? ? ? ? ? ? ? ? ? ?statFs.getFreeBlocks()*statFs.getBlockSize() 計算剩余空間
三.SQLite數據庫存儲
? ? (1)特點
? ? ? ? ? ? 輕量級? 綠色? 零配置? 跨平臺 嵌入式
? ? ? ? ? ? 在程序的內部,可以在任何位置通過數據庫的名稱訪問數據庫,不可跨應用訪問
? ? ? ? ? ? 路徑:data/data/應用程序包名/database/**.db
(2)SQLite知識,同java筆記
(3)Android操作SQlite數據庫的核心類
? ? ? <1>SQLiteDatabase的使用
? ? ? ? ? ? ?SQLiteDatabase用于管理和操作數據庫
? ? ? ? ? ? ?context對象中提供了一個返回SQLiteDatabase對象的方法
? ? ? ? ? ? ?context.openOrCreateDatabase(name,mode,CursorFactory);
? ? ? ? ? ? ? ? 參數:
? ? ? ? ? ? ? ? ? ? ? ? name? :? 數據庫名稱
? ? ? ? ? ? ? ? ? ? ? ? mode? :? 模式: SQliteDatabase.OPEN_READWRITER? 讀寫模式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?SQLiteDatabase.OPEN_READONLY? ? 只讀模式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?SQLiteDatabase.CREATE_IF_NECESSARY 如果數據 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?庫不存在,則創建
? ? ? ? ? ? ? ? ? ? ? ? ?CursorFactory:? 通常為空
SQLiteDatabase中執行SQL語句的方法: (常用)
? ? ? ? ? ? ? ?void execSQL(String sql)? 執行SQL語句
? ? ? ? ? ? ? void execSQl(String sql,Object[] bindArgs) 執行SQL語句(可以有占位符)
? ? ? ? ? ? ? Cursor rawQuery(String sql,String[]? selectionArgs) 執行查詢語句(可以有占位符)
SQLiteDatabase封裝好的操作數據庫的方法 (不常用)
? ? ? ? ? ? ? ?insert()? 插入數據到指定的表中
? ? ? ? ? ? ? ? update()? 更改表中指定的數據
? ? ? ? ? ? ? ?delete()? 刪除表中指定的數據
? ? ? ? ? ? ? ?query() ? 查詢表中指定的內容
<2>SQLiteOperHelper? 維護了一個數據庫及維護了一個SQLiteDatabase對象
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用于數據的創建.更新.和打開數據庫連接
? ?用法:
? ? ? ? ? ? ①定義一個類,繼承SQLiteOpenHelper
? ? ? ? ? ? ? ? 并重寫父類的兩個方法,這兩個方式是系統調用的不用手動調用
? ? ? ? ? ? ? ? onCreate(SQLiterDatabase? db)? 第一次創建數據庫時調用, 只會被調用一次
? ? ? ? ? ? ? ? onUpgrade(SQLiterDatabase? db,int oldVersion, int newVersion)? 數據庫的版本號發生變化后,執行此方法(可能會被執行多次)
②必須提供一個構造方法
public MySQLiteOpenHelper(Context context) {
? ? ? ? ? ? ? super(context, name, CursorFactory, version);
}
參數:
? ? ? ? ? context:? ? 上下文對象
? ? ? ? ? name:? ? ? 數據庫名字
? ? ? ? ? CursorFactory:通常為null,就是用系統的CursorFactory
? ? ? ? ? version:? ? 版本號
SqLiteOpenHelper對象中的方法
? ? ? ? ? ? ? ?mySQLiteOpenHelper.getReadableDatabase();只讀方式打開數據庫連接
? ? ? ? ? ? ? ?mySQLiteOpenHelper.getWritableDatabase();以讀寫方式打開數據庫連接
<3>Cursor
? ? ? ? ? ?作用類似于JDBC中resultSet, 把查詢的結果封裝到Cursor對象中.
? ? ? ? ? ? cursor就像是一個結果級上的游標, 可以向上或向下移動
? ? ? ? ? ? ?默認游標位置在數據的上方
cursor對象的常用方法:
coursor.getCount()? 得到游標中的數據數量
? ? ? ? ? coursor.moveToNext() 游標移動到下一條數據, 并且判斷下一條數據是否存在
? ? ? ? ? ?coursor.moveToPrevious() 游標移動到上一條數據, 并且判斷上一條數據是否存在
? ? ? ? ? coursor.moveToFirst() 游標移動到第一條數據, 并且判斷第一條數據是否存在
? ? ? ? ? coursor.moveToLast()? 游標移動到最后一條數據, 并且判斷最后一條數據是否存在
? ? ? ? ?coursor.moveToPosition(int position) 游標移動到某一條數據, 并且判斷某一條數據是否存在
? ? ? ? ?coursor.move(int offset)? 游標向上或者向下移動指定的行數, 正數代表向上,負數代表向下, 并且判斷數據是否存在
? ? ? ? ?cursor.getColumnIndex(columnName)? 根據列名拿個下標2016/7/6
? ? ? ? ?cursor.getColumnName(columnIndex)? 根據下標拿個列名
? ? ? ? ?cursor.getColumnNames()? 得到所有列名組成的數組
? ? ? ? ?cursor.getPosition()? ? ? 得到行標
四.Content Provider? 內容提供者(Android四大組件之一)
(1)Content Provider的介紹,作用以及特點
? ? ? ? ?為了達到不同應用程序之間的數據共享,Android提供了ContentProvider.
? ? ? ? ?例如我們需要操作系統里的媒體庫、通訊錄等,這時我們就可能通過 ? ? ? ? ? ? ? ? ? ? ? ? ? ContentProvider來滿足我們的需求了
<1>ContentProvider為存儲和獲取數據提供了統一的接口。ContentProvide對數據進行封裝,不用關心數據存儲的細節。使用表的形式來組織數據。
<2>使用ContentProvider可以在不同的應用程序之間共享數據。
<3>Android為常見的一些數據提供了默認的ContentProvider(包括音頻、視頻、圖片和通訊錄等)。
總的來說使用ContentProvider對外共享數據的好處是統一了數據的訪問方式。
(2)ContentProvider類的介紹
? ? ? ? ? ? ?ContentProvider是一個抽象類,要想創建ContentProvider必須自定義一個類繼承ContentProvider并實現其中的抽象方法:
? ? ? ? ? public boolean onCreate():該方法在ContentProvider創建后就會被調用, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Android開機后,ContentProvider在其它應用第一 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?次訪問它時才會被創建。
? ? ? ? ?public Cursor query(Uri uri, String[] projection, String selection, String[] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? selectionArgs, String sortOrder):該方法用于供外部應用從 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ContentProvider中獲取數據。
? ? ? ? ?public Uri insert(Uri uri, ContentValues values):該方法用于供外部應用往 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ContentProvider添加數據。
? ? ? ? public int update(Uri uri, ContentValues values, String selection, String[] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? selectionArgs):該方法用于供外部應用更新 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ContentProvider中的數據。
? ? ? ?public int delete(Uri uri, String selection, String[] selectionArgs):該方法用于供 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?外部應用從ContentProvider刪除數據。
? ? ? public String getType(Uri uri):該方法用于返回當前Url所代表數據的MIME類型。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果操作的數據屬于集合類型,那么MIME類型字 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 符串應該以vnd.android.cursor.dir/開頭,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果要操作的數據屬于非集合類型數據,那么 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? MIME類型字符串應該以vnd.android.cursor.item/開頭,
創建自己的ContentProvider步驟:
①封裝CONTENT_URI(必須是唯一的字符串,常用Contentprovider完全限定名)
? ? 和數據庫表的列名,必須為其定義一個叫_id的列,它用來表示每條記錄的唯一性。
public class MyUsers {
? ? ? ? ? public static final String AUTHORITY? = “com.wissen.MyContentProvider”;
? ? ? ? ? // BaseColumn類中已經包含了 _id字段和_COUNT字段
? ? ? ? ? public static final class User implements BaseColumns {
? ? ? ? ? ? ? ? ? ? ? public static final Uri CONTENT_URI? = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Uri.parse(”content://com.wissen.MyContentProvider”);
? ? ? ? ? ? ? ? ? ? ? ? ? ? // 表數據列
? ? ? ? ? ? ? ? ? ? ? ? ?public static final String? USER_NAME? = “USER_NAME”;
? ? ? ? ?}
}
②定義自己的MyContentProvider類繼承ContentProvider,實現其中的抽象方法
?③實現SQLiteOpenHelper對數據庫的操作,一共②使用.?
④在AndroidManifest.xml中配置ContentProvider
<provider android:name="MyContentProvider"
? ? android:authorities="包名.類名“/>
(3)ContentReslover類的介紹
? ? ?<1>ContentReslover的作用和特點
? ? ? ? ? ? 當外部應用需要對ContentProvider中的數據進行添加、刪除、修改和查詢操作時,可以使用ContentResolver 類來完成,ContentReslover是一個抽象類,不能new出其實例,Context提供了getContentResLover()方法
<2>ContentReslover的常用方法
? ? ? ContentResolver 類提供了與ContentProvider類相同簽名的四個方法:
? ? ? public Uri insert(Uri uri, ContentValues values):該方法用于往ContentProvider添加數據。
? ? ? ? public int delete(Uri uri, String selection, String[] selectionArgs):該方法用于從ContentProvider刪除數據。
? ? ? ? public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):該方法用于更新ContentProvider中的數據。
? ? ? ? public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):該方法用于從ContentProvider中獲取數據。
? ? ? ? ? ?參數:uri? 同上解釋
? ? ? ? ? ? ? ? ? ? ?projection? 要返回的列名組成的數組
? ? ? ? ? ? ? ? ? ? ?selecttion? 條件字符串,包含占位符
? ? ? ? ? ? ? ? ? ? ?selectionArgs? 上面占位符要顯示的內容組成的數組
? ? ? ? ? ? ? ? ? ? ?sortOrder? ? 排列順序
這些方法的第一個參數為Uri,代表要操作的ContentProvider和對其中的什么數據進行操作,其實和contentprovider里面的方法是一樣的.他們所對應的數據,最終是會被傳到我們在之前程序里面定義的那個contentprovider類的方法,假設給定的是:Uri.parse("content://com.bing.providers.personprovider/person/10"),那么將會對主機名為com.bing.providers.personprovider的ContentProvider進行操作,操作的數據為person表中id為10的記錄。
<3>ContentReslover的使用步驟
①獲取ContentReslover對象
? ? ? ? ContentResolver resolver =? getContentResolver();
②指定URI
? ? ? ? Uri uri = Uri.parse("content://com.bing.provider.personprovider/person");
③調用contentReslover的方法指定操作
? ? ?//添加一條記錄
? ? ?ContentValues values = new ContentValues();
? ? ?values.put("name", "bingxin");
? ? ?values.put("age", 25);
? ? ?resolver.insert(uri, values);
? ? ?//獲取person表中所有記錄
? ? Cursor cursor = resolver.query(uri, null, null, null, "personid desc");
? ? while(cursor.moveToNext()){
? ? Log.i("ContentTest", "personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1));
}
? ? //把id為1的記錄的name字段值更改新為zhangsan
? ?ContentValues updateValues = new ContentValues();
? ?updateValues.put("name", "zhangsan");
? Uri updateIdUri = ContentUris.withAppendedId(uri, 2);
? resolver.update(updateIdUri, updateValues, null, null);
? //刪除id為2的記錄
? Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
? resolver.delete(deleteIdUri, null, null);
<4>系統提供的ContentProvider已經封裝好的URI
(4)URI的介紹
? ? ?URI叫做統一資源標識符,代表要操作的數據,這樣你就可以找到對應的 ? ? ? ContentProvider以及想要的數據.(URI也可以說是一種類似SQL的查詢語句)
URI的格式:
? ? ? ? ?content://com.example.transportationprovider/trains/122
? ? ? ? ?該URI可以根據反斜杠來劃分為四部分
? ? ? ? ?content://? :? 協議部分類似于http://,不可改變
? ? ? ? ?com.example.transportationprovider? :? 該部分是URI的授權部分,是唯一標識,用來定位ContentProvider.一般定義為Contentprovider的完全限定名,注冊時需要用到
? ? ? ? ?trains/122? :? 內部路徑部分, trains指向一個集合,一般用表名來表示,"122"為_id.單條數據的標識,如果沒有"122"則返回一個數據集,有"122"則返回一條數據
(5)UriMatcher類的介紹
? ? ? ?因為Uri代表了要操作的數據,所以我們經常需要解析Uri,并從Uri中獲取數據。Android系統提供了兩個用于操作Uri的工具類,分別為UriMatcher和ContentUris 。掌握它們的使用,會便于我們的開發工作。
UriMatcher類用于匹配Uri,它的用法如下:
首先第一步把你需要匹配Uri路徑全部給注冊上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼
UriMatcher? sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.bing.procvide.personprovider/person路徑,返回匹配碼為1
sMatcher.addURI("com.bing.procvide.personprovider", "person", 1);//添加需要匹配uri,如果匹配就會返回匹配碼
//如果match()方法匹配content://com.bing.provider.personprovider/person/230路徑,返回匹配碼為2
sMatcher.addURI("com.bing.provider.personprovider", "person/#", 2);//#號為通配符
switch(sMatcher.match(Uri.parse("content://com.ljq.provider.personprovider/person/10"))) {
? ? ? ? ? case 1
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ?case 2
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ?default://不匹配
? ? ? ? ? ? ? ? ? ?break;
(6)ContentUris類的介紹
? ? ? ?ContentUris類用于操作Uri路徑后面的ID部分,它有兩個比較實用的方法:
? ? ? ? ? ? ? ? ? ?withAppendedId(uri, id)用于為路徑加上ID部分:
? ? ? ? ? ? ? ? ? ?parseId(uri)方法用于從路徑中獲取ID部分:
(7)監聽ContentProvider中數據的變化
如果ContentProvider的訪問者需要知道ContentProvider中的數據發生變化,
則需要有兩個步驟
①ContentProvider需要在數據發生變化時調用getContentResolver().notifyChange(uri, null)來通知注冊在此URI上的訪問者
例:
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()方法:
contentProvider對象調用registerContentObserver(uri, notifyForDescendents, observer);注冊監聽
參數說明: URI? 要監聽數據的URI
? ? ? ? ? ? ? ? notifyForDescendents? true/false
? ? ? ? ? ? ? ? observer? 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) {
? ? ? ? ? ? ? ? ? ? ? ? ? ?//此處可以進行相應的業務處理
? ? ? ? ? }
}
(8)操作Android系統短息信息
(9)操作Android系統通話記錄
(10)操作Android系統聯系信息
(11)操作Android圖片信息
(12)操作Android音頻信息
(13)操作Android視頻信息