将 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!!!的更多相关文章
- Intent之复杂数据的传递
想在两个Activity之间传递一个对象Result,在网上差了很多,都需要序列化或者时下Paracelable,等等,试了很多都不行. 后来才制单,这个Result,根本不需要集成Sereriabl ...
- Intent界面跳转与传递数据
Activity跳转与传值,主要是通过Intent类,Intent的作用是激活组件和附带数据. intent可以激活Activity,服务,广播三类组件. 本博文讲的是显示意图激活Activity组件 ...
- new Intent(String action,Uri uri)构造器说明
这是myDiary这个工程下MainActivity中的protected void onListItemClick(ListView l, View v, int position, long id ...
- 安卓开发-intent在Activity之间数据传递
安卓开发-intent在Activity之间数据传递 [TOC] intent实现普通跳转 使用intent的setclass方法,示例(由此界面跳转到NewActivity界面) //使用setOn ...
- 【Android】7.0 Intent向下一个活动传递数据、返回数据给上一个活动
1.0 可以利用Intent吧数据传递给上一个活动,新建一个叫“hellotest01”的项目. 新建活动FirstActivity,勾选“Generate Layout File”和“Launche ...
- 转:Intent 操作常用URI代码示例
以下是常用到的Intent的URI及其示例,包含了大部分应用中用到的共用Intent 一.打开一个网页,类别是Intent.ACTION_VIEW 1 2 Uri uri = Uri.parse(&q ...
- 重复启动某一款应用,并传递intent参数
Intent intent = getPackageManager().getLaunchIntentForPackage(packageName); intent.setFlags(Intent.F ...
- 【Android】6.0 添加Menu菜单组件、Intent启动活动、显式Intent、隐式Intent
1.0 在helloworld项目基础上创建活动SecondActivity: 2.0 其中main.xml: <?xml version="1.0" encoding=&q ...
- Android中Intent具体解释(二)之使用Intent广播事件及Broadcast Receiver简单介绍
通过第一篇的解说,我们已经看到了怎样使用Intent来启动新的应用程序组件,可是实际上他们也能够使用sendBroadcast方法来在组件间匿名的广播消息. 作为一个系统级别的消息传递机制,Inten ...
随机推荐
- [ASP.NET MVC]笔记(二) 数据注解和验证
验证注解的使用 1.Required:必须字段 [Required] public string FirstName() { get; set; } 2.StringLength:长度限制,或是可选项 ...
- datable 翻页事件处理
JQuery datatable插件,点下一页在点击事件无效问题 (2013-10-16 16:01:54) 转载▼ 分类: C# 在MVC的项目中,我利用jquery datatable 来实现 ...
- NFA的实现
此次发表的是一个不确定的自动机(NFA),它可以根据输入的正规式输出由函数映像表示的结果. 此版本可以输入括号'(',')',但是,实现的过程理解起来有点吃力,所以,在时间允许的情况下,我还将写新文章 ...
- 【1414软工助教】团队作业5——测试与发布(Alpha版本) 得分榜
题目 团队作业5--测试与发布(Alpha版本) 作业提交情况情况 所有团队按时提交. 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 团队作业1 ...
- 团队作业4----第一次项目冲刺(Alpha版本)4.28
a.提供当天站立式会议照片 会议内容 今天我们主要针对统计结果的表现形式进行了一些讨论,我们考虑是直接显示统计数据或者是用一些直观的图形来体现,最后经过讨论我们大部分人认为选择数据与图形更加形象直观. ...
- 【C++】关于pow函数的用法
在C++中,pow有多个重载函数: 在dev中,pow(int,int)可以执行,但是在别的地方是不可以被编译的:会提示 :error C2668: “pow”: 对重载函数的调用不明确 可以看见,是 ...
- 201521123012 《Java程序设计》第八周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 1.本次作业题集集合 List中指定元素的删除(题目4 ...
- 201521123015 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过? ...
- 201521044152<java程序设计>第一周学习总结
本周学习总结 java开发时间虽然很短,但是发展迅速,已成为现在非常流行的一门语言,很开心能有幸学习java.第一周学习了java的平台,运行环境jdk以及jrt等等新名词,还了解了eclipse的基 ...
- 201521123106 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前 ...