WeexContainer-Android:Android 平臺上 Weex 容器
WeexContainer-Android
一個Android平臺上Weex容器,實現MPA,Bundle緩存、驗簽等通用功能。
一、Demo:
http://www.masonliu.com/app/digua/download
https://github.com/MasonLiuChn/WeexExplorer
二、功能:
- Native跳轉Weex
- Native通知Weex
- Weex跳轉Weex(實現MPA多頁面應用)
- Weex跳轉、調用Native
- Bundle緩存功能
- Bundle驗證簽名
- 開啟調試器ChromeDebugger
- 新網絡模塊
(一)Native跳轉Weex
- 加載assets/weex下(使用assets方式時,只支持放在assets/weex下)
- 加載存儲空間內的文件
- 加載網絡文件
- Release環境下,加載網絡文件的順序是 a.查找緩存文件(有問題則刪除)->b. 使用網絡文件->c.查找assets
//example
WeexPageActivity.startFrom(
LauncherActivity.this,
//"file://local/weex/main.js",
//"file://sdcard/xx",
"http://192.168.12.20:10004/dist/pages/main.js",
null);
(二)Native通知Weex
- 1、Weex SDK 本身提供了globalEvent實現Native發事件給Weex,這里以監聽Android返回鍵為例介紹其用法:
public void onBackPressed() {
if (mWXSDKInstance != null && renderSuccess) {
Map<String, Object> params = new HashMap<>();
params.put("name", "returnmsg");
mWXSDKInstance.fireGlobalEventCallback("androidback", params);
} else {
super.onBackPressed();
}
}
const globalEvent = weex.requireModule('globalEvent');
export default {
created() {
this.globalEvent = globalEvent;
this.globalEvent.addEventListener("androidback", e => {
this.router.back()
});
},
methods: {}
}
(三)Weex跳轉Weex,實現MPA多頁面應用
- 1、Weex工程內使用VueRouter做頁面跳轉,Url為Bundle的網絡地址
const basePath = 'http://192.168.12.20:10004/dist';
export default [
{path: '/', component: basePath + '/pages/index.js'},
{path: '/main', component: basePath + '/pages/main.js'}
];
...
router.push('/main')
- 2、Android工程無需做配置,本SDK會自動開啟新Activity加載Bundle
- 3、使用者想做自定義的跳轉配置,則可以使用SDK提供的如下方法:
WeexUtil.setNavigatorPushHandler(new WXNavigatorManager.WXNavigatorPushHandler(){
public void push(WXSDKInstance mWXSDKInstance, Uri uri, String instanceId){
}
});
WeexUtil.setURLIntercepter(url -> {
return url;
});</code></pre>
(四)Weex跳轉、調用Native
- 1、Weex工程使用如下:
weex.requireModule("CommonModule").handle('/activity/movieDetail?id=123')
- 2、Android工程使用如下:
WeexUtil.setCommonModuleHandler((content, mWXSDKInstance, commonModule) -> {
//我這里使用了ARouter處理Native端的跳轉
//RouterUtil.go((Activity) mWXSDKInstance.getContext(), content);
});
- 3、Weex調用Native時如果是需要返回結果的調用,則需自己實現注冊一個Module,編寫帶有jscallback的方法
/*****example jscallback*****/
@JSMethod(uiThread = false)
public void nativeHttpGet(String url, JSCallback callback) {}
(五)Bundle緩存功能
- 1、SDK提供了默認的Bundle緩存功能
- Release環境下,加載網絡文件的順序是 a.查找緩存文件(有問題則刪除)->b. 使用網絡文件->c.查找assets
- 使用LRU實現緩存,對相同url的Bundle實施緩存,默認緩存容量15
</li>
- 2、使用者若想自己實現緩存,可以使用下面方法
</ul>
WeexUtil.setCacheHandler(new WXLoadAndCacheManager.WXCacheHandler(){
public void cache(InputStream inputStream, String url){
}
});
(六)Bundle驗證簽名
SDK沒有提供默認的驗簽功能,因為這屬于應用方的業務。但SDK提供了攔截Bundle下載的方法,在該方法里開發者可以校驗下載Bundle url里https的證書 或者 bundle文件的md5
WeexUtil.setNetworkHandler(new WXLoadAndCacheManager.WXNetworkHandler(){
public InputStream executeDownload(String url) throws Exception{
return null;
}
});
(七)開啟調試器ChromeDebugger
- 1、該SDK集成了weex debug功能,啟動SDK時,將下面第二個參數設置為true
WeexUtil.init(this,true,BuildConfig.BUILD_IP,null);
- 2、weex debug
- 3、在chrome上打開debug server如 http://yourip:8088
- 4、啟動app
- 5、此時chrome頁面上出現了手機設備
- 6、點擊debugger開始調試
(八)新網絡模塊
網絡請求模塊除了weex自帶的stream,還額外提供了nativeHttpGet方法,使用okhttp做請求,后續會增加post、put、delete等方法
var commonModule=weex.requireModule("CommonModule");
commonModule.nativeHttpGet(url,(response)=>{
if(!response.ok){
reject(response)
}else{
resolve(response)
}
}
);
三、Usage
(一)簡單用法
repositories {
maven { url "https://jitpack.io" }
maven { url "https://github.com/MasonLiuChn/MasonMavenRepository/raw/maven/releases" }
}
dependencies {
compile 'com.github.MasonLiuChn:WeexContainer-Android:1.0.0'
}
//在Applicaiton里設置
WeexUtil.init(this, false, BuildConfig.BUILD_IP,null);
WeexPageActivity.startFrom(
LauncherActivity.this,
"http://192.168.12.20:10004/dist/pages/main.js",
null);
(二)高級用法
public static void init(Application application,
boolean connectDebuggerOnAppDebug,
@Nullable String debuggerHost,
@Nullable IWXImgLoaderAdapter iwxImgLoaderAdapter) {
}
public static void setDebugable(boolean isDebug) {
}
public static void setNavigatorPushHandler(WXNavigatorManager.WXNavigatorPushHandler handler) {
}
public static void setURLIntercepter(WXURLManager.WXURLHandler handler) {
}
public static void setCommonModuleHandler(WXCommonModuleManager.WXCommonModuleHandler handler) {
}
public static void setCacheHandler(WXLoadAndCacheManager.WXCacheHandler handler) {
}
public static void setNetworkHandler(WXLoadAndCacheManager.WXNetworkHandler handler) {
}</code></pre>
四、Todo
- 合并默認bundle下載和nativeHttp的網絡庫
- 對外提供方法可設置okhttpclient
- iOS...
Contact me:
-
Blog: http://www.masonliu.com
-
Email: MasonLiuChn@gmail.com