Android之Intent

意图介绍

一个意图(Intent)对象包含了目标组件、动作、数据、类别、附加数据、标志六个部分。

目标组件

目标组件可以帮助应用发送显式意图调用请求。在创建Intent时,可以通过setComponent方法来设置一个组件,如:

java 复制代码
//设置组件
intent.setComponent(new ComponentName("com.example.app", 
                                        "com.example.app.MainActivity"));

//ComponentName是一个类,用于表示组件的名称。它包含两个字符串参数:
//第一个参数是应用程序的包名(如 "com.example.app"),
//第二个参数是组件的完整类名(如"com.example.app.MainActivity")。

//setComponent()方法用于将ComponentName对象设置为Intent的组件信息。
//当使用这种方式创建 Intent 时,系统会根据指定的组件名称来启动对应的组件(如Activity、Service或BroadcastReceiver)。

//这里的代码意味着我们要启动一个名为"com.example.app.MainActivity"的Activity,
//该Activity属于"com.example.app"这个应用程序。

如果已知要启动的组件的确切名称,可以使用显式Intent通过设置component来启动该组件。否则,可以使用隐式Intent(通过设置 action、data 和 category),让系统根据 Intent 过滤器来选择合适的组件。

意图过滤器

动作

动作(Action)是一个字符串,它通常用于表示组件要执行的操作。例如,启动一个Activity、拨打电话、发送短信等等。在创建Intent的时候,可以通过setAction()方法来设置动作

Action是Intent的核心组成部分,它告诉Android系统应该执行什么操作。Android系统预定义了许多标准的Action。但是每个应用都是不同的,Android系统预定义的Action不可能覆盖到所有的需求,所以Android系统还提供了一些自定义的方法。(这里还不是很清楚,可能后续更新)

数据

数据(Data)是指明意图操作的数据,例如要发送的短信内容、要拨打的电话号码等。也就是说,数据通常表示要操作数据的URI,例如,一个网页的URL,一个联系人的URI等等。在创建意图的时候,可以通过setData()方法来设置数据。

类别

类别(Category)是指明意图的附加信息,用于进一步细分和分类意图。

意图过滤器

动作、数据与类别三者在一起可以构建一个意图过滤器。通过意图过滤器用户可以告知系统当前的组件具备哪些特点,可以处理哪些特定的Intent。

附加数据

Intent可以通过附加数据(Extradate)来传递一些额外的信息。附加数据是以键值对的方式存储在意图之中。当使用者想要将一个Activity中的一些信息传递给下一个Activity时,可以在发送Intent前向其中添加数据,而后在接收Intent的组件中提取并使用这些数据。

1.创建一个Intent对象:首先,创建一个Intent对象,指定目标组件(要启动的Activity或者要启动的Service)。

java 复制代码
// 创建一个Intent对象,指定要启动的Activity
Intent intent = new Intent(this, SecondActivity.class);

2.向Intent中添加数据:使用putExtra()方法将数据添加到Intent对象中。这些数据将以键值对的形式存储,通常将字符串作为键,以便于接收方检索。

java 复制代码
// 向Intent中添加数据
intent.putExtra("KEY_STRING", "Hello, World!");
intent.putExtra("KEY_INT", 42);

3.发送Intent:使用startActivity()或者startService()方法将Intent发送到指定的组件中。系统会将Intent传递给目标组件,该组件可以从中提取出所需的数据。

java 复制代码
// 使用startActivity()方法启动新的Activity
startActivity(intent);

4.在目标组件中接收并处理Intent:目标组件可以通过调用特定的方法获取传递过来的Intent对象,然后通过getStringExtra()或getIntExtra()等方法从Intent中提取数据。

java 复制代码
// 在SecondActivity中获取传递过来的Intent对象
Intent receivedIntent = getIntent();

// 从Intent中提取数据
String stringValue = receivedIntent.getStringExtra("KEY_STRING");
int intValue = receivedIntent.getIntExtra("KEY_INT", 0); // 第二个参数为默认值

标志

标志(Flags)是用于修改Intent行为的标记。通过设置不同的标志,可以改变Intent的启动方式、任务栈行为、数据传递方式等。

显式意图与隐式意图

所谓的显式意图是指明确指定了目标组件的Intent。也就是说,你知道要启动的组件的名称或类的完整路径。通过显式意图,你可以直接启动目标组件。

java 复制代码
Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
startActivity(intent);

隐式意图是指没有明确指定目标组件的意图。相反,你可以指定一些操作、数据类型或其他条件,然后系统会根据这些条件来查找合适的组件来处理该意图。例如,你可以创建一个隐式意图来打开网页:

java 复制代码
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
startActivity(intent);

在这个例子中,你没有指定具体的目标组件,而是指定了一个动作(ACTION_VIEW)和一个数据(网页的URL),系统会查找合适的组件来处理这个意图,可能是浏览器应用。

显式意图和隐式意图在Android开发中都非常常见,具体使用哪种意图取决于你的需求和场景。显式意图适用于明确知道目标组件的情况,而隐式意图适用于希望系统根据条件选择合适的组件的情况。

相关推荐
传奇开心果编程1 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程3 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程3 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程3 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓3 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程3 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer
supabc1234 小时前
Celium:连接 Windows、Mac、Linux 与 Android,让远程访问和设备管理更简单
android·linux·windows·macos·远程访问·网络管理·celium
Dovis(誓平步青云)4 小时前
导览音频切换太快,旧讲解不能覆盖新展品
android·前端·javascript·ecmascript·音视频·宠物
五彩小白21 小时前
自回归和上下文
android
事圆则缓1 天前
Android 多渠道打包实战:Product Flavors、签名、AAB 与发包校验
android