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中……遇到问题继续总结。欢迎留言交流~
关于作者
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