一.一些注意事项
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");