Weex控制Android返回鍵解決方案

正在深刻倒騰weex,但願能夠將weex用在項目中。這裏找出了weex控制Android返回鍵的方法。html

需求

項目使用的是Vue+VueRouter的單頁應用來寫Weex的,現有如下需求。前端

  • 當頁面不在首頁上時,返回上一頁面。 this.$router.go(-1)java

  • 當頁面在首頁是,關閉當前Android應用android

解決方案

Android和Weex的通訊

Android to Weex

使用的是globalEvent來實現的。咱們在 Android 的返回按鈕事件中觸發 globalEvent,在 Weex 中監聽該 globalEventgit

Androidgithub

public void onBackPressed(){
  Map<String,Object> params=new HashMap<>();
  params.put("name","returnmsg");
  mWXSDKInstance.fireGlobalEventCallback("androidback",params);
}

Weexapache

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事件。下面咱們來一步步實現。weex

1. Android中建立CloseModule前端工程師

public class CloseModule extends WXModule {

    @JSMethod(uiThread = false)
    public void closeApp() {
        LogUtil.e("觸發關閉效果");
        CacheActivity.finishActivity();
    }
}

2. 在Application中註冊Moduleapp

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中……遇到問題繼續總結。歡迎留言交流~

關於做者

VioletJack,移動、前端工程師,兩年移動端工做經驗、一年前端工做經驗。現專一於移動前端的學習和開發。擅長Android開發和Vue前端開發。會按期產出關於Android、Vue、移動前端相關的博文。歡迎你們關注我,我會用心維護和經營好博客,多產出高質量文章。同時也但願我所寫的東西能夠幫到有須要的朋友。
新浪微博: http://weibo.com/u/2640909603
掘金:https://gold.xitu.io/user/571...
CSDN: http://blog.csdn.net/violetja...
簡書: http://www.jianshu.com/users/...
Github: https://github.com/violetjack

相關文章
相關標籤/搜索