Activity(活动)之Intent(意图)(显式与隐式)的使用

本文深入解析Android中的Intent机制,包括显式Intent与隐式Intent的使用方法。通过实例演示如何在不同Activity间进行跳转,以及如何通过配置<intent-filter>实现组件间的灵活通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Intent(意图)是Android中各个组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可以用于启动活动、启动服务以及发送广播,发送通知等场景,Intent大致可以分为两种:显式Intent和隐式Intent,下面我们先看一下显式Intent如何使用。

Intent有多个构造函数的重载,其中一个是Intent(Context packageContext,Class<?> cls)。这个构造函数接受两个参数,第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent的“意图”。然后我们应该怎么使用这个Intent呢?Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,他接受一个Intent参数,这里我们将构建好的Intent传入startActivity()方法中就可以启动目标活动了。

具体实现:

首先在res/layout/ activity_main.xml文件中添加两个Button控件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="显示Intent"
        android:textAllCaps="false" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="隐式Intent"
        android:textAllCaps="false" />
</LinearLayout>

其次再MainActivity.java中声名控件,初始化控件,为控件设置点击监听事件,通过switch  case语句来判断点击的是哪个button按钮,具体是通过判断布局文件中设置好的Button id来监听的。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn1, btn2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        btn1 = (Button) findViewById(R.id.btn1);
        btn2 = (Button) findViewById(R.id.btn2);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
    }

 @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn1:
                //这里用来写点击btn1按钮之后需要进行的具体操作
                break;
            case R.id.btn2:
                //这里用来写点击btn2按钮之后需要进行的具体操作
                break;
            default:
                break;
        }


    }
}

这里为了实现Activity之间的切换,我们需要再创建一个SecondActivity.java,并为其绑定一个activity_second.xml文件,这里我们就使用AS自动一键创建Activity的功能。具体步骤请看下图

Finish.之后等待一会,你的第二个Activity就创建好了。

接下来打开activity_second.xml文件,修改一下代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="This is the SecondActivity."
        android:textSize="20sp" />
</LinearLayout>

 

显式Intent:

这个时候我们只需要在MainActivity.java中,btn1的点击监听事件中加2行代码就可以实现Activity之间的跳转了,代码如下。

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn1:
                //这里用来写点击btn1按钮之后需要进行的具体操作
                Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
                break;
            case R.id.btn2:
                //这里用来写点击btn2按钮之后需要进行的具体操作
                break;
            default:
                break;
        }
    }

这个时候我们就可以运行一个我们的程序了,看一看是什么效果,点击显示Intent按钮,会跳转到SecondActivity,注意此时点击隐式Intent是没反应的,因为我们并没有写,隐式Intent点击监听后的处理。

以上就是显式Intent的具体用法,代码其实就1行。

调用startActivity()方法,参数传入Intent实例就行了。

startActivity(new Intent(MainActivity.this,SecondActivity.class));

 

 

隐式Intent:

相比于显示Intent,隐式Intent则含蓄了许多,他并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。那么什么叫做合适的活动去启动呢?简单来说就是可以响应我们这个隐式Intent的活动,那么目前SecondActivity可以响应什么样的隐式Intent呢?额,现在好像还什么都响应不了,不过很快就会有了。通过在<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category,打开AndroidManifest.xml,添加如下代码:

<activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="com.example.activitytest.ACTION_START"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
</activity>

在<action>标签中我们指明了当前活动可以响应com.example.activitytest.ACTION_START这个action,而<category>标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的Intent中还可能带有的category。只有<action>和<category>中的内容能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent。

在MainActivity.java中,btn2的点击监听事件中加2行代码就可以实现Activity之间的隐式Intent跳转了,代码如下。

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn1:
                //这里用来写点击btn1按钮之后需要进行的具体操作
                Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
                break;
            case R.id.btn2:
                //这里用来写点击btn2按钮之后需要进行的具体操作
                Intent intent1=new Intent("com.example.activitytest.ACTION_START");
                startActivity(intent1);
                break;
            default:
                break;
        }
    }
 Intent intent1=new Intent("com.example.activitytest.ACTION_START");
 startActivity(intent1);

可以看到我们使用了Intent的另一个构造函数,直接将action的字符串传了进去,表明我们想要启动能够响应com.example.activitytest.ACTION_START这个action的活动。那前面不是说要<action>和<category>同时匹配上才能响应的吗?怎么没看到哪里有指定category呢?因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中。

重新运行一下程序,点击隐式Intent的按钮,我们发现界面跳转到了SecondActivity界面,效果如下:

不过此次我们使用的是默认的category,如果我们希望使用自定义的category,可以使用Intent类中的addCategory方法

来主动添加category,与此同时Manifest中也要添加一行<category>标签,

代码如下

Intent intent1=new Intent("com.example.activitytest.ACTION_START");
intent1.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent1);
 <intent-filter>
         <action android:name="com.example.activitytest.ACTION_START"/>
         <category android:name="android.intent.category.DEFAULT"/>
         <category android:name="com.example.activitytest.MY_CATEGORY"/>
 </intent-filter>

再运行一次程序,同样点击隐式Intent,效果一样。

显式Intent与隐式Intent的基本使用方法就是这么的简单,是不是很easy呢,后面我还会总结一下Intent的其它使用方式。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值