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