uniapp 与原生android 的交互

  • Post author:
  • Post category:uniapp


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程序。



版权声明:本文为m0_55960697原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。