uni-app跳转Android原⽣界⾯(Activity),并传值交互
赶时间的同学看这段代码就⾏了,剩下的可以不看:
var main = plus.android.runtimeMainActivity();
var Intent= plus.android.importClass("t.Intent")
intent.setComponent(new ComponentName("应⽤包名","应⽤包名.activity类名"));
intent.putExtra("type", 1);
main.startActivityForResult(intent, 0);
⼀、uni-app 跳转Android原⽣界⾯(Activity)并传值
前端传值操作
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<input type="button" value="js start native Activity" onclick="jsCallNativeActivity()"/>
</body>
<script type="text/javascript">
function jsCallNativeActivity(){
//获取宿主上下⽂
var main = plus.android.runtimeMainActivity();
//通过反射获取Android的Intent对象
var Intent = plus.android.importClass("t.Intent");
//通过宿主上下⽂创建 intent
var intent = new Intent());
//设置要开启的Activity包类路径 com.HBuilder.integrate.MainActivity换掉你⾃⼰的界⾯
intent.setClassName(main, "com.HBuilder.integrate.MainActivity");
//开启新的任务栈(跨进程)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//向原⽣界⾯传值操作
intent.putExtra("uni_key","来⾃uniapp的值");
//开启新的界⾯
main.startActivity(intent);
}
</script>
</html>
做Android的都知道intent.putExtra(key,value)就是通过Intent进⾏不同组件之间传值操作,前端开发⼈员我建议直接封装成json传值,intent.putExtra(“uni_json_key”,"{key,“value1”}");
Android端接收传值
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
Intent mIntent = getIntent();
if (mIntent!=null){
//获取Intent,通过key获取对应的值
String uniValue = StringExtra("uni_key");
Toast.makeText(this, "uniValue="+uniValue, Toast.LENGTH_SHORT).show();
}
}
}
效果如下:
⼆、uni-app 跳转Android原⽣界⾯(Activity)并传值,并返回uni-app时带返回值uni-app开启android 原⽣界⾯,并请求返回值
function jsCallNativeActivity(){
//获取宿主上下⽂
var main = plus.android.runtimeMainActivity();
//通过反射获取Android的Intent对象
var Intent = plus.android.importClass("t.Intent");
//通过宿主上下⽂创建 intent
var intent = new Intent());
//设置要开启的Activity包类路径 com.HBuilder.integrate.MainActivity换掉你⾃⼰的界⾯
intent.setClassName(main, "com.HBuilder.integrate.MainActivity");
//开启新的任务栈(跨进程)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//uni向android原⽣界⾯传值
intent.putExtra("uni_key","来⾃uniapp的值");
//请求码保证了,开始的新界⾯和返回的是同⼀个操作
var CODE_REQUEST=1000
//采⽤startActivityForResult开启新的界⾯,当界⾯关闭时可以处理返回结果, CODE_REQUEST请求码是唯⼀标识
main.startActivityForResult(intent,CODE_REQUEST);
//设置原⽣界⾯返回后的回调操作
if (requestCode == CODE_REQUEST) {
alert(requestCode); //这个是正确的 1000
alert(resultCode); //始终都是0
alert(data); //弹出 undefined
}
}
}
Android端点击按钮,关闭原⽣界⾯,返回值
public void backValue(View view) {
Intent mIntent = new Intent();
js获取json的key和valuemIntent.putExtra("Native_RESULT_Key", "来⾃原⽣界⾯的返回值");
setResult(Activity.RESULT_OK, mIntent);
finish();
}
上⾯⼀顿操作后,理论上应该是可以返回值的,但是实际上除了requestCode是正确的,其他的值都是错误的,为什么呢?我跟了安卓这边的官⽅demo源码,发现有bug,onActivityResult⽅法居然在开启新界⾯的时候就被调⽤,在返回的时候设置
setResult(Activity.RESULT_OK, mIntent);后onActivityResult压根就没有⾛,所以这样resultCode和data都没有被正常赋值,如下图log
可以看到官⽅在这⾥挖了⼀个坑,多少⼈跳了进去,为什么他的⽣命周期⽅法会调⽤错乱呢?uni-app的demo是这么写的,⽤⼀个代理类去处理所有的事件操作
只能看Android的官⽅源码
也就是在我们开启原⽣的activity重新开始交互时,将在onResume()之前调⽤onActivityResult将上个界⾯的值返回,现在onActivityResult没有执⾏,说明uni-app在某些地⽅做了⽅法拦截,导致Android⽣命周期⽅法回调异常;所以这个问题需要uni-app官⽅处理,把Android的⽣命周期理顺
我个⼈提出的解决⽅案就是采⽤EventBus去⼿动调⽤SDK_WebApp中的onActivityResult,具体如下
1、adle 依赖 implementation 'obot:eventbus:3.0.0'
2、创建DataSynEvent
public class DataSynEvent {
public int requestCode;
public int resultCode;
public Intent data;
public DataSynEvent(int requestCode, int resultCode, Intent data) {
this.data = data;
}
}
3、SDK_WebApp.java修改
public class SDK_WebApp extends Activity implements IActivityDelegate {
private static final String TAG = "SDK_WebApp";
....
@Override
public void onCreate(Bundle savedInstanceState) {
.
...
//注册EventBus
}
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy: ");
//解绑EventBus
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult: " + data + ",requestCode=" + requestCode + ",resultCode=" + resultCode);
if (data!=null){
//第⼀次启动的时候调⽤这个⽅法data肯定为null.所以减少调⽤次数
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onDataSynEvent(DataSynEvent event) {
Log.d(TAG, "onDataSynEvent: ");
//⼿动调⽤
questCode, sultCode, event.data);
}
}
4、修改原⽣界⾯的返回⽅法
public void backValue(View view) {
Intent data= new Intent();
data.putExtra("Native_RESULT_Key", "来⾃原⽣界⾯的返回值");
//⽤EventBus替换setResult(Activity.RESULT_OK,data);
finish();
}
5、修改前端的接收⽅法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论