《Android 应用开发基础教程》——第四章:Intent 与 Activity 跳转、页面传值

目录

[第四章:Intent 与 Activity 跳转、页面传值(Java 版)](#第四章:Intent 与 Activity 跳转、页面传值(Java 版))

[4.1 什么是 Intent?](#4.1 什么是 Intent?)

[4.2 显式 Intent 与隐式 Intent](#4.2 显式 Intent 与隐式 Intent)

[4.3 两个页面之间跳转示例](#4.3 两个页面之间跳转示例)

[1️⃣ 主页面 MainActivity](#1️⃣ 主页面 MainActivity)

[2️⃣ 目标页面 SecondActivity](#2️⃣ 目标页面 SecondActivity)

[3️⃣ 注册 Activity(AndroidManifest.xml)](#3️⃣ 注册 Activity(AndroidManifest.xml))

[4.4 页面传值(传参)](#4.4 页面传值(传参))

[主页面传值给 SecondActivity](#主页面传值给 SecondActivity)

[SecondActivity 中接收参数](#SecondActivity 中接收参数)

[4.5 使用 Bundle 传递多个值](#4.5 使用 Bundle 传递多个值)

[SecondActivity 接收:](#SecondActivity 接收:)

[4.6 从 SecondActivity 返回结果](#4.6 从 SecondActivity 返回结果)

[1️⃣ MainActivity 启动方式:](#1️⃣ MainActivity 启动方式:)

[2️⃣ SecondActivity 设置返回数据:](#2️⃣ SecondActivity 设置返回数据:)

[3️⃣ MainActivity 中接收结果:](#3️⃣ MainActivity 中接收结果:)

[4.7 常见问题总结](#4.7 常见问题总结)

​编辑

习题答案

[1. 两个 Activity,点击按钮将输入的姓名传递到第二个页面并显示](#1. 两个 Activity,点击按钮将输入的姓名传递到第二个页面并显示)

MainActivity.java

SecondActivity.java

activity_main.xml

activity_second.xml

[2. 使用 Bundle 传递一组学生信息(姓名、年龄、学号)](#2. 使用 Bundle 传递一组学生信息(姓名、年龄、学号))

MainActivity.java

SecondActivity.java

[activity_main.xml 和 activity_second.xml](#activity_main.xml 和 activity_second.xml)

[3. 页面 A 跳转页面 B,用户输入内容后返回 A 并显示](#3. 页面 A 跳转页面 B,用户输入内容后返回 A 并显示)

ActivityA.java

ActivityB.java

activity_a.xml

activity_b.xml


第四章:Intent 与 Activity 跳转、页面传值(Java 版)


4.1 什么是 Intent?

Intent 是 Android 中的"意图"对象,主要用于:

  • 启动新的 Activity

  • 启动服务(Service)

  • 发送广播

java 复制代码
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);

4.2 显式 Intent 与隐式 Intent

类型 用途 示例
显式 Intent 明确指定目标 Activity new Intent(this, TargetActivity.class)
隐式 Intent 根据"动作"和"类别"匹配系统组件 new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"))

4.3 两个页面之间跳转示例

1️⃣ 主页面 MainActivity

java 复制代码
package com.example.myapp;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button btn = findViewById(R.id.button);
    btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        startActivity(intent); // 页面跳转
      }
    });
  }
}

2️⃣ 目标页面 SecondActivity

java 复制代码
package com.example.myapp;

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
  }
}

3️⃣ 注册 Activity(AndroidManifest.xml)

java 复制代码
<application ...>
  <activity android:name=".SecondActivity" />
</application>

4.4 页面传值(传参)

主页面传值给 SecondActivity

java 复制代码
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("username", "张三"); // 放入数据
startActivity(intent);

SecondActivity 中接收参数

java 复制代码
String name = getIntent().getStringExtra("username");
TextView textView = findViewById(R.id.textView);
textView.setText("你好," + name);

4.5 使用 Bundle 传递多个值

java 复制代码
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name", "张三");
bundle.putInt("age", 20);
intent.putExtras(bundle);
startActivity(intent);

SecondActivity 接收:

java 复制代码
Bundle bundle = getIntent().getExtras();
String name = bundle.getString("name");
int age = bundle.getInt("age");

4.6 从 SecondActivity 返回结果

有时我们希望 SecondActivity 处理完后,返回数据给 MainActivity。

1️⃣ MainActivity 启动方式:

java 复制代码
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, 1); // 1 为请求码

2️⃣ SecondActivity 设置返回数据:

java 复制代码
Intent result = new Intent();
result.putExtra("result", "操作成功!");
setResult(RESULT_OK, result);
finish(); // 结束当前页面

3️⃣ MainActivity 中接收结果:

java 复制代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == 1 && resultCode == RESULT_OK) {
    String msg = data.getStringExtra("result");
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
  }
}

4.7 常见问题总结

问题 解决方案
页面跳转后返回按钮不能用 确保 startActivity() 用于普通跳转,startActivityForResult() 用于有结果返回的跳转
接收参数为 null 检查 putExtra() 和 getExtra() 的 key 是否一致
Activity 未注册报错 在 AndroidManifest.xml 中添加 <activity> 标签

📌 练习题

  1. 编写两个 Activity,点击按钮将输入的姓名传递到第二个页面并显示

  2. 使用 Bundle 传递一组学生信息(姓名、年龄、学号)

  3. 编写一个页面 A,跳转页面 B,用户输入内容后返回 A 并显示


习题答案

1. 两个 Activity,点击按钮将输入的姓名传递到第二个页面并显示

MainActivity.java

java 复制代码
package com.example.demo;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private EditText editTextName;
    private Button buttonSubmit;

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

        editTextName = findViewById(R.id.editTextName);
        buttonSubmit = findViewById(R.id.buttonSubmit);

        buttonSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = editTextName.getText().toString();

                // 创建 Intent 并传递数据
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtra("NAME", name);
                startActivity(intent);
            }
        });
    }
}

SecondActivity.java

java 复制代码
package com.example.demo;

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {

    private TextView textViewName;

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

        textViewName = findViewById(R.id.textViewName);

        // 获取传递的数据
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            String name = extras.getString("NAME");
            textViewName.setText("Hello, " + name);
        }
    }
}

activity_main.xml

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:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/editTextName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter your name" />

    <Button
        android:id="@+id/buttonSubmit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Submit" />
</LinearLayout>

activity_second.xml

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:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <TextView
        android:id="@+id/textViewName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello, "
        android:textSize="24sp" />
</LinearLayout>

2. 使用 Bundle 传递一组学生信息(姓名、年龄、学号)

MainActivity.java

java 复制代码
package com.example.demo;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private Button buttonSendData;

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

        buttonSendData = findViewById(R.id.buttonSendData);

        buttonSendData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 创建 Bundle 并添加学生信息
                Bundle bundle = new Bundle();
                bundle.putString("NAME", "Alice");
                bundle.putInt("AGE", 20);
                bundle.putString("STUDENT_ID", "S12345");

                // 创建 Intent 并传递 Bundle
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtras(bundle);
                startActivity(intent);
            }
        });
    }
}

SecondActivity.java

java 复制代码
package com.example.demo;

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {

    private TextView textViewStudentInfo;

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

        textViewStudentInfo = findViewById(R.id.textViewStudentInfo);

        // 获取传递的 Bundle 数据
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
            String name = bundle.getString("NAME");
            int age = bundle.getInt("AGE");
            String studentId = bundle.getString("STUDENT_ID");

            String info = "Name: " + name + "\nAge: " + age + "\nStudent ID: " + studentId;
            textViewStudentInfo.setText(info);
        }
    }
}

activity_main.xml 和 activity_second.xml

与上一部分类似,只需调整 TextView 的内容即可。


3. 页面 A 跳转页面 B,用户输入内容后返回 A 并显示

ActivityA.java

java 复制代码
package com.example.demo;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class ActivityA extends AppCompatActivity {

    private TextView textViewResult;
    private Button buttonGoToB;

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

        textViewResult = findViewById(R.id.textViewResult);
        buttonGoToB = findViewById(R.id.buttonGoToB);

        buttonGoToB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ActivityA.this, ActivityB.class);
                startActivityForResult(intent, 1); // 使用 startActivityForResult
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 1 && resultCode == RESULT_OK) {
            String result = data.getStringExtra("RESULT");
            textViewResult.setText("Result from B: " + result);
        }
    }
}

ActivityB.java

java 复制代码
package com.example.demo;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;

public class ActivityB extends AppCompatActivity {

    private EditText editTextInput;
    private Button buttonSubmit;

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

        editTextInput = findViewById(R.id.editTextInput);
        buttonSubmit = findViewById(R.id.buttonSubmit);

        buttonSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String input = editTextInput.getText().toString();

                // 将输入结果返回给 ActivityA
                Intent resultIntent = new Intent();
                resultIntent.putExtra("RESULT", input);
                setResult(RESULT_OK, resultIntent);
                finish(); // 关闭当前 Activity
            }
        });
    }
}

activity_a.xml

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:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/textViewResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Result from B will appear here"
        android:textSize="18sp" />

    <Button
        android:id="@+id/buttonGoToB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Go to B" />
</LinearLayout>

activity_b.xml

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:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/editTextInput"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter something" />

    <Button
        android:id="@+id/buttonSubmit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Submit" />
</LinearLayout>
相关推荐
三少爷的鞋4 小时前
AI 时代,我们都将成为通才型开发者:只懂 Android,已经不够了
android
Dovis(誓平步青云)8 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码9 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程10 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程13 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程15 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓15 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程15 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer