正在深入倒騰weex,希望可以將weex用在項目中。這里找出了weex控制Android返回鍵的方法。
需求
項目使用的是Vue+VueRouter的單頁應用來寫Weex的,現有以下需求。
- 當頁面不在首頁上時,返回上一頁面。
this.$router.go(-1)
- 當頁面在首頁是,關閉當前Android應用
解決方案
Android和Weex的通信
Android to Weex
使用的是globalEvent來實現的。我們在 Android 的返回按鈕事件中觸發 globalEvent
,在 Weex 中監聽該 globalEvent
。
Android
public void onBackPressed(){
Map<String,Object> params=new HashMap<>();
params.put("name","returnmsg");
mWXSDKInstance.fireGlobalEventCallback("androidback",params);
}
Weex
globalEvent.addEventListener('androidback', function (e) {
// 這里就可以做返回事件操作了,如返回上一頁或退出應用
// that.$router.go(-1)
// weex.requireModule('close').closeApp()
})
Weex to Android
而Weex對Android的通信使用Module擴展來實現。通過在Android中創建WXModule并在Application中注冊后,Weex調用該Module觸發Android事件。下面我們來一步步實現。
1. Android中創建CloseModule
public class CloseModule extends WXModule {
@JSMethod(uiThread = false)
public void closeApp() {
LogUtil.e("觸發關閉效果");
CacheActivity.finishActivity();
}
}
2. 在Application中注冊Module
public class WXApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
InitConfig config = new InitConfig.Builder().setImgAdapter(new ImageAdapter()).build();
WXSDKEngine.initialize(this, config);
try {
...
WXSDKEngine.registerModule("close", CloseModule.class);
...
} catch (WXException e) {
e.printStackTrace();
}
}
}
3. 在Weex中使用
weex.requireModule('close').closeApp()
這樣調用Module之后就可以對Android做許多事情了。
退出Activity
這里我還遇到了一個問題,就是在Weex提供的WXModule中如何退出Activity,解決方案為android 關閉多個或指定activity,這篇文章讓我可以非常優雅的管理我的Activity。簡單寫下用法.
1. 在每個Activity的onCreate方法中將Activity對象添加到List中
@Override
protected void onCreate(Bundle savedInstanceState) {
...
CacheActivity.addActivity(NetworkActivity.this);
}
2. 在Module中去關閉Activity
CacheActivity.finishActivity();
3. 當然,別忘了把CacheActivity的代碼貼到項目中去
package com.weex.sample.utlis;
import android.app.Activity;
import java.util.LinkedList;
import java.util.List;
public class CacheActivity {
public static List<Activity> activityList = new LinkedList<Activity>();
public CacheActivity() {
}
/**
* 添加到Activity容器中
*/
public static void addActivity(Activity activity) {
if (!activityList.contains(activity)) {
activityList.add(activity);
}
}
/**
* 便利所有Activigty并finish
*/
public static void finishActivity() {
for (Activity activity : activityList) {
activity.finish();
}
}
/**
* 結束指定的Activity
*/
public static void finishSingleActivity(Activity activity) {
if (activity != null) {
if (activityList.contains(activity)) {
activityList.remove(activity);
}
activity.finish();
activity = null;
}
}
/**
* 結束指定類名的Activity 在遍歷一個列表的時候不能執行刪除操作,所有我們先記住要刪除的對象,遍歷之后才去刪除。
*/
public static void finishSingleActivityByClass(Class<?> cls) {
Activity tempActivity = null;
for (Activity activity : activityList) {
if (activity.getClass().equals(cls)) {
tempActivity = activity;
}
}
finishSingleActivity(tempActivity);
}
}
Over!繼續倒騰Weex中……遇到問題繼續總結。歡迎留言交流~