我们经常需要在启动act的时候传递某些参数,这时一般有2种做法:
- 通过Intent暴露的各种putXXX方法;
- 通过Uri(Intent.getData())param传递;
大部分情况下,我们都会选择第1种方式,偶尔某些数据量很小、轻量级的情况下,可能也会选择第2种方式,但是在使用第2种方式时还是有问题要特别注意下,即url编码问题。
你通过第2种方式绝大多数情况下也都是ok的,但当你用它来传递的某些值里含有特殊字符时,这时解析就会出错,比如像这样“mgj://payresult?textcolor=#ff0000&money=100.85元”
你期望能解析出textcolor=#ff0000
和 money=100.85元
,可是由于特殊字符#
的存在,你的解析会失败!
代码如下:
String urlParam = "mgj://payresult?textcolor=#ff0000&money=100.85元";
Uri uri = Uri.parse(urlParam);
String textcolor = uri.getQueryParameter("textcolor");
String money = uri.getQueryParameter("money");
System.out.println("textcolor = " + textcolor + ", money = " + money);
出问题的原因是,url中key=value这样的键值对没有进行url编码,正确的做法应该如下:
Uri.Builder builder = Uri.parse("mgj://payresult").buildUpon();
builder.appendQueryParameter("textcolor", "#ff0000");
builder.appendQueryParameter("money", "100.85元");
String urlParam = builder.toString();
Uri uri = Uri.parse(urlParam);
String textcolor = uri.getQueryParameter("textcolor");
String money = uri.getQueryParameter("money");
System.out.println("textcolor = " + textcolor + ", money = " + money);
至此,2组key、value都可以正确的解析出来了。