当前位置: 首页 > 科技观察

序列化Intent,像Uri一样传递Intent!

时间:2023-03-18 23:43:13 科技观察

1.你真的需要一个新的Intent吗?在Android中,打开一个Activity有多少种方式?但是不管用什么方法,都无法避免最后创建一个Intent,然后startActivity()。那么,如果要根据数据来确定跳转的页面怎么办呢?需要做的更好。DeepLink似乎是一个很好的解决方案。在AndroidManifest.xml中,定义data字段,标记scheme,host等,然后按规则传递,这样也可以跳转到某些页面。但是真的方便吗?我们需要在每个需要跳转的Activity上设置数据?当然,Github上也有一些成熟的Deeplink解决方案。你只需要为某个Activity设置数据,然后所有的deeplink链接都会跳转到这个Activity,然后由这个RouterActivity决定去哪里。跳转和进位参数。那么有没有其他的方案呢?2.Intent的toUri()直到我发现Intent其实有一个toUri()方法,我以为有一种方法可以简单地序列化Intent。从文档可以看出,toUri()方法可以将一个Intent转化为一个URI,URI里面包含了一些必要的参数,比如action,categories,flags等等。那么文章开头的地方是什么,然后startActivity,最后转换成URI?仔细看,flag、component、putExtra的数据都被序列化成了一个字符串。如何使用获取到的Uri?您可以使用Intent的静态方法parseUri()将IntentURI转换为实际的Intent对象。这样的话,其实下面这个方法也会调用TwoActivity,带上一个balabalaID数据。至此,基本上本文需要说明的都已经说明清楚了。但是对于有追求的程序员来说,我们还是要深挖一下,toUri()到底是做什么的呢?3.toUri()到底做了什么?下面看一下toUri()的具体实现。从源码的实现来看,其实toUri()只是把每个字段读出来,然后按照规则序列化。***parseUri()只是按照这个规则反序列化而已。如果你熟练了,可以不用toUri()方法转换,盲写Intent的URI。4、会不会有什么隐患?我们使用的API都是Intent官方提供的,使用起来似乎没有问题。但它真的像看起来那么好吗?从传递参数的角度来看,toUriInner()方法是对toUri()方法中传递的数据进行序列化的方法。我们来看看具体的实现。可以看出toUriInner()方法对基本数据类型进行了相应的类型转换,比如之前S.id=balabala表示一个String值balabala,key为id。好像所有类型的参数传递都覆盖了,但是没有那么漂亮。我发现没有,没有关于Bundle的参数传递,你错过了吗?代码我也不看,做个实验验证一下。查看Log输出:可以看到toUri()方法并没有对Bundle参数的序列化做特殊处理。结论是虽然toUri()和parseUri()方法确实有用,但它们也有缺陷。Bundle传递的数据不能序列化为Uri。在实际使用中,我们需要对传递的参数有严格的要求,避免使用Bundle传递数据。当然我们也可以自己实现Bundle序列化和反序列化的逻辑。5.结束语这种方式可以简单的传递Intent,从后台服务器获取一个IntentUri,这样就不需要为每次点击都设置一个预定的打开页面。当然具体怎么用还是要看实际的使用场景。今天在城厢魔影公众号后台回复“成长”。我会把我整理的一些学习资料发给你。