意图介绍
一个意图(Intent)对象包含了目标组件、动作、数据、类别、附加数据、标志六个部分。
目标组件
目标组件可以帮助应用发送显式意图调用请求。在创建Intent时,可以通过setComponent方法来设置一个组件,如:
//设置组件
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)。
// 创建一个Intent对象,指定要启动的Activity
Intent intent = new Intent(this, SecondActivity.class);
2.向Intent中添加数据:使用putExtra()方法将数据添加到Intent对象中。这些数据将以键值对的形式存储,通常将字符串作为键,以便于接收方检索。
// 向Intent中添加数据
intent.putExtra("KEY_STRING", "Hello, World!");
intent.putExtra("KEY_INT", 42);
3.发送Intent:使用startActivity()或者startService()方法将Intent发送到指定的组件中。系统会将Intent传递给目标组件,该组件可以从中提取出所需的数据。
// 使用startActivity()方法启动新的Activity
startActivity(intent);
4.在目标组件中接收并处理Intent:目标组件可以通过调用特定的方法获取传递过来的Intent对象,然后通过getStringExtra()或getIntExtra()等方法从Intent中提取数据。
// 在SecondActivity中获取传递过来的Intent对象
Intent receivedIntent = getIntent();
// 从Intent中提取数据
String stringValue = receivedIntent.getStringExtra("KEY_STRING");
int intValue = receivedIntent.getIntExtra("KEY_INT", 0); // 第二个参数为默认值
标志
标志(Flags)是用于修改Intent行为的标记。通过设置不同的标志,可以改变Intent的启动方式、任务栈行为、数据传递方式等。
显式意图与隐式意图
所谓的显式意图是指明确指定了目标组件的Intent。也就是说,你知道要启动的组件的名称或类的完整路径。通过显式意图,你可以直接启动目标组件。
Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
startActivity(intent);
隐式意图是指没有明确指定目标组件的意图。相反,你可以指定一些操作、数据类型或其他条件,然后系统会根据这些条件来查找合适的组件来处理该意图。例如,你可以创建一个隐式意图来打开网页:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
startActivity(intent);
在这个例子中,你没有指定具体的目标组件,而是指定了一个动作(ACTION_VIEW)和一个数据(网页的URL),系统会查找合适的组件来处理这个意图,可能是浏览器应用。
显式意图和隐式意图在Android开发中都非常常见,具体使用哪种意图取决于你的需求和场景。显式意图适用于明确知道目标组件的情况,而隐式意图适用于希望系统根据条件选择合适的组件的情况。