在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类可以通过以下方式创建:
- ComponentName(String pkg, String cls):通过包名和类名创建一个ComponentName对象。
ComponentName componentName = new ComponentName("com.reathin.sample", "com.reathin.sample.MainActivity");
Intent intent = new Intent();
intent.setComponent(componentName);
- ComponentName(Context pkg, String cls):通过Context对象和类名创建一个ComponentName对象。
Context context = getApplicationContext();
ComponentName componentName = new ComponentName(context, MainActivity.class);
Intent intent = new Intent();
intent.setComponent(componentName);
- ComponentName(Context pkg, Class<?> cls):通过Context对象和类对象创建一个ComponentName对象。
设置了Component属性的Intent被称为显式Intent,没有设置Component属性的Intent被称为隐式Intent,系统需要根据Intent的其他属性来查找匹配的组件。
Flags属性
Intent的Flags属性在Android中用于设置启动Activity或其他组件时的一些行为特性。Flags可以影响Intent如何被解析、组件如何被启动以及组件之间的交互方式。
图片
- 「FLAG_ACTIVITY_NEW_TASK」:通常用于从非Activity的上下文(如广播接收器、服务或应用外部)启动Activity。当设置了这个标志时,系统会在一个新的任务(Task)中启动Activity,即使这个Activity已经在另一个任务中存在。如果找到一个与Activity具有相同affinity的任务,则将其整体移动到前台,并保持栈中的状态不变,然后将Activity压入栈中。
- 「FLAG_ACTIVITY_CLEAR_TOP」:当Intent对象包含这个标志时,如果在栈中发现存在与要启动的Activity相同实例的Activity,则系统会清除这个实例之上的所有Activity,使该实例处于栈顶。这通常用于确保用户返回到应用的特定Activity时,应用的状态是清晰的。
- 「FLAG_ACTIVITY_SINGLE_TOP」:如果这个标志被设置,当新的Activity被启动时,如果它已经在任务栈的栈顶,系统不会创建一个新的Activity实例,而是会复用已存在的实例,并通过调用它的onNewIntent()方法来传递新的Intent。
- 「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);