Hbuilderx 与原生android混合使用经验

498 阅读3分钟

一.一些注意事项

1.一个android项目中原生作为入口,想跳转到多个hbuilder中的项目,需使用hbuilder3.1.10一下的版本,3.1.0之后需要配置appkey
2.android项目中原生作为入口,想跳转到UniApp会失败,提示找不到路径,只能跳转5+项目
3.保持原生android中使用的lib.5plus.base-release等aar版本和Hbuilder程序版本号一致,然后再使用Hbuilder发行生成本地打包app资源,androidStudio中assets加入该app资源不然可能会出现白屏或者其他错误,参考官方文档:nativesupport.dcloud.net.cn/AppDocs/use…
4.Hbuilder历史版本记录hx.dcloud.net.cn/Tutorial/Hi…

二.原生跳转到Hbuilder代码

方法一.通过SDK.startWebApp方法

package com.bn.apron.other;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import com.bn.util.UpdateManager;
import com.nostra13.dcloudimageloader.core.ImageLoaderConfiguration;
import com.nostra13.dcloudimageloader.core.ImageLoaderL;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import io.dcloud.EntryProxy;
import io.dcloud.RInformation;
import io.dcloud.common.DHInterface.IApp;
import io.dcloud.common.DHInterface.ICore;
import io.dcloud.common.DHInterface.IOnCreateSplashView;
import io.dcloud.common.DHInterface.ISysEventListener;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.IWebviewStateListener;
import io.dcloud.feature.internal.sdk.SDK;

public class IOInspectionActivity extends AppCompatActivity {

    EntryProxy mEntryProxy = null;
    String args;
    String appBasePath;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 设置启动参数,可在页面中通过plus.runtime.arguments;方法获取到传入的参数
        args = getIntent().getStringExtra("inputJSON");
        appBasePath = getIntent().getStringExtra("appBasePath");
        if (mEntryProxy == null) {
            FrameLayout f = new FrameLayout(this);
            // 创建5+内核运行事件监听
            WebappModeListener wm = new WebappModeListener(this, f);
            // 初始化5+内核
            mEntryProxy = EntryProxy.init(this, wm);
            // 启动5+内核
            mEntryProxy.onCreate(this, savedInstanceState, SDK.IntegratedMode.RUNTIME, null);
            setContentView(f);
        }
        getSupportActionBar().hide();

        if(appBasePath.equals("/apps/H5B1297D9")){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    checkVersion();
                }
            }).start();
        }
    }

    class WebappModeListener implements ICore.ICoreStatusListener, IOnCreateSplashView {
        Activity activity;
        View splashView = null;
        ViewGroup rootView;
        IApp app = null;
        ProgressDialog pd = null;

        public WebappModeListener(Activity activity, ViewGroup rootView) {
            this.activity = activity;
            this.rootView = rootView;
        }

        @Override
        public void onCoreInitEnd(ICore coreHandler) {

            // 表示Webapp的路径在 file:///android_asset/apps/H5B1297D9
            //String appBasePath = "/apps/H5B1297D9";
            //String appBasePath = "/apps/H5E6CCAC5";

            // 启动启动独立应用的5+ Webapp
            app = SDK.startWebApp(activity, appBasePath, args, new IWebviewStateListener() {
                // 设置Webview事件监听,可在监监听内获取WebIvew加载内容的进度
                @Override
                public Object onCallBack(int pType, Object pArgs) {
                    switch (pType) {
                        case IWebviewStateListener.ON_WEBVIEW_READY:
                            // WebApp准备加载事件
                            // 准备完毕之后添加webview到显示父View中,
                            // 设置排版不显示状态,避免显示webview时html内容排版错乱问题
                            View view = ((IWebview) pArgs).obtainApp().obtainWebAppRootView().obtainMainView();
                            view.setVisibility(View.INVISIBLE);
                            rootView.addView(view, 0);
                            break;
                        case IWebviewStateListener.ON_PAGE_STARTED:
                            pd = ProgressDialog.show(activity, "加载中", "0/100");
                            break;
                        case IWebviewStateListener.ON_PROGRESS_CHANGED:
                            // WebApp首页面加载进度变化事件
                            if (pd != null) {
                                pd.setMessage(pArgs + "/100");
                            }
                            break;
                        case IWebviewStateListener.ON_PAGE_FINISHED:
                            // WebApp首页面加载完成事件
                            if (pd != null) {
                                pd.dismiss();
                                pd = null;
                            }
                            // 页面加载完毕,设置显示webview
                            app.obtainWebAppRootView().obtainMainView().setVisibility(View.VISIBLE);
                            break;
                    }
                    return null;
                }
            }, this);

            app.setIAppStatusListener(new IApp.IAppStatusListener() {
                // 设置APP运行事件监听
                @Override
                public boolean onStop() {
                    // 应用运行停止时调用
                    rootView.removeView(app.obtainWebAppRootView().obtainMainView());
                    return false;
                }

                @Override
                public String onStoped(boolean b, String s) {
                    return null;
                }

                @Override
                public void onStart() {
                    // 独立应用启动时触发事件
                }

                @Override
                public void onPause(IApp arg0, IApp arg1) {
                    // WebApp暂停运行时触发事件

                }
            });
        }

        @Override
        public void onCoreReady(ICore coreHandler) {
            // 初始化SDK并将5+引擎的对象设置给SDK
            SDK.initSDK(coreHandler);
            //
            SDK.requestAllFeature();
        }

        @Override
        public boolean onCoreStop() {
            // 当返回false时候回关闭activity
            return false;
        }

        @Override
        public Object onCreateSplash(Context pContextWrapper) {
            splashView = new FrameLayout(activity);
//            splashView.setBackgroundResource(RInformation.DRAWABLE_SPLASH);
            rootView.addView(splashView);
            //图片预览初始化
            ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(pContextWrapper);
            ImageLoaderL imageLoaderL = ImageLoaderL.getInstance();
            if (!imageLoaderL.isInited()) {
                imageLoaderL.init(configuration);
            }
            return null;
        }

        @Override
        public void onCloseSplash() {
            rootView.removeView(splashView);
        }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return mEntryProxy.onActivityExecute(this, ISysEventListener.SysEventType.onCreateOptionMenu, menu);
    }

    @Override
    public void onPause() {
        super.onPause();
        mEntryProxy.onPause(this);
    }

    @Override
    public void onResume() {
        super.onResume();
        mEntryProxy.onResume(this);
    }

    @SuppressLint("WrongConstant")
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if (intent.getFlags() != 0x10600000) {
            // 非点击icon调用activity时才调用newintent事件
            mEntryProxy.onNewIntent(this, intent);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mEntryProxy.onStop(this);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        boolean _ret = mEntryProxy.onActivityExecute(this, ISysEventListener.SysEventType.onKeyDown, new Object[] { keyCode, event });
        return _ret ? _ret : super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        boolean _ret = mEntryProxy.onActivityExecute(this, ISysEventListener.SysEventType.onKeyUp, new Object[] { keyCode, event });
        return _ret ? _ret : super.onKeyUp(keyCode, event);
    }

    @Override
    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
        boolean _ret = mEntryProxy.onActivityExecute(this, ISysEventListener.SysEventType.onKeyLongPress, new Object[] { keyCode, event });
        return _ret ? _ret : super.onKeyLongPress(keyCode, event);
    }

    public void onConfigurationChanged(Configuration newConfig) {
        try {
            int temp = this.getResources().getConfiguration().orientation;
            if (mEntryProxy != null) {
                mEntryProxy.onConfigurationChanged(this, temp);
            }
            super.onConfigurationChanged(newConfig);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        mEntryProxy.onActivityExecute(this, ISysEventListener.SysEventType.onActivityResult, new Object[]{requestCode, resultCode, data});
    }

    public void result(String msg) {
        Intent data = new Intent();
        data.putExtra("return_data", msg);
        setResult(1, data); //设置返回数据
        finish();
    }

    //版本检测
    private void checkVersion() {
        UpdateManager update = new UpdateManager(this);
        update.setShowInfo(true);
        update.checkVersion();
    }

}

方法二

1.创建一个类继承io.dcloud.WebAppActivity

import io.dcloud.WebAppActivity.WebAppActivity;

public class IOInspectionActivity extends WebAppActivity{
    public IOInspectionActivity() {
    }
}

2.原生Intent跳转到这个页面,携带参数appid

Intent intent = new Intent();
intent.putExtra("appid",appId);
intent.setClass(context, IOInspectionActivity.class);
context.startActivity(intent);

三.原生跳转H5参数的传递与获取

1.通过SDK.startWebApp方法时可以通过args携带参数 原生传递参数

String args = "{\"userId\":\"" + UserId+ "\",\"password\":\"" + pwd + "\"}";
SDK.startWebApp(activity, appBasePath, args, new IWebviewStateListener() {});

h5获取参数

var userInfo = plus.runtime.arguments;
userInfo = JSON.parse(userInfo);
ocalStorage.PunishApp_checkId = userInfo.userId;
localStorage.PunishApp_password = userInfo.password;

2.通过intent携带参数 h5获取参数

let mainActivity = plus.android.runtimeMainActivity();
let runIntent = mainActivity.getIntent();
let username = runIntent.getStringExtra("uesrname");
let password = runIntent.getStringExtra("password");