人生巅峰的梦想之初!—Intent全解析
- 2019 年 10 月 4 日
- 筆記
前言
Hi,新的征程开始啦,关于各种控件我们给大家介绍的已经差不多了,各位花粉已经陪伴着我们走过了一个阶段,本篇就是我们新征程的开始,当然,我们会在新征程之中偶尔穿插一些实战控件的使用,让大家学习的内容不再单一,还在等什么,紧跟我们的步伐,为了白富…理想而出发!!
简介
Intent作用
Intent 直译为 "意图",它用于在 Android
系统组件之间进行交互。它可被用来启动 Activity
、发生信息到 BroadCastReciver
,启动并与 service
进行交互。
Intent 分类
两种形式的Intent
- 显示
Intent
显示 Intent
通过它的 setCompoent()
或 setClass()
来明确的指明要进行交互的组件,一般情况下不再会包含其他信息。
代码示例:
Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivity(intent);

- 隐式
Intent
使用隐式 Intent
并没有明确的指定特定组件,而是指定足够的信息让 Android
系统去决定哪一个组件是最符合 Intent
信息,从而拣选出最合适的组件。
隐式 Intent
一般在 Manifestfest.xml
给声明组件通过设置 Action
、Data
、Category
给与组件足够的信息,让系统筛选出合适的组件。
下面是给要启动的 Activity
在AndroidManifest.xml
文件中设置:
<activity android:name=".SecondActivity"> <intent-filter> <action android:name="abcdefg" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
我们修改 SecondActivity
在AndroidManifest.xml
中声明,在<intent-filter>
标签中声明 Intent
要过滤的信息。action
的 name
是一个字符串,可以自定义。
现在修改刚才在的 Activity
跳转代码如下:
Intent intent = new Intent(); intent.setAction("abcdefg");//与 Manifest 中组件声明的 action name 必须相同。 startActivity(intent);
运行程序,点击跳转按钮仍然可以跳转到 SecondActivity
。
IntentStructure
事实上可以把 Intent
当做一个工具,用于绑定不同组件(甚至是不相同的应用程序之间)。程序在运行时通过 Intent
来延迟运行时绑定。最重要的用途就是启动 Activity
,它可以被认为是 Activity
之间的粘合剂,而它本身是就是一个包含要执行动作的数据结构。
- action :描述要被执行的动作。例如:
Intent.ACTION_VIEW
用于显示用户的数据。比较通用,会根据用户的数据类型打开相应的Activity。 Uri uri = Uri.parse("http://www.google.com"); Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); //打开浏览器 –> 浏览网页 Uri uri =Uri.parse("tel:1232333"); Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); //打开拨号界面 –> 输入1232333号码 …. - category :给予额外的信息对于要执行的 action 。例如:
- DEFAULT —— 默认动作
- HOME —— 设置为本地桌面应用
- LAUNCHER —— 应用的主
Activity
- data :通常用来向 action 属性提供操作数据。data 属性默认接受一个
Uri
对象。- mimeType —— 用来设置该Data所指定的Uri对应的MIME类型,可自定义,只要符合abc/def格式即可。声明该组件所能匹配的Intent的Type属性。
- scheme —— 用来声明该组件所能匹配的Intent的Data属性的scheme部分。
- host —— 用来声明该组件所能匹配的Intent的Data属性的host部分。
- port —— 用来声明该组件所能匹配的Intent的Data属性的port部分。
- path —— 用来声明该组件所能匹配的Intent的Data属性的path部分。
- pathPrefix —— 用来声明该组件所能匹配的Intent的Data属性的path前缀。
- pathPattern —— 用来声明该组件所能匹配的Intent的Data属性的path字符串模版。
data子元素在配置的时候是可选的,但又是相互依存的,比如,如果没有配置scheme,那么其他所有的Uri属性都被忽略;如果host没有配置,那么port以及path,pathPrefix,pathPattern都会被忽略(不起作用)。
Intent 传递数据
在使用 Intent
进行执行操作时,可以通过给 Intent
绑定数据到另一个组件中,从而实现数据的传递。在这个过程中存在数据从内存序列化或从文件序列化。
Intent intent = new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("Name","Android"); //Name --> key , Android --> value startActivity(intent);
数据的传递方式是以键值对的方式。
当跳转到SecondActivity
再从 Intent
中通过 key
(键)把携带的数据取出。
TextView textView = findViewById(R.id.tv_content); Intent intent = getIntent();//获取传递数据的 Intent String name = intent.getStringExtra("Name"); //通过 key 取出数据 if (!name.isEmpty()) { //把界面上原来的字符串SecondActivity进行替换 textView.setText(name); }

下面是通过源码查看的Intent
所支持的传递数据类型。

Intent 返回数据到上一个界面
当使用 Intent
从 MainActivity
跳转到 SecondActivity
,当在关闭或返回 MainActivity
时需要从 SecondActivity
携带数据到 MainActivity
。
这时,需要在启动 Activity
的时候使用 startActivityForResult(Intent intent, int requestCode)
方式启动。这个原理是当使用 startActivityForResult()
方式启动 Activity
时在返回时系统会回调 Activity
的 onActivityResult(int requestCode, int resultCode, Intent data)
方法。
注意这里有两个特殊的参数:
- requestCode —— 请求码。使用请求码可以判断当多个
Activity
启动同一个Activity
时,确定是哪一个Activity
启动的。 - resultCode —— 响应码。使用响应码可以从上一个
Activity
中返回的多类型数据中,确定需要哪一种数据。
很明显返回的数据是包含在 onActivityResult(int requestCode, int resultCode, Intent data)
回调方法的 Intent
当中。

在 MainActivity
中重写回调方法获取从SecondActivity
中设置的数据通过 key
。然后将原来界面上的文字 MainActivity
设置为从 SecondActivity
中取回的值。

在SecondActivity
中通过 setResult()
方法设置数据,通过 Intent
对象。运行程序如下:
