webapp與安卓原生應用通訊過程
H5多應用呼叫方案設計
1.引言
1.1 目的
為指導第三方應用開發人員安卓系統上呼叫Html5應用程式開發提供方案設計
2.方案設計
2.1總體方案設計介紹
2.2 H5應用層介面
2.2.1 runApp(packageName,activity,jsonData,succss,fail);
該介面的主要功能是呼叫H5應用,如上圖H5APP1呼叫H5APP2。
入參分別為:
packageName:需要呼叫的安卓APP2的應用包名,值為字串型別
activity:安卓應用的activity,值為字串型別(需要前面加上應用包名)
jsonData:傳給H5APP2的資料,值為json物件
succss:處理H5APP2的返回的成功回撥
fail:處理H5APP2的返回的失敗回撥
2.2.2 appResult(resultJsonObj)
該介面主要的功能是將H5APP2處理的資料返回給H5APP1
入參:
resultJsonObj:值為json物件,H5APP2返回給H5APP1的資料
2.3 native層實現原理介紹
安卓原生應用間的呼叫是通過採用startActivityForResult機制來實施的
基本原理:
安卓應用app1通過startActivityForResult方式呼叫安卓應用App2,安卓應用APP2收到傳遞過來的Bundle資料進行處理。
在處理完成之後,安卓應用app2通過setResult,並且finish自己的Activity。
安卓應用app1在onActivityResult接收到處理結果
2.4.六大互動過程案例介紹
2.4.1 H5APP1到安卓原生應用1過程
H5APP1到安卓原生應用是通過cordova框架提供的外掛,H5APP1提供的介面為:
var device = cordova.require("pax-plugin-device.PaxDevice");
device.runApp(packageName,activity,jsondata,succss,fail);
其中device為cordova外掛對js層提供的物件
2.4.2安卓原生應用APP1到安卓原生應用APP2過程
安卓應用app1通過startActivityForResult方式呼叫安卓應用App2過程:
ComponentName componentName = new ComponentName(args.getString(0), args.getString(1));
ComponentName(packageName, activity)介面的兩個引數分別是安卓APP2的應用包名和安卓APP2的應用的介面名;這裡使用的是H5APP1傳下來的 Intent intent = new Intent(); Bundle bundle = new Bundle(); bundle.putString("transDate", args.get(2).toString());
處理H5APP1傳下來的json資料,傳遞給安卓原生app2 intent.putExtras(bundle); intent.setComponent(componentName); myCordova.cordova.startActivityForResult(myCordova, intent, 0);
呼叫安卓原生APP2的應用
2.4.3安卓原生應用APP2到H5APP2過程
安卓原生應用APP2通過Intent i = getIntent() ,獲取安卓原生應用APP1傳遞過來的json資料
String transData=i.getStringExtra("transDate");
然後呼叫安卓webview 的loadUrl(launchUrl+"?"+transData);方法將json資料嵌入到url中傳遞給H5APP2應用
2.4.4 H5APP2到安卓原生APP2
H5APP2處理接收的url資料,並通過cordova框架外掛提供的介面將處理結果傳遞給安卓原生APP2
var device = cordova.require("pax-plugin-device.PaxDevice");
device.appResult(resultJsonObj);
入參為json物件。如:{
retCode:”success”,
amt:”0.1”
}
2.4.5 安卓原生APP2到安卓原生APP1
H5APP2通過呼叫cordova介面將結果送給安卓原生APP2, 在處理完成之後,安卓應用APP2通過setResult,將資料傳遞給安卓原生APP1,並且finish自己的Activity。
示例程式碼如下:
Intent mIntent = new Intent(); mIntent.putExtra("appResultData", args.get(0).toString()); // 設定結果,並進行傳送 myCordova.cordova.getActivity().setResult(resultCode, mIntent); myCordova.cordova.getActivity().finish();
2.3.6 安卓原生APP1到H5APP1
安卓應用APP1通過onActivityResult介面接收到安卓原生APP2傳遞的資料,並呼叫cordova回撥success將資料傳遞給H5APP1。
示例程式碼如下:
private static CallbackContext _callbackContext;
public void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d("enter onActivityResult ","dsadsa"); String change01 = data.getStringExtra("appResultData"); // 根據上面傳送過去的請求嗎來區別 switch (requestCode) { case 0: Log.d("----2222+++---:",change01); _callbackContext.success(change01); break; default: break; }