Interaction entre Uniapp et Android natif

uniapp peut ouvrir un programme tiers en obtenant l'objet Android Intent via l'API d'exécution de l'API HTML5+ et la réflexion importClass . Il existe deux manières. Parlons d'abord de la plus simple.

Le premier 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
},

Vous pouvez accéder à des programmes tiers via le runtime, mais la page que vous souhaitez spécifier doit transmettre l'adresse URLsheme via runtime.openUrl.

<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
},

La deuxième méthode utilise l'API Android :

Il est actuellement nécessaire d'interagir avec Android et de lui passer des paramètres pour répondre à certains besoins (saut de pages, logique de traitement...), donc utiliser l'API du runtime n'est pas suffisant. Il est possible que les paramètres que vous avez passés à Android n'aient pas été utilisés. été reçu.

Android interagit par intention, vous devez donc utiliser l'API d'Android pour le codage.

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);
	}

},

Remplir:

La différence entre setClassName et setComponent d'Android Intent

setClassName : accédez à l'activité ou au service de différentes applications
setComponent : setClassName est également appelé en interne setComponent.

Ouvrez une application externe : intent.setClassName (nom du package, nom du package + nom de l'activité) ;

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);
}

Méthodes d'intention Android et de saut d'exécution

Je ne suis pas très clair sur le principe spécifique du saut, je vais donc juste vous dire les résultats.

L'intention passe par main.startActivityForResult(intent,CODE_REQUEST); Il n'ouvre pas une autre application, il bascule simplement la page actuelle vers la page à laquelle vous devez accéder.

Le runtime ouvre en fait un autre programme d’application.

おすすめ

転載: blog.csdn.net/m0_55960697/article/details/131449585