欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

weex和Android的界面跳转

程序员文章站 2022-07-02 23:22:09
记录一下,weex和Android的跳转主要表现为三个方面:1、weex 跳转的原生界面 这种方式需求可以通过module扩展的实现。public class WeexCallBackModule extends WXModule { /** * 用于module注册 * @return 返回类名 */ public static String getLocalName(){ return "WeexCallBackMo......

记录一下,weex和Android的跳转
主要表现为三个方面:

1、weex 跳转的原生界面

这种方式需求可以通过module扩展的实现。

public class WeexCallBackModule extends WXModule {

    /**
     * 用于module注册
     * @return 返回类名
     */
    public static String getLocalName(){
        return "WeexCallBackModule";
    }

    
    /**
     * weex跳转原生界面NavigatorActivity
     */
    @JSMethod(uiThread = true)
    public void jumpPage(){
        mWXSDKInstance.getContext().startActivity(new Intent(mWXSDKInstance.getContext(), NavigatorActivity.class));
    }
}

特别注意WeexCallBackModule 的一定要注册,不能被混淆。


2、原生界面跳转到weex界面

1、启动跳转

 Intent intent = new Intent(this, NavigatorActivity.class);
        intent.setData(Uri.parse("https://xxxxxxxx/weex.js"));
        startActivity(intent);

2、实现界面:NavigatorActivity

public class NavigatorActivity extends AppCompatActivity implements IWXRenderListener {

    private WXSDKInstance wxsdkInstance;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1) {
                if (WXSDKEngine.isInitialized()) {
                    startRender();
                }else {
                    handler.sendEmptyMessageDelayed(1,300);
                }
            }
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        wxsdkInstance = new WXSDKInstance(this);
        wxsdkInstance.registerRenderListener(this);
        wxsdkInstance.reloadPage(true);
        if (WXSDKEngine.isInitialized()) {
            startRender();
        }else {
            /**
             * 为防止window 的 token 报错,延迟后在加载js
             */
            handler.sendEmptyMessageDelayed(1,300);
        }
    }
    /**
     * 开始渲染
     */
    private void startRender() {
        /**
         * 初始化 WXSDKInstance
         */
        if (wxsdkInstance == null) {
            wxsdkInstance = new WXSDKInstance(this);
            wxsdkInstance.registerRenderListener(this);
            wxsdkInstance.reloadPage(true);
        }
        String pageName = "WXSample";
        /**
         * 获取intent的携带的js路径
         */
        if (getIntent().getData() != null) {
            String navigatorUrl = getIntent().getData().toString();
            if (!TextUtils.isEmpty(navigatorUrl)) {
                HashMap<String, Object> options = new HashMap<>();
                options.put(WXSDKInstance.BUNDLE_URL,navigatorUrl);
                wxsdkInstance.renderByUrl(pageName, navigatorUrl, options, null, WXRenderStrategy.APPEND_ASYNC);
            }else {
                finish();
            }
        }else {
            finish();
        }
    }
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        /**
         * 处理回退
         */
        if (wxsdkInstance != null) {
            wxsdkInstance.reloadPage(true);
        }

    }
    @Override
    protected void onResume() {
        super.onResume();
        if (wxsdkInstance != null) {
            wxsdkInstance.onActivityResume();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (wxsdkInstance != null) {
            wxsdkInstance.onActivityPause();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (wxsdkInstance != null) {
            wxsdkInstance.onActivityStop();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (wxsdkInstance != null) {
            wxsdkInstance.onActivityDestroy();
        }
        /**
         * 回收handler
         */
        if (handler != null) {
            handler.removeCallbacksAndMessages(null);
            handler = null;
        }
    }

    @Override
    public void onViewCreated(WXSDKInstance instance, View view) {
        /**
         * 添加视图
         */
        setContentView(view);
    }

    @Override
    public void onRenderSuccess(WXSDKInstance instance, int width, int height) {

    }

    @Override
    public void onRefreshSuccess(WXSDKInstance instance, int width, int height) {

    }

    @Override
    public void onException(WXSDKInstance instance, String errCode, String msg) {

    }
}

3、weex  的   Ajs   跳转到    Bjs


这个类型从字面意思看来和原生根本没关系,完全不需要原生配合。想的是合情合理,
可是在具体使用的时,缺出现了意外。报错:activitynotfoundexception
由于官方没有说明,所以第一次遇到这个问题时我也是直接懵了。
为什么会找不到activity,LZ什么都没做,,,,,
后来想想,就对了,就是因为什么都没做,所以才报错。
这种方式很特别  weex 的 js之间 跳转本质是startActivity的过程。
weex的设定是使用activity的category name指定一个activity渲染weex。
所以weex 启动跳转时报错activitynotfoundexception,是因为没有指定渲染weex的activity

详情见下方:

 <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="com.taobao.android.intent.action.WEEX"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="com.taobao.android.intent.category.WEEX"/>
                <action android:name="android.intent.action.VIEW"/>
                <data android:scheme="http"/>
                <data android:scheme="https"/>
                <data android:scheme="file"/>
                <data android:scheme="wxpage"/>
            </intent-filter>
        </activity>


指定了activity以后还是不行,为什么呢,因为会显示错误,需要过滤一下js页面。

 /**
     * 开始渲染
     */
    private void startRender() {
        /**
         * 初始化 WXSDKInstance
         */
        if (wxsdkInstance == null) {
            wxsdkInstance = new WXSDKInstance(this);
            wxsdkInstance.registerRenderListener(this);
            wxsdkInstance.reloadPage(true);
        }
        String pageName = "WXSample";
        /**
         * 获取intent的携带的js路径
         */
        if (getIntent().getData() != null) {
            String navigatorUrl = getIntent().getData().toString();
            if (!TextUtils.isEmpty(navigatorUrl)) {
                HashMap<String, Object> options = new HashMap<>();
                options.put(WXSDKInstance.BUNDLE_URL,navigatorUrl);
                wxsdkInstance.renderByUrl(pageName, navigatorUrl, options, null, WXRenderStrategy.APPEND_ASYNC);
            }else {
                finish();
            }
        }else {
            finish();
        }
    }

这样,才能确定显示的是跳转携带的js地址。

本文地址:https://blog.csdn.net/Naide_S/article/details/109034436