1. 程式人生 > >webapp與安卓原生應用通訊過程

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;
    }