前言
近期想要好好地归纳与釐清一些基础观念,因此整理加分享的同步把东西整理放上来,有的部分可能比较基础请见谅
当我们有了多个 Activity 的时候我们一定会开始想到,我们该如何从一个 activity 去启动另外一个 activity,又或者我们要怎么进行两个 activity 间的资料通等等的问题,这时候最常见的方式就是使用我们今天的主角 Intent 。
种类
Intent 常见也常用,但是也常常忘记它其实有着两种模式(还是只有我一直忘记...= =),下方名称网路上对他们的名称有些需的差异,在这边以 android doc 上名称为主。
明确意图(Explicit intents):官方的说明有点冗长,讲白一点就是在指定启动元件的时候,我们直接使用名称(完整的类别名称)进行指定。例如:
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
隐含意图(Implicit intents):在宣告的时候不指定给特定的元件,而是针对功能、动作进行宣告,来让定一个应用程式的元件进行处理。例如:在APP中开启网页,系统发现手机上有chrome以及预设浏览器提供网页浏览的功能,这时候便会跳出选单让使用者选择。
建置
在建置 Intent 的时候有几个常见且主要可以包含的资讯有:
元件名称:此项为可选用,不过当我们没有填入元件名称时,这个 intent 便会成为一个「隐含」的意图,反之我们若是要建置一个「明确」的意图,则我们必须要为他指派元件名称。可以使用setComponent()
、setClass()
、setClassName()
做设定。动作:为 intent 指定要执行的动作,以已透过使用 setAction()
进行设定,而常见的动作有 ACTION_VIEW
、ACTION_SEND
等等。资料:通常这边提供的资料会是由 intent 来进行控制,例如要是在上一项动作设定为 ACTION_EDIT
则资料应该包含打算编辑的 URI。另外也可以根据目的进行设定,像是 setData()
、setType()
、甚至是 setDataAndType()
。类别:用来处理intent的其他相关资讯。通常不一定类别:用来处理intent的其他相关资讯。通常大部分的 intent 是不需要加上类别的。例子如下:CATEGORY_BROWSABLE
目标的 activity可以自己使用网页浏览器启动,已显示连结所参照的资料。额外资料:这个值主要传入为了完成目的所需的其他资讯。我们可以使用各类的 putExtra()
,例如放 int 的、放 string 的、放 byte 的,甚至还可以放 array 类型的额外资料,这些种类方法都续传入两个参数:索引键名称 (key name) 与值 (value)。像是当我们建立 intent 使用 ACTION_SEND
来传送电子邮件的时候,我们可以使用 EXTRA_EMAIL
来指定收件者,并使用 EXTRA_SUBJECT
来指定主旨範例
明确意图範例
Intent intent=newIntent(FirstActivity.this, SecondActivity.class);startActivity(intent);
这边我的例子是在两个 activity 间的互动,service相关使用可以参考 google doc 中的範例。
隐含意图範例
Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(Uri.parse("https://google.com"));startActivity(intent);
这边这个例子是开启网页的使用,另外在 google doc 中的例子是发送电子邮件,也可以进行参考。
补充
前面的例子有提到,可以去唤醒其他有支援我们请求的 activity 或是 app,那反之其实我们也可以在自己的 activity 中去加入相关的声明,加入之后我们便可以在其他 activity 中去对这个请求的 intent 进行回应。
这边附上如何加入相关声明的例子:(在 AndroidMainfest.xml 中对你想要赋予声明的 activity 加入相应的内容)
<activity android:name=".ThirdActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" /> </intent-filter></activity>