Weex控制Android返回鍵解決方案

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容