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.