例如一個小項目:實現單詞本的添加單詞等功能數據庫
功能:不一樣的方式實現跨app之間數據的暴露與接收
暴露端app:實現單詞的添加(Word、Translate),增刪改查;
接收端app:模糊查詢,獲得暴露端的數據。app
暴露端主頁及佈局:
一、佈局:
主頁佈局:ListView、TextView(empty)
item佈局:TextView(單詞)、TextView(翻譯)
添加或修改單詞的Dialog佈局:EditText(hint="word")、EditText(hint="translate")ide
二、菜單:
選項菜單:添加(單詞)
上下文菜單:刪除、修改(ListView上)工具
三、主頁程序:
初始化MySQLiteOpenHelper(工具類)、初始化控件
數據庫的操做、自定義對話框、設置適配器、建立選項菜單、上下文菜單佈局
接收端主頁及佈局:
一、佈局:主頁佈局:EditText(關鍵詞)、Button(點擊查詢)、ListView、TextView(empty)
item佈局:TextView(單詞)、TextView(翻譯)
二、主頁:初始化控件,解析獲得的String返回集合,設置適配器this
1、Content-Provider翻譯
Provider:
一、自定義Provider繼承ContentProvider,重寫6個抽象方法
二、定義靜態代碼塊:目的是定義多個Uri地址。
三、聲明SQLiteDatabase、MySQLiteOpenHelper,生命週期onCreate()中,實例化
四、重寫數據庫的增刪改查:根據UriMatcher對象的match(uri)方法的返回值進行CRUD
注意:查詢的時候,返回的是Uri對象:
long id = dbConn.insert("tb_words",null,values);
Uri uri_id = ContentUris.withAppendedId(uri,id);
五、清單中註冊:節點:<provider>:authorities、name、exported對象
Resolver:
一、定義ContentResolver,及uriString:提供者定義的authorities
resolver=getContentResolver();繼承
二、查詢:resolver.query(Uri.parse(uri)-->>返回Cursor
三、若有需求,可以使用Loader方法:當提供者數據發生改變時及時更新,
①、實現LoaderManager.LoaderCallbacks<Cursor>:
②、初始化LoaderManager:
loaderManager = getLoaderManager();
loaderManager.initLoader(LOADER_ID, null, this);
③、實現三個方法:
onCreateLoader(){return new CursorLoader(6個參數)}、
onLoadFinished(){adapter.changeCursor(data)}、
onLoaderReset(){adapter.changeCursor(null)}接口
2、AIDL:Android Interface Define Language
服務端:
一、aidl文件夾-->包-->後綴.aidl-->抽象方法,形參爲要傳遞的數據,返回String
二、自定義服務類,繼承Service
①、onCreate()中,初始化helper對象
②、自定義內部類繼承自定義的aidl中的Stub,重寫一個自定義的抽象方法,其中執行數據庫的查操做,獲得集合,
可適當的處理集合獲得String,以便接收者解析
③、onBind()中,返回new MyBinder()對象
三、清單註冊,包含<Intent-filter>節點<action>屬性:建議包名.類名
客戶端:
一、同服務端第一條,可複製.aidl文件,不建議複製文件夾
二、主頁:聲明自定義的.aidl的接口,綁定服務:
bindService(intent, conn, BIND_AUTO_CREATE)-->返回boolean,綁定成功否
集齊三個參數intent.setPackage、setAction(包名.類名)、建立conn的時候,重寫兩個方法,
創建鏈接時:實例化myInterface等於Stub.asInterface(iBinder),斷開鏈接賦值爲null、第三個參數建議爲BIND_AUTO_CREATE
三、既然myInterface已經實例化,就能夠調用裏面的方法,處理返回的數據,加載到ListView上
四、解除綁定
3、Messenger
服務端:
一、自定義服務類繼承Service
二、初始化信使、數據庫操做工具類對象的聲明
三、週期方法onCreate()中:初始化helper對象、信使對象:
Handler handler = new Handler(){//第5步、第6步}
messenger = new Messenger(handler);
四、重寫onBind()方法,返回messenger.getBinder()
五、在Handler{}內,對客戶端傳過來的信息進行過後處理,將處理的消息返回給客戶端:
執行查操做(查詢條件爲,msg.getData().getString()+"%")返回集合,定義Message,what值爲1,
攜帶setData(bundle),Bundle攜帶String
六、定義信使對象等於msg.replyTo,信使對象發送message
七、清單註冊:包含<Intent-filter>節點<action>屬性:建議包名.類名
客戶端: 一、聲明兩個信使對象messenger、messenger_reply; 二、bindMyService綁定服務; bindService(intent, conn,BIND_AUTO_CREATE):集齊三個參數: intent.setPackage、setAction(包名.類名)、建立conn的時候,重寫兩個方法,創建鏈接時: 實例化messenger = new Messenger(service);, 斷開鏈接賦值爲null、第三個參數建議爲BIND_AUTO_CREATE 三、initMesengerReply初始化返回信使: Handler handler = new Handler(){//第5步}、messenger_reply = new Messenger(handler); 四、客戶端向服務端發送請求信息: 定義Message,msg.setData(bundle),Bundle攜帶String(查詢的關鍵詞)、重點: msg.replyTo = messenger_reply、messenger.send(msg) 五、返回信使對返回信息進行過後處理:msg.what = 一、 String result = msg.getData().getString("result"); 六、處理獲得的result加載到listView控件上