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

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

时间:2023-03-15 15:14:07 科技观察

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()究竟做了什么?三、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,这样就不需要为每次点击都设置一个预定的打开页面。当然具体怎么用还是要看实际的使用场景。【本文为专栏作家“张扬”原创稿件,转载请微信♂联系作者获得授权】点此查看作者更多好文