我正在尝试理解Android中的意图机制,并且对我想要解决的问题感到困惑。
Android为intent&提供动作+数据+类别意图过滤器。数据提供URI和/或MIME类型。意图也可以有一堆额外的值。
我想问为什么数据,即URI& Android中真的需要MIME类型吗?
为什么一切都不是行动的动作和类别?
URI&从某种意义上说,MIME类型添加,如果它们丢失了会真正破坏什么?
我也问这一切,因为当我看到手机,短信和地图等应用程序时,所有人都会尝试使用URI来获取一些可能通过EXTRAS的数据。
有人请帮助我澄清Android的意图机制的这个设计方面。
答案 0 :(得分:0)
为什么我们通常使用mime类型?要了解它背后是什么类型的数据,不是吗? Android使用mimetype
来了解哪个应用程序可以成为处理特定文件的候选者。
假设您在应用程序中创建了一个PDF文件,并且希望让用户手机中安装的其他应用程序打开它,如果您没有设置mime类型,则Android无法理解哪个应用程序(嗯,它有时可以理解mimetype)可以完美地打开文件,什么应用程序可以毫无问题地处理它...例如,SMS应用程序如何能够处理这个文件?它可能会崩溃!
为什么我们需要数据?好吧,你应该说你想做什么不?如果您想让应用程序编辑您的pdf文件,您可以发送ACTION_EDIT,以便用户打开的应用程序知道“嘿,我可以编辑它!”。但为什么setData()
?正如您所说,我们可以使用putExtra
,但使用putExtra
,您需要知道数据所在的关键字和blabla。对您的应用程序一无所知的应用程序如何正确处理它? setData
是一个独特的地方,您可以在其中找到应用程序正确处理操作所需的内容。
URI(一个Uri对象),它引用要作用的数据和/或 该数据的MIME类型。通常提供的数据类型 由意图的行动决定。例如,如果操作是 ACTION_EDIT,数据应包含要编辑的文档的URI。 创建意图时,指定类型通常很重要 数据(其MIME类型)以及URI。例如,一项活动 能够显示图像可能无法播放音频 文件,即使URI格式可能类似。所以指定 您的数据的MIME类型有助于Android系统找到最佳状态 组件来接收你的意图。但是,有时可以使用MIME类型 从URI推断 - 特别是当数据是内容时:URI, 表示数据位于设备上并由a控制 ContentProvider,它使数据MIME类型对系统可见。
要仅设置数据URI,请调用setData()。要仅设置MIME类型, 调用setType()。如有必要,您可以使用显式设置 setDataAndType()。
警告:如果要同时设置URI和MIME类型,请不要调用 setData()和setType()因为它们都使null的值无效 其他。始终使用setDataAndType()来设置URI和MIME类型。