Weex页面 android多应用选择跳转解决方案

575 阅读1分钟

在weex上了市场这后,反馈出现应用打开之后,在进行二级界面跳转时,会选择多个应用跳转,查看资料 xie.infoq.cn/article/f09… 等处理之后,找到了一些解决思路

  • 文章中解决的方法是新建一个Module类,重新写Push方法,weex界面通过新module的新方法来实现跳转,但这样,就需要修改js界面的调用方法,升级成本偏高,而且ios端也需要修改。

最终考虑通过重写原生push方法解决,通过3步走,解决跳转选择应用问题

1.新建一NavigatorModule 继承自 WXNavigatorModule

public class JlpayWXNavigatorModule extends WXNavigatorModule {


//定制CATEGORY 解决手机装其他Weex应用,会选择跳转的问题
private final String CATEGORY_WEEX = "com.company.android.intent.category.WEEX";

@JSMethod(
        uiThread = true
)
public void push(String param, JSCallback callback) {
    if (!TextUtils.isEmpty(param)) {
        if (WXSDKEngine.getActivityNavBarSetter() != null && WXSDKEngine.getActivityNavBarSetter().push(param)) {
            if (callback != null) {
                callback.invoke("WX_SUCCESS");
            }

            return;
        }

        if (this.mWXSDKInstance.getContext() instanceof Activity) {
            Activity activity = (Activity) this.mWXSDKInstance.getContext();
            if (WXSDKEngine.getNavigator() != null && WXSDKEngine.getNavigator().push(activity, param)) {
                if (callback != null) {
                    callback.invoke("WX_SUCCESS");
                }

                return;
            }
        }

        try {
            JSONObject jsonObject = JSON.parseObject(param);
            String url = jsonObject.getString("url");
            if (!TextUtils.isEmpty(url)) {
                Uri rawUri = Uri.parse(url);
                String scheme = rawUri.getScheme();
                Uri.Builder builder = rawUri.buildUpon();
                if (TextUtils.isEmpty(scheme)) {
                    builder.scheme("http");
                }

                Intent intent = new Intent("android.intent.action.VIEW", builder.build());
                intent.addCategory(CATEGORY_WEEX);
                intent.putExtra("instanceId", this.mWXSDKInstance.getInstanceId());
                this.mWXSDKInstance.getContext().startActivity(intent);
                if (callback != null) {
                    callback.invoke("WX_SUCCESS");
                }
            }
        } catch (Exception var9) {
            WXLogUtils.eTag("Navigator", var9);
            if (callback != null) {
                callback.invoke("WX_FAILED");
            }
        }
    } else if (callback != null) {
        callback.invoke("WX_FAILED");
    }

}
}

2. 在WxSDKEngine中注册这个Module

WXSDKEngine.registerModule("navigator", JlpayWXNavigatorModule.class);

3. 在AndroidManifest文件中,更新响应WeexPageAcitvity的Category.

	<activity
        android:name=".weex.WXPageActivity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <action android:name="com.alibaba.weex.protocol.openurl" />
            <action android:name="com.taobao.android.intent.action.WEEX" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="com.company.android.intent.category.WEEX" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:scheme="file" />
            <data android:scheme="wxpage" />
        </intent-filter>
    </activity>

运行,顺利解决。 注意 1.中的CATEGORY_WEEX 和3.中的category 要匹配