《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>
相关推荐
jiaxingcode几秒前
MAC系统下完全卸载Android Studio
android·macos·android studio
张力尹7 分钟前
「架构篇 1」认识 MVC / MVP / MVVM / MVI
android·面试·架构
张力尹11 分钟前
「架构篇 2」认识 MVC / MVP / MVVM / MVI
android·面试·架构
不穿铠甲的穿山甲30 分钟前
Android-KeyStore安全的存储系统
android·安全
dora2 小时前
Flutter的屏幕适配
android·flutter
SoulKuyan2 小时前
android 发送onkey广播,Android 添加键值并上报从驱动到上层
android
Yang-Never2 小时前
ADB->查看某个应用的版本信息
android·adb·android studio
居然是阿宋4 小时前
Android RecyclerView 多布局场景下的设计思考:SRP 与 OCP 的权衡与优化
android·开闭原则·单一职责原则
前行的小黑炭5 小时前
Retrofit框架分析(二):注解、反射以及动态代理,Retrofit框架动态代理的源码分析
android·kotlin·retrofit