在 Android 中,打开一个 Activity ,有多少种方式?不过无论是使用什么方式,最终都没办法逃避建立一个 Intent ,而后startActivity()
。程序员
那么,若是想根据数据来肯定跳转的页面呢?后端
须要怎么作比较好一点。DeepLink 好像是一个不错的解决方案,在 AndroidManifest.xml 中,定义好 data 字段,标记好 scheme 、 host 等等,而后按照规则进行传递,这样也能够跳转到某些页面。服务器
可是,这样真的方便吗?学习
咱们须要在每一个须要跳转的 Activity 上,设定好data?固然,如今 Github 上也有一些成熟的 Deeplink 的解决方案,只须要在为某个 Activity 设定 data ,而后全部 deeplink 的连接都跳转到这个 Activity 上,最后再由这个RouterActivity,去决定向那里跳转,并携带上参数。3d
那么还有别的方案吗?code
直到我发现 Intent 竟然有个 toUri()
的方法,我就以为有办法对 Intent 进行简单的序列化了。cdn
从文档中能够看出,toUri()
方法能够将一个 Intent 转换成一个 URI ,其中包含了 action、categories、flags 等一些必要的参数。xml
那么文章开头的地方,那么 startActivity ,最终转换成 URI ,是什么呢?对象
仔细看,flag、compoent、putExtra 的数据,都被序列化成一个字符串了。blog
获得的这个 Uri ,如何使用呢?能够借助 Intent 的一个静态方法,parseUri()
将一个 Intent 的 URI ,转换成实际的 Intent 对象。
这样的话,其实下面的方式,一样也会调起TwoActivity,而且带过去一个 balabala 的 ID 数据。
到这里,基本上把本篇文章须要讲解的内容都讲明白了。可是有追求的程序员,咱们仍是要深挖一下,toUri()
到底干了些什么?
来看看 toUri()
的具体实现。
从源码的实现看,其实 toUri()
只是把每一个字段读取出来,而后按照规则进行序列化,最后 parseUri()
只是按照这个规则进行了反序列化。熟练的话,基本上无需使用 toUri()
这个方法转换,就能够盲写 Intent 的 URI。
咱们使用的 API 都是官方对 Intent 提供的,用起来好像也确实没有什么问题。可是真的像看上去那么美好吗?
从传递参数的方向看,toUriInner()
方法是toUri()
方法中,对传递的数据进行序列化的方法。下面看看具体实现。
能够看到, toUriInner()
方法,它对基本的数据类型,都有对应的类型进行转换,例如以前S.id=balabala 表示一个 key 为 id 的 String 类型的值 balabala 。
好像已经涵盖了全部的类型传参了,但是并非这么美好。发现没有,没有关于 Bundle 的参数传递,难道是看漏了吗?
代码也不看了,作个试验验证一下。
看看 Log 输出:
能够看到,toUri()
这个方法,确实对 Bundle 参数的序列化并无作特殊处理。
获得的结论,就是虽然 toUri()
和 parseUri()
方法确实很好用,可是也是有缺陷的,Bundle 传递的数据无法序列化成 Uri。
实际使用中,就须要咱们对传递的参数有严格的要求,避免使用 Bundle 去传递数据,固然咱们也能够本身去是实现序列化和反序列化 Bundle 的逻辑。
这样就能够简单的对 Intent 进行传递,能够从后端服务器拿到一个 IntentUri ,这样就无需给每一个点击设定好既定的打开页面了。固然,怎么用仍是要看实际的使用场景了。
今天在承香墨影公众号的后台,回复『成长』。我会送你一些我整理的学习资料。
点赞或者分享吧~