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

 一、真的需要 new 一个 Intent 吗?

创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的崂山网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

在 Android 中,打开一个 Activity ,有多少种方式?不过不管是使用什么方式,最终都没办法逃避创建一个 Intent ,然后startActivity()。

那么,如果想根据数据来确定跳转的页面呢?

需要怎么做比较好一点。DeepLink 好像是一个不错的解决方案,在 AndroidManifest.xml 中,定义好 data 字段,标记好 scheme 、 host 等等,然后按照规则进行传递,这样也可以跳转到某些页面。

但是,这样真的方便吗?

我们需要在每个需要跳转的 Activity 上,设定好data?当然,现在 Github 上也有一些成熟的 Deeplink 的解决方案,只需要在为某个 Activity 设定 data ,然后所有 deeplink 的链接都跳转到这个 Activity 上,***再由这个RouterActivity,去决定向那里跳转,并携带上参数。

那么还有别的方案吗?

二、Intent的toURI()

直到我发现 Intent 居然有个 toUri() 的方法,我就觉得有办法对 Intent 进行简单的序列化了。

从文档中可以看出,toUri() 方法可以将一个 Intent 转换成一个 URI ,其中包含了 action、categories、flags 等一些必要的参数。

那么文章开头的地方,那个 startActivity ,最终转换成 URI ,是什么呢?

仔细看,flag、compoent、putExtra 的数据,都被序列化成一个字符串了。

得到的这个 Uri ,如何使用呢?可以借助 Intent 的一个静态方法,parseUri() 将一个 Intent 的 URI ,转换成实际的 Intent 对象。

这样的话,其实下面的方式,同样也会调起TwoActivity,并且带过去一个 balabala 的 ID 数据。

到这里,基本上把本篇文章需要讲解的内容都讲明白了。但是有追求的程序员,我们还是要深挖一下,toUri() 到底干了些什么?

三、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 ,这样就无需给每个点击设定好既定的打开页面了。当然,怎么用还是要看实际的使用场景了。

当前文章:将Intent序列化,像Uri一样传递Intent!!!
转载源于:http://www.shufengxianlan.com/qtweb/news46/234396.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联