1. 程式人生 > >AppInterface,一套Android與H5的混合開發框架

AppInterface,一套Android與H5的混合開發框架

最近的工作主要是圍繞APP與內嵌H5開發而展開的,所以寫了個小框架,以期能提升客戶端童鞋與前端童鞋的開發效率。具有Android與H5兩部分內容,互相搭配使用,介面簡潔,執行效率高,使用簡便,能極大的提升開發效率。

下方是github地址:
https://github.com/yanglang1987500/AppInterface

簡介

基於安卓實現的一個通過攔截請求與JSBridge的小框架,純REST風格,基於註解與反射實現,類似於SpringMVC的Controller風格

使用指南

通過使用:

AppInterface.getInstance().init(this,"com.webview.sniyve.webview.controllers"
);

進行初始化工作。
第一個引數代表安卓Context物件,第二個引數是控制器所處包路徑,框架會自動掃描此包路徑下所有實現了Controller註解的類,併為其建立REST索引與反射並快取。

提供兩種互動方式

  • 使用URL攔截形式,此方式需要在WebViewClient實現類的shouldOverrideUrlLoading方法中進行攔截處理,直接呼叫
AppInterface.getInstance().handle(view,url);

即可,此方法會返回布林值,為真代表匹配到了處理器,為假代表未匹配到處理器,理應進行放行。
* 使用JSBridge形式,此方式可以在webView例項化時直接呼叫

AppInterface.getInstance().initJsBridge(webView);

即可,框架會提供一個名為ApplicationInterface的js物件以供呼叫,js呼叫方法為

ApplicationInterface.call(url)。

這兩種方式可以並存,怎麼調都行,攔截器都會攔截並通知相應的Controller進行處理,並統一進行回撥處理。

控制器寫法

控制器需要繼承自BaseController,並在類上加@Controller("host")註解,並且需要在相應方法上加@RequestMapping("/path")註解。
待對映的協議方法需要實現兩個入參Map<String,Object> params

AppInterfaceCallback callback,前一個是引數包,後一個是回撥介面。Controller可以通過呼叫父類的getContext()方法獲取Android上下文物件。
使用示例如下:

@Controller("common")
public class CommonController extends BaseController{

    @RequestMapping("/toast")
    public void toast(Map<String,Object> params,AppInterfaceCallback callback){
        String message = (String)params.get("msg");
        Toast.makeText(this.getContext(), message, Toast.LENGTH_SHORT).show();
        callback.call(null);
    }
}

如此便實現了一個簡單的common/toast協議,所有引數都在params物件中,callback用於執行回撥。
此框架建議與AppInterface.js進行搭配使用。

新增了一套框架的廣播訂閱機制

test包中已經給出了使用示例
具體使用方法如下:
訂閱:

AppInterface.getInstance().subscribe("onClick", new Callback() {
        @Override
        public void call(Map<String, Object> params) {
            TextView textView = (TextView) MainActivity.this.findViewById(R.id.textView);
            textView.setText((String) params.get("value"));
        }
    });

釋出:

@RequestMapping("/order_manage")
public void orderManage(Map<String,Object> params, final AppInterfaceCallback callback){
        Map<String,Object> pms = new HashMap<String,Object>();
        pms.put("value", params.get("shopId"));
        AppInterface.getInstance().notify("onClick",pms);
    }
}

此模式可以解決不同類或不同Activity中互通事件的問題。

關於效能

實測,Nexus4手機,框架初始化12個Controller,35個協議約35ms-70ms時間,攔截請求耗時(已快取反射的情況下)為1ms,非常快!
如此便實現了效率高,全自動的目的。

關於AppInterface.js

AppInterface.js是一個通過js呼叫APP的工具包,內建了一套廣播訂閱機制與相關介面。但是呼叫APP不用關心廣播,只需要使用

AppInterface.call('/common/login',{
    user:'test',
    password:'test'
},function(data){
    console.log(data.message);
});

即可與APP進行互動,兩端都是走的協議形式,不論是通過攔截請求還是JsBridge方式,最終都會解析此協議,並通知相應的Controller進行處理。AppInterface.call()內部會優先使用JsBridge形式,如果APP環境未提供此功能,則使用傳送請求的形式,最終達到的效果是一致的,AppInterface.js所提供的call功能不論是對於安卓還是對於iOS都是相容的。




最終的目標就是js端只需要按照約定的協議呼叫call方法,App端只需要實現相應協議的Controller類與協議方法即可。