0


uniapp 与原生android 的交互

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

标签: uni-app android 交互

本文转载自: https://blog.csdn.net/m0_55960697/article/details/131449585
版权归原作者 头发茂盛男孩 所有, 如有侵权,请联系我们删除。

“uniapp 与原生android 的交互”的评论:

还没有评论