文章目录

  • 背景
  • 分析过程
  • 解决方案
  • 方案 1
  • 方案 2


背景

demo 播测,需要使用 adb 命令拉起播测 demo,并传必要的参数将值带给我。

其中有个播放地址的值,传过来时发现值不完整,缺少了一部分。

后面发现是存在特殊字符,传参时导致了截断,故不完整。只需要特殊编码或者处理下就好。


分析过程

获取传参值的代码为:

private void  testIntentData() {

        System.out.println("> --- testIntentData ---");
        Intent intent = getIntent();
        String action = "", type = "", url = "";
        if (intent != null){
            System.out.println("> intent not null");
            if (intent.hasExtra("action")){
                action = intent.getStringExtra("action");
            }
            if (intent.hasExtra("type")){
                type = intent.getStringExtra("type");
            }
            if (intent.hasExtra("url")){
                url = intent.getStringExtra("url");
            }

            System.out.println("> action: " + action + ", type: " + type
            + ", url: " + url);
            return;
        }

        System.out.println("> intent is null");
    }

上面接收三个参数对应的值:action 参数、type 参数和 url 参数。

adb 拉起 apk 命令:

adb shell am start -n com.example.myapplication/com.example.myapplication.MainActivity -e action "pull" -e type "open" -e url "http://www.baidu.com?name=zouqi"

命令说明:adb shell am start -n [包名]/[启动类名] -e [参数key] [参数值] ...

调用如下:

android adb发送无序广播 adb发送广播带参数_拉起apk并传参

输出结果:

android adb发送无序广播 adb发送广播带参数_拉起apk并传参_02

可以看到,通过 adb 命令传参的参数值都不存在特殊字符,故成功的获取到了传进来的所有参数的值。

如果我们的传参的 url 参数值变为 http://www.baidu.com?name=imxiaoqi&age=27&no=yh9527

调用:

android adb发送无序广播 adb发送广播带参数_android_03

输出结果:

android adb发送无序广播 adb发送广播带参数_adb shell_04

这里发现 url 的值被截断了,这是因为 url 参数值中存在特殊字符 &

adb shell 相当于是在 linux shell 环境下运行的,而 & 符号是 shell 中的特殊字符,表示后台运行,因此会出现截断的情况。


解决方案

方案 1

使用命令:

adb shell am start -n com.example.myapplication/com.example.myapplication.MainActivity -e action "pull" -e type "open" -e url "http://www.baidu.com?name=imxiaoqi\&age=27\&no=yh9527"

android adb发送无序广播 adb发送广播带参数_adb 命令_05


这里只是对特殊字符 & 做了简单的处理,至于其他特殊字符同学们可以自己去实践,这里不推荐采用该方案,因为可能有些参数值的特殊字符单纯加 \ 无法生效。

方案 2

将参数值进行 urlEncode 编码后传递,代码中获取到参数值后,再进行解码操作即可。

推荐编码工具网站:URL编码/解码

修改代码:

private void  testIntentData() {

        System.out.println("> --- testIntentData ---");
        Intent intent = getIntent();
        String action = "", type = "", url = "";
        if (intent != null){
            System.out.println("> intent not null");
            if (intent.hasExtra("action")){
                action = intent.getStringExtra("action");
            }
            if (intent.hasExtra("type")){
                type = intent.getStringExtra("type");
            }
            if (intent.hasExtra("url")){
                url = intent.getStringExtra("url");
                System.out.println("> 编码 url: " + url);
                url = URLDecoder.decode(url);
                System.out.println("> 解码 url:" + url);
            }

            System.out.println("> action: " + action + ", type: " + type
            + ", url: " + url);
            return;
        }

        System.out.println("> intent is null");
    }

http://www.baidu.com?name=imxiaoqi&age=27&no=yh9527 编码后的值

http%3a%2f%2fwww.baidu.com%3fname%3dimxiaoqi%26age%3d27%26no%3dyh9527

如下图:

android adb发送无序广播 adb发送广播带参数_拉起apk并传参_06

输入命令如下:

android adb发送无序广播 adb发送广播带参数_android adb发送无序广播_07

输出结果:

android adb发送无序广播 adb发送广播带参数_adb shell_08

推荐解决方案 2 ,解决几乎所有情况!


技术永不眠!我们下期见!