Android Intent七大属性,构建高效应用间通信的关键

移动开发 Android
Intent 的 Action 属性是一个字符串,描述了Intent想要执行的操作或动作。在隐式Intent中特别重要,可以帮助Android系统确定哪个组件(如Activity、Service或BroadcastReceiver)能够处理这个Intent。

在Android开发中,Intent 是一个核心组件,用于在应用程序内部或不同应用程序之间传递消息和数据。Intent的七大属性:

  • 「Action」:描述了要执行的操作。
  • 「Data」:Uri对象,指定了操作的数据位置。
  • 「Category」:为Intent提供额外的信息,帮助系统更准确地确定如何处理Intent。
  • 「Extras」:一个键值对的集合,用于传递额外的数据。
  • 「Type」:指定数据的MIME类型。
  • 「Component」:对于显式Intent,指定了要启动的组件的类名。
  • 「Flags」:指定如何处理Intent的标志。

Action属性

Intent 的 Action 属性是一个字符串,描述了Intent想要执行的操作或动作。在隐式Intent中特别重要,可以帮助Android系统确定哪个组件(如Activity、Service或BroadcastReceiver)能够处理这个Intent。

图片图片

Android SDK定义了一系列标准的Action字符串,例如:

  • Intent.ACTION_VIEW: 用于显示由数据URI指定的数据(如网页、图片等)。
  • Intent.ACTION_EDIT: 用于编辑由数据URI指定的数据。
  • Intent.ACTION_DIAL: 拨打一个电话号码,但不实际建立连接。
  • Intent.ACTION_CALL: 拨打一个电话号码,并尝试建立连接。注意:此操作需要用户确认,并且可能需要特殊的权限。
  • Intent.ACTION_SEND: 发送某种数据。这通常用于分享文本、图片等。
  • Intent.ACTION_SENDTO: 发送消息到特定的收件人(如电子邮件地址)。
  • Intent.ACTION_GET_CONTENT: 允许用户选择一个数据项返回给调用者。
  • Intent.ACTION_SYNC: 触发一个同步操作。
  • Intent.ACTION_SEARCH: 执行一个搜索。
  • Intent.ACTION_MAIN: 这是一个特殊的类别,通常与CATEGORY_LAUNCHER结合使用,表示应用的入口点。

除了这些标准动作外,也可以定义自己的自定义动作字符串。可以使用Intent的构造函数或setAction()方法:

// 使用构造函数设置Action
Intent intent = new Intent(Intent.ACTION_VIEW);

// 自定义Action
Intent intent = new Intent("自定义Action");

// 或使用setAction()方法设置Action
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);

当使用隐式Intent时,除了设置Action外,还可能需要设置其他属性(如Category、Type、Data等)来确保Intent被正确地处理。

Data属性

Intent的Data属性是一个Uri对象,指定了与Intent相关联的数据的位置或类型。Uri可以是一个指向文件、网页、电子邮件地址等的引用。

图片图片

Data属性在隐式Intent中特别重要,与Action属性一起帮助Android系统确定哪个组件(如Activity、Service或BroadcastReceiver)能够处理这个Intent。

使用setData()方法来设置Intent的Data属性:

Uri data = Uri.parse("https://www.baidu.com");
Intent intent = new Intent();
intent.setData(data);

在创建Intent对象时直接设置Data属性:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com"));

Intent的Action属性被设置为Intent.ACTION_VIEW,表示想要查看某个数据。Data属性被设置为一个指向网页的Uri,表示要查看的数据是网页。

除了Data属性外,Intent还有一个Type属性,指定了Data属性中URI所指向的数据的MIME类型。在大多数情况下,当设置了Data属性后,Android系统会自动推断出Type属性的值。如果需要明确指定MIME类型,可以使用setType()方法或setDataAndType()方法来设置Type属性。

Category属性

Intent的Category属性是一个字符串,用于为Intent增加额外的附加信息或指定当前动作(Action)被执行的环境。Category属性用于进一步描述Intent的性质或用途,帮助系统更准确地确定哪个组件能够处理这个Intent。

图片图片

Android SDK定义了一些标准的Category常量:

  • Intent.CATEGORY_DEFAULT:默认的类别,通常与Action一起使用,表示没有特定的类别信息。
  • Intent.CATEGORY_BROWSABLE:表示这个Intent可以用来浏览数据,例如启动一个网页浏览器来查看一个网页。
  • Intent.CATEGORY_LAUNCHER:这是一个特殊的类别,通常与Action.MAIN一起使用,表示应用的入口点。

除了这些标准类别外,也可以定义自己的自定义类别字符串。使用addCategory()方法来为Intent添加Category属性:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.baidu.com"));
intent.addCategory(Intent.CATEGORY_BROWSABLE);

Intent的Action属性被设置为Intent.ACTION_VIEW,表示想要查看某个数据。Data属性被设置为一个指向网页的Uri,表示要查看的数据是网页。Category属性被设置为Intent.CATEGORY_BROWSABLE,表示这个Intent可以用来浏览数据,因此系统可能会选择一个网页浏览器来处理这个Intent。

Category属性通常与Action属性结合使用。在某些情况下,如果Intent没有指定正确的Category,那么即使Action匹配,系统也可能无法找到合适的组件来处理这个Intent。在创建隐式Intent时,确保设置了正确的Action和Category属性非常重要。

Extras属性

Intent的Extras属性是一个用于传递目标组件所需要的额外数据的集合。数据通常是以键值对(key-value pair)的形式存储的,可以通过putExtra()方法添加到Intent中,并在目标组件中使用getXXX()系列方法(如getStringExtra(), getIntExtra(), getParcelableExtra()等)来检索。可以使用Extras来传递字符串、整数、布尔值、序列化对象等几乎任何类型的数据。

图片

Intent intent = new Intent(MainActivity.this, UserActivity.class);
intent.putExtra("name", "Reathin");
intent.putExtra("age", 29);
startActivity(intent);

在UserActivity中获取数据:

String name = getIntent().getStringExtra("name");
int age = getIntent().getIntExtra("age", 0);

Type属性

Intent的Type属性(也称为Data Type或MIME类型)用于指定与Intent相关联的数据的MIME类型。Type属性通常与Data属性一起使用,Data属性指定了数据的URI,Type属性指定了数据的MIME类型。通过设置这两个属性,可以更精确地控制哪个组件应该接收并处理这个Intent。

使用setType()方法来设置Intent的Type属性:

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri imageUri = Uri.parse("content://media/external/images/media/4");
intent.setData(imageUri);
intent.setType("image/jpeg");
startActivity(intent);

启动这个Intent,系统将会找到一个能够处理JPEG图片的活动来显示这个图片。

虽然Type属性在某些情况下是可选的,但在某些情况下却是必需的。例如,如果想要启动一个能够处理特定类型数据的Service或BroadcastReceiver,就需要设置正确的Type属性来确保系统能够找到正确的目标组件。

Component属性

Intent的Component属性用于明确指定需要启动的目标组件。通常是一个包含了目标组件包名和类名的ComponentName对象。

图片图片

设置Component属性后,Android系统将会直接启动指定的组件,不再根据Intent的其他属性(如Action、Data、Category等)来查找匹配的组件。Intent的解析过程更加明确和直接。

ComponentName类可以通过以下方式创建:

  1. ComponentName(String pkg, String cls):通过包名和类名创建一个ComponentName对象。
ComponentName componentName = new ComponentName("com.reathin.sample", "com.reathin.sample.MainActivity");
Intent intent = new Intent();
intent.setComponent(componentName);
  1. ComponentName(Context pkg, String cls):通过Context对象和类名创建一个ComponentName对象。
Context context = getApplicationContext();
ComponentName componentName = new ComponentName(context, MainActivity.class);
Intent intent = new Intent();
intent.setComponent(componentName);
  1. ComponentName(Context pkg, Class<?> cls):通过Context对象和类对象创建一个ComponentName对象。

设置了Component属性的Intent被称为显式Intent,没有设置Component属性的Intent被称为隐式Intent,系统需要根据Intent的其他属性来查找匹配的组件。

Flags属性

Intent的Flags属性在Android中用于设置启动Activity或其他组件时的一些行为特性。Flags可以影响Intent如何被解析、组件如何被启动以及组件之间的交互方式。

图片图片

  1. 「FLAG_ACTIVITY_NEW_TASK」:通常用于从非Activity的上下文(如广播接收器、服务或应用外部)启动Activity。当设置了这个标志时,系统会在一个新的任务(Task)中启动Activity,即使这个Activity已经在另一个任务中存在。如果找到一个与Activity具有相同affinity的任务,则将其整体移动到前台,并保持栈中的状态不变,然后将Activity压入栈中。
  2. 「FLAG_ACTIVITY_CLEAR_TOP」:当Intent对象包含这个标志时,如果在栈中发现存在与要启动的Activity相同实例的Activity,则系统会清除这个实例之上的所有Activity,使该实例处于栈顶。这通常用于确保用户返回到应用的特定Activity时,应用的状态是清晰的。
  3. 「FLAG_ACTIVITY_SINGLE_TOP」:如果这个标志被设置,当新的Activity被启动时,如果它已经在任务栈的栈顶,系统不会创建一个新的Activity实例,而是会复用已存在的实例,并通过调用它的onNewIntent()方法来传递新的Intent。
  4. 「FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS」:表示不希望启动的Activity出现在最近使用的应用列表中。这对于一次性或隐私敏感的活动可能很有用。

这些标志可以单独使用,也可以组合使用,以定义特定的行为。使用Intent类的addFlags()或setFlags()方法设置Flags属性。

Intent intent = new Intent(MainActivity.this, UserActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

或者:

Intent intent = new Intent(MainActivity.this, UserActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

责任编辑:武晓燕 来源: 沐雨花飞蝶
相关推荐

2020-11-23 18:39:54

容器Kubernetes架构

2018-04-11 14:13:29

物联网信息技术互联网

2021-07-17 15:48:13

Rust编程语言关键字

2016-10-27 14:02:56

大数据数据库

2016-10-26 14:40:28

大数据基础设施架构

2019-09-26 05:30:03

物联网通信协议IOT

2010-03-29 17:08:04

Nginx squid

2018-09-27 11:48:51

2021-09-30 14:06:08

安全团队网络攻击首席信息安全官

2010-12-30 14:52:33

云基础设施

2016-10-12 19:14:31

2022-06-17 09:58:23

JVM应用程序

2011-01-13 13:48:52

Android 3.0

2022-11-07 14:31:26

物联网IoT

2011-08-01 09:51:20

云计算

2012-12-04 18:11:46

LanSecS堡垒主机堡垒机

2017-09-04 18:02:58

应用程序APP移动设备

2016-11-08 22:47:09

大数据英国政府大数据应用

2019-07-04 14:25:53

机器学习金融大数据

2009-06-23 14:12:00

javaJSP绝招
点赞
收藏

51CTO技术栈公众号