Interação entre uniapp e android nativo

O uniapp pode abrir um programa de terceiros obtendo o objeto Android Intent por meio da API de tempo de execução da API HTML5+ e da reflexão importClass . Existem duas maneiras. Vamos falar sobre a mais simples primeiro.

O primeiro tempo de execução:

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

Você pode acessar programas de terceiros por meio do tempo de execução, mas a página que você deseja especificar precisa passar o endereço URLsheme por meio de 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
},

A segunda maneira usa a API Android:

Atualmente existe a necessidade de interagir com o android e passar parâmetros para ele para realizar determinadas necessidades (páginas de salto, lógica de processamento...), então usar a API runtime não é suficiente. É possível que os parâmetros que você passou para o android tenham não foi recebido.

O Android interage por meio da intenção, então você precisa usar a API do Android para codificação.

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

},

Reabastecimento:

A diferença entre setClassName e setComponent do Android Intent

setClassName : salta para a atividade ou serviço de diferentes aplicativos
setComponent: setClassName também é chamado internamente de setComponent.

Abra um aplicativo externo: intent.setClassName(nome do pacote, nome do pacote+nome da atividade);

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

Intenção do Android e métodos de salto em tempo de execução

Não estou muito claro sobre o princípio específico do salto, então vou apenas contar os resultados.

A intenção passa por main.startActivityForResult(intent,CODE_REQUEST); Ele não abre outro aplicativo, apenas muda a página atual para a página para a qual você precisa pular.

O tempo de execução está, na verdade, abrindo outro programa de aplicativo.

Acho que você gosta

Origin blog.csdn.net/m0_55960697/article/details/131449585
Recomendado
Clasificación