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類與協議方法即可。