自学内容网 自学内容网

【Android】Intent类详解

目录

引言 

一、Intent的定义

二、Intent的用途

三、Intent的七大属性

四、Intent的种类

4.1 显式Intent

4.2 隐式Intent

五、代码示例

5.1 activity_intent.xml

5.2 IntentActivity.java

5.3 AndroidManifest.xml

5.4 实现效果

结语 


引言 

Intent在Android开发中扮演着至关重要的角色,它是用于在不同组件(如Activity、Service、BroadcastReceiver等)之间进行通信和交互的核心对象。通过Intent,可以启动组件、传递数据、执行系统级操作(如拨打电话、发送短信、打开网页等)。


一、Intent的定义

Intent字面意思为“意图”,在Android中它代表了一种操作或动作的请求。这种请求可以是启动一个Activity、启动一个Service、发送一个广播等。Intent不是具体的实现,而是告诉系统“我想要做什么”,然后系统会根据这个Intent的描述来找到对应的实现并执行。


二、Intent的用途

  1. 启动Activity:Intent最常见的用途就是启动新的Activity。通过创建一个Intent对象,并设置目标Activity的类名,就可以启动该Activity。此外,Intent还可以携带数据给目标Activity,这些数据可以是基本数据类型、序列化对象或URI等。

  2. 启动Service:Service是Android中用于在后台执行长时间运行操作的组件。Intent也可以用来启动Service。与启动Activity类似,启动Service也需要创建一个Intent对象,并设置目标Service的类名。但与Activity不同的是,Service启动后不会立即显示界面给用户看,而是在后台默默执行。

  3. 发送广播:Intent还可以用来发送广播。广播是一种在应用程序间传递消息的机制。发送广播时,需要创建一个Intent对象,并设置广播的动作和数据。然后调用Context的sendBroadcast()方法或sendOrderedBroadcast()方法将广播发送出去。接收广播的组件需要注册一个BroadcastReceiver来监听特定动作的广播。

  4. 跨应用程序通信:除了在同一应用程序内部进行通信外,Intent还可以实现跨应用程序通信。通过隐式Intent定义动作和数据等属性来描述一个意图后,其他应用程序的组件也可以接收到这个意图并执行相应的操作。这使得Android系统成为一个开放的平台,不同应用程序之间可以相互协作完成任务。


三、Intent的七大属性

Intent的七大属性构建了高效应用间通信的关键,它们分别是:Action、Data、Category、Extras、Type、Component和Flags。

元素名称设置方法说明与用途
ActionsetAction动作,它指定意图的动作行为
DatasetData即Uri,它指定动作要操纵的数据路径
CategoryaddCategory类别,它指定意图的操作类别
ExtrasputExtras拓展信息,它指定装载的包裹信息
TypesetType数据类型,它指定消息的数据类型
ComponentsetComponent组件,它指定意图的来源与目标
FlagssetFlags标志位,它指定活动的启动标志
  1. Action:描述了要执行的操作。在隐式Intent中特别重要,可以帮助Android系统确定哪个组件(如Activity、Service或BroadcastReceiver)能够处理这个Intent。Android SDK定义了一系列标准的Action字符串,例如Intent.ACTION_VIEW、Intent.ACTION_EDIT、Intent.ACTION_DIAL、Intent.ACTION_CALL、Intent.ACTION_SEND等。

  2. Data:是一个Uri对象,指定了与Intent相关联的数据的位置或类型。Uri可以是一个指向文件、网页、电子邮件地址等的引用。Data属性在隐式Intent中特别重要,与Action属性一起帮助Android系统确定哪个组件能够处理这个Intent。

  3. Category:为Intent提供额外的信息,帮助系统更准确地确定如何处理Intent。Android SDK定义了一些标准的Category常量,例如Intent.CATEGORY_DEFAULT、Intent.CATEGORY_BROWSABLE、Intent.CATEGORY_LAUNCHER等。

  4. Extras:一个键值对的集合,用于传递额外的数据。数据通常是以键值对(key-value pair)的形式存储的,可以通过putExtra()方法添加到Intent中,并在目标组件中使用getXXX()系列方法(如getStringExtra(), getIntExtra(), getParcelableExtra()等)来检索。

  5. Type:指定数据的MIME类型。在大多数情况下,当设置了Data属性后,Android系统会自动推断出Type属性的值。如果需要明确指定MIME类型,可以使用setType()方法或setDataAndType()方法来设置Type属性。

  6. Component:对于显式Intent,指定了要启动的组件的类名。

  7. Flags:用于指定Intent的附加选项,如是否需要清除任务栈中的Activity等。


四、Intent的种类

Intent有两种主要类型:显式Intent和隐式Intent。


4.1 显式Intent

显式Intent:显式Intent通过指定具体类名启动一个组件。显式Intent一般用于同一应用程序内,因为可以确定地知道要启动的组件名。另外,Android 5.0以后规定必须显式启动Service。

在构建一个意图对象时,需要指定两个参数,第一个参数表示跳转的来源页面,即“来源Activity.this”;第二个参数表示待跳转的页面,即“目标Activity.class”。具体的意图构建方式有如下三种:

  • 在Intent的构造函数中指定,示例代码如下:
// 创建一个目标确定的意图
Intent intent = new Intent(this, ActSecondActivity.class);
  • 调用意图对象的setClass方法指定,示例代码如下:  
Intent intent = new Intent();    // 创建一个新意图
intent.setClass(this, ActSecondActivity.class); // 设置意图要跳转的目标活动
  • 调用意图对象的setComponent方法指定,示例代码如下: 
Intent intent = new Intent();    // 创建一个新意图
// 创建包含目标活动在内的组件名称对象
ComponentName component = new ComponentName(this, ActSecondActivity.class);
intent.setComponent(component); // 设置意图要跳转的目标活动
  • 此外,ComponentName还有一个重载的构造方法,不需要知道class,只需要知道包名pkg与类名cls即可跳转,将上述代码中创建组件名称对象改成下面这样即可:
ComponentName component = new ComponentName("包名", "类名");

4.2 隐式Intent

隐式Intent:隐式Intent无需指定类名,通常用于启动其他应用程序的组件,比如打算启动一个地图定位的Activity。当隐式地启动一个Service或Activity时,Intent会根据其中的内容,匹配其他组件中manifest文件的Intent-filter,启动符合条件的组件,并把Intent中的参数传过去。如果有多个intent-filter满足条件,那么系统会弹出一个对话框,由用户决定启动哪个组件。

常见系统动作的取值说明: 

Intent 类的系统动作常量名系统动作的常量值说明
ACTION_MAINandroid.intent.action.MAINApp 启动时的入口
ACTION_VIEWandroid.intent.action.VIEW向用户显示数据
ACTION_SENDandroid.intent.action.SEND分享内容
ACTION_CALLandroid.intent.action.CALL直接拨号
ACITON_DIALandroid.intent.action.DIAL准备拨号
ACTION_SENDTOandroid.intent.action.SENDTO发送短信
ACTION_ANSWERandroid.intent.action.ANSWER接听电话

五、代码示例


5.1 activity_intent.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".IntentActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="点击以下按钮跳转到指定页面"
        android:textColor="@color/black"
        android:textSize="17sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_dial"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="跳转到拨号页面"
        app:layout_constraintEnd_toEndOf="@+id/textView"
        app:layout_constraintStart_toStartOf="@+id/textView"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <Button
        android:id="@+id/btn_mine"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="跳转到本模块中的应用"
        app:layout_constraintEnd_toEndOf="@+id/btn_dial"
        app:layout_constraintStart_toStartOf="@+id/btn_dial"
        app:layout_constraintTop_toBottomOf="@+id/btn_dial" />

    <Button
        android:id="@+id/btn_other"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="跳转到其他模块中的应用"
        app:layout_constraintEnd_toEndOf="@+id/btn_mine"
        app:layout_constraintStart_toStartOf="@+id/btn_mine"
        app:layout_constraintTop_toBottomOf="@+id/btn_mine" />
</androidx.constraintlayout.widget.ConstraintLayout>

5.2 IntentActivity.java

package com.your.package.name;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class IntentActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_intent);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        findViewById(R.id.btn_dial).setOnClickListener(this);
        findViewById(R.id.btn_mine).setOnClickListener(this);
        findViewById(R.id.btn_other).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if(view.getId() == R.id.btn_dial){
            // 跳转到拨号页面
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_DIAL);
            // 声明一个拨号的Uri
            Uri uri = Uri.parse("tel:" + "10086");
            intent.setData(uri);
            startActivity(intent);
        } else if (view.getId() == R.id.btn_mine) {
            // 跳转到本模块中的应用页面
            Intent intent = new Intent(this, PermissionLazyActivity.class); // 更换成自己的Activity
            startActivity(intent);
        } else if (view.getId() == R.id.btn_other) {
            // 跳转到其他模块中的应用页面
            Intent intent = new Intent();
            intent.setAction("android.intent.action.KUN"); // 更换成自己的其他模块
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            startActivity(intent);
        }
    }
}

5.3 AndroidManifest.xml

本模块的 AndroidManifest.xml:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.MyApplication">
    <activity
        android:name=".PermissionLazyActivity"
        android:exported="false" />
    <activity
        android:name=".IntentActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

需要跳转的模块的AndroidManifest.xml: 

<activity
    android:name=".PullRefreshActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    // 需要增加的代码:action中的name可自定义
    <intent-filter>
        <action android:name="android.intent.action.KUN" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

其中<intent-filter>中的<category>标签的android:name,有几个预定义的Intent类别(category),它们通常以 android.intent.category. 为前缀。以下是一些常见的Intent类别及其含义:

android.intent.category.DEFAULT:

  • 这是最常用的类别。如果一个Intent没有明确指定类别,它隐式地属于这个类别。
  • 当你为组件(如Activity)声明<intent-filter>时,通常至少会包含这个类别,除非有特别的理由不包括它。

android.intent.category.BROWSABLE:

  • 表明目标Activity可以通过浏览器启动,通常用于处理Web页面中的链接(例如,使用<a href="intent:...">)。
  • 通常与android.intent.action.VIEW动作一起使用,以表示Activity可以显示数据(如网页或文档)。

android.intent.category.LAUNCHER:

  • 这是一个特殊的类别,用于标识应用的主Activity(即启动器图标指向的Activity)。
  • 只有主Activity应该在其<intent-filter>中包含这个类别。
  • 当用户从设备的主屏幕启动应用时,系统会查找具有这个类别的Activity。

android.intent.category.ALTERNATIVE:

  • 表示Activity是用户请求的一个替代选择。
  • 这通常用于当用户请求一个操作时,系统提供多个可能的Activity来满足这个请求。

android.intent.category.SELECTED_ALTERNATIVE:

  • 当用户从一组替代选项中选择了一个Activity时,这个Activity的Intent会被标记为这个类别。
  • 这通常用于处理用户从选择器UI中选择的结果。

android.intent.category.TAB:

  • 表明Activity应该作为另一个Activity中的标签页启动。
  • 这通常与android.intent.action.MAIN动作一起使用,在具有标签页界面的Activity中。

android.intent.category.EMBED:

  • 表明Activity应该被嵌入到另一个Activity中作为其内容。
  • 这与TAB类别类似,但提供了更一般的嵌入机制。

android.intent.category.HOME:

  • 这是一个特殊的类别,用于标识设备的主屏幕Activity。
  • 只有主屏幕Activity应该在其<intent-filter>中包含这个类别。

android.intent.category.INFO:

  • 表示Activity提供了一些关于另一个组件(如另一个应用)的信息。
  • 这通常用于显示关于其他应用的详细信息或设置。

android.intent.category.PREFERENCE:

  • 表示Activity是一个偏好设置屏幕。
  • 这通常用于提供应用的设置选项。 

5.4 实现效果


结语 

Intent是Android开发中不可或缺的一部分,它使得应用程序的各个组件之间能够进行高效、灵活的通信和交互。通过理解Intent的定义、用途、种类及其七大属性,开发者可以更好地掌握Intent的使用技巧,从而开发出更加功能丰富、交互流畅的应用程序。在实际开发中,灵活运用Intent可以显著提升开发效率和用户体验。 


原文地址:https://blog.csdn.net/qq_52924376/article/details/144239454

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!