Android中實現跨app之間數據的暴露與接收

例如一個小項目:實現單詞本的添加單詞等功能數據庫

功能:不一樣的方式實現跨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控件上

相關文章
相關標籤/搜索