uniapp 与原生android 的交互
uniapp打开第三方程序可以通过 HTML5+ API 的API 和反射获取Android的Intent对象来实现,有两种方式,先说最简单的。通过 runtime 可以跳转第三方程序,但是要指定的页面需要通过 runtime.openUrl 传入URLsheme地址。
·
uniapp打开第三方程序可以通过 HTML5+ API 的 runtime API 和 importClass 反射获取Android的Intent对象来实现,有两种方式,先说最简单的。
第一种 runtime:
handleGoApp() {
// #ifdef APP-PLUS
// 判断平台
if (plus.os.name === "Android") {
plus.runtime.launchApplication(
{
// 包名
pname: "com.xxxx.xxxx",
// 传参数
extra: {
"name": "jack",
"password": "xxxx"
}
},
e => {
uni.showToast({
title: "打开失败",
icon: "none"
});
console.log("runtime error ==", e);
}
);
}
else if (plus.os.name === "iOS") {
plus.runtime.launchApplication({ action: "com.xxx.xxx" }, function(e) {
uni.showToast({
title: "打开失败",
icon: "none"
});
console.log("Open system default browser failed: " + e.message);
});
}
// #endif
},
通过 runtime 可以跳转第三方程序,但是要指定的页面需要通过 runtime.openUrl 传入URLsheme地址
<button class="button" @click="openURL('taobao://s.taobao.com/search?q=javaScript')">
打开淘宝搜索页面
</button>
openURL(url) {
// #ifdef APP-PLUS
plus.runtime.openURL(url, function(res) {
uni.showModal({
content: "本机未检测到淘宝客户端,是否打开浏览器访问淘宝?",
success: function(res) {
if (res.confirm) {
plus.runtime.openURL("https://s.taobao.com/search?q=uni-app");
}
}
});
});
// #endif
},
第二种方式 使用Android API:
目前有个需求,需要和android进行交互并传参数过去然后进行某种需要(跳转页面、处理逻辑...),那么使用runtime API远远不够,有可能你传的参数android没有接收到。
android是通过intent来进行交互的,所以就需要使用android的api来 编码。
handleAndroidGoApp(){
// 获取宿主上下文
var main = plus .android.runtimeMainActivity();
// 通过反射获取Android的Intent对象
var Intent = plus.android.importClass("android.content.Intent");
// 通过宿主上下文创建 intent
var intent =new Intent(Intent.ACTION_VIEW); // 设置要开启的Activitv包类路径
// intent.setClassName(包名, 包名+activity名(包类名));
intent.setClassName("com.android.**.**","com.android.**.**.**")
// 开启新的任务栈(跨进程)
// intent.setFlags(Intent.FLAG ACTIVITY NEW TASK) ;
// uni向android原生界面传值
intent.putExtra("name","jack");
intent.putExtra("password","xxxx");
// 请求码保证了,开始的新界面和返回的是同一个操作
var CODE_REQUEST= 0;
// 采用startActivityForResult开启新的界面,当界面关闭时可以处理返回结果,CODE REQUEST请求码是唯一标识
main.startActivityForResult(intent,CODE_REQUEST);
// 设置原生界面返回后的回调操作
main.onActivityResult = function(requestCode, resultCode, data){
console.log("onActivityResult ===",requestCode, resultCode, data);
}
},
补充:
Android之Intent的setClassName、setComponent的区别
setClassName:跳转到不同Applicaiton的activity或者service
setComponent:setClassName内部也是调用的setComponent。
打开外部应用:intent.setClassName(包名, 包名+activity名);
public void onClick(View v)
Intent intent = new Intent();
intent.setClassName("com.test.hello", "com.test.hello.AAA");
或者
intent.setComponent(new ComponentName("com.test.hello","com.test.hello.AAA"));
startActivity(intent);
}
Android之Intent和runtime跳转方式
具体的跳转原理我也不是很清楚,只说下结果把。
intent 通过 main.startActivityForResult(intent,CODE_REQUEST); 跳转是并没打开另一个app,只是把当前页面切换成你需要跳转的页面。
而 runtime 是真正的打开另一个app程序。
更多推荐
已为社区贡献3条内容
所有评论(0)