一、什么是 Activity?
Activity 可以理解为一个单一的、用户可交互的屏幕。它负责管理用户界面(UI)的显示和用户交互。
- 一个应用通常由多个 Activity 组成(如:登录页、主页面、设置页、详情页)。
- Activity 通过
setContentView()
方法加载一个布局文件(XML),从而定义其 UI。 - Activity 本身是一个 Java 类,继承自
AppCompatActivity
(或Activity
)。
💡 类比:如果把应用比作一本书,那么每个 Activity 就是书中的一页。
二、创建第一个 Activity
1. 在 Android Studio 中创建 Activity
- 在 Project 面板中,右键点击你的包名(如
com.example.myapp
)。 - 选择 【New】 -> 【Activity】 -> 【Empty Activity】。
- 在弹出的对话框中:
- Activity Name : 输入
SecondActivity
。 - Language : 确保选择 【Java】。
- Layout Name : 通常会自动生成
activity_second.xml
。 - 勾选 【Generate Layout File】。
- Activity Name : 输入
- 点击 【Finish】。
Android Studio 会自动完成以下操作:
- 创建
SecondActivity.java
文件。 - 创建
activity_second.xml
布局文件。 - 在
AndroidManifest.xml
中注册这个 Activity。
2. 查看自动生成的代码(Java)
SecondActivity.java
java
package com.example.myapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second); // 绑定布局文件
}
}
AndroidManifest.xml
(新增条目)
XML
<activity
android:name=".SecondActivity"
android:exported="false">
<!-- 如果你想让 SecondActivity 作为启动页,可以添加 intent-filter -->
<!-- 否则,只保留 name 和 exported 属性 -->
</activity>
✅ 注意 :
exported="false"
表示该 Activity 只能被本应用内部启动,提高安全性。
三、Activity 生命周期
Activity 在其存在期间会经历一系列状态变化,系统会调用相应的生命周期回调方法。理解这些方法是开发健壮应用的关键。
1. 生命周期图谱(同 Kotlin 版)
+-----------------+
| onCreate() | ← 首次创建
+--------+--------+
|
v
+--------+--------+
| onStart() | ← 可见
+--------+--------+
|
v
+--------+--------+
| onResume() | ← 运行中,可交互
+--------+--------+
|
| (跳转/Home)
v
+--------+--------+
| onPause() | ← 失去焦点
+--------+--------+
|
v
+--------+--------+
| onStop() | ← 不可见
+--------+--------+
|
| (销毁)
v
+--------+--------+
| onDestroy() | ← 销毁
+-----------------+
| (重新启动)
v
+--------+--------+
| onRestart() | ← 重启
+-----------------+
2. 在 Java 中重写生命周期方法
java
public class SecondActivity extends AppCompatActivity {
private static final String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.d(TAG, "onCreate: Activity 创建");
// 初始化操作:绑定视图、恢复数据等
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: Activity 变为可见");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: Activity 开始运行,可交互");
// 启动动画、传感器等
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause: Activity 失去焦点");
// 保存数据、停止动画(必须快速完成)
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: Activity 不可见");
// 释放资源
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: Activity 被销毁");
// 清理工作
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart: Activity 重新启动");
}
}
💡 黄金法则 :在
onPause()
中保存关键数据!
四、页面跳转与数据传递
1. 使用 Intent 跳转
Intent
是启动 Activity 和传递数据的核心。
从 MainActivity 跳转到 SecondActivity
java
// 在 MainActivity.java 中
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
2. 传递数据
发送数据
java
// 在 MainActivity.java 中
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("user_name", "李四"); // 传递字符串
intent.putExtra("user_age", 30); // 传递整数
intent.putExtra("is_active", true); // 传递布尔值
startActivity(intent);
接收数据
java
// 在 SecondActivity.java 的 onCreate() 中
String userName = getIntent().getStringExtra("user_name");
int userAge = getIntent().getIntExtra("user_age", 0); // 0 是默认值
boolean isActive = getIntent().getBooleanExtra("is_active", false);
// 使用数据
Log.d(TAG, "用户:" + userName + ", 年龄:" + userAge + ", 活跃:" + isActive);
3. 返回数据
启动并期待返回
java
// 在 MainActivity.java 中
static final int REQUEST_CODE = 1001; // 请求码
// 某个按钮点击事件
public void openSecondActivity(View view) {
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);
}
在 SecondActivity 中返回数据
java
// 在 SecondActivity.java 中,例如点击"完成"按钮
public void onDoneClick(View view) {
Intent resultIntent = new Intent();
resultIntent.putExtra("result_message", "操作已完成");
setResult(RESULT_OK, resultIntent);
finish(); // 关闭当前 Activity
}
在 MainActivity 中接收返回
java
// 在 MainActivity.java 中重写 onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
if (resultCode == RESULT_OK) {
String result = data.getStringExtra("result_message");
Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(this, "操作已取消", Toast.LENGTH_SHORT).show();
}
}
}
⚠️ 注意 :虽然
startActivityForResult
在 Java 项目中仍广泛使用,但 Google 推荐使用更现代的 Activity Result API (基于ActivityResultLauncher
),它在 Java 中也可用,能提供更好的类型安全和生命周期感知。
五、总结
核心概念 | Java 实现要点 |
---|---|
类定义 | public class MyActivity extends AppCompatActivity |
生命周期 | 使用 @Override 注解重写方法 |
Intent | new Intent(Context, Class) |
传值 | intent.putExtra(key, value) / getIntent().get...Extra(key) |
回传 | startActivityForResult(intent, code) / setResult(code, data) / onActivityResult() |
六、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!