AppInterface,一套Android与H5的混合开发框架
AppInterface
最近的工作主要是围绕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
与AppInterfaceCallback callback
,前一个是参数包,后一个是回调接口。Controller
可以通过调用父类的getContext()
方法获取Android上下文对象。
使用示例如下:
@Controller("common")public class CommonController extends BaseController{ @RequestMapping("/toast") public void toast(Map 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 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类与协议方法即可。
更多相关文章
- Android(安卓)激活Deviceadmin,并进行锁屏和恢复出厂设置
- Android连接、断开蓝牙扫描枪时屏幕刷新
- Android(安卓)SQLite学习
- Android使用Intent启动其他非系统应用程序的方法
- Android中实现自动生成布局View的初始化代码方法
- Android基础入门教程——4.2.1 Service初涉
- Android开发学习笔记(十)实现一个简易的开场界面
- android 调用系统相机拍照 获取原图
- Android事件分发机制完全解析,带你从源码的角度彻底理解(下) 。