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