Android 活动(Activity) 的核心概念与实战入门
在 Android 开发的世界里,Android 活动(Activity) 是最基础、最核心的组件之一。你可以把它想象成一个“窗口”——每一个界面、每一个页面,本质上都是一个活动。当你打开一个 App,看到的主界面、登录页、设置页,甚至一个弹出的对话框,背后都由一个活动来承载。
如果你把整个 App 比作一所学校,那么 Android 活动就像是教室。每个教室(活动)都有自己的用途:有的用于上课(主界面),有的用于考试(登录页),有的用于答疑(帮助中心)。它们各自独立,但又能通过“走廊”(Intent)互相连接。
了解 Android 活动,是踏入 Android 开发的第一步。它不仅是 UI 的容器,更承担着生命周期管理、用户交互响应、数据传递等多重职责。
Android 活动的基本结构与生命周期
每一个 Android 活动都必须继承自 Activity 类,并重写其关键方法。这些方法构成了活动的生命周期,就像一场演出的开始、高潮与谢幕。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 设置当前活动的布局文件,即这个活动要显示的界面
// R.layout.activity_main 是资源文件路径,指向 XML 布局
}
@Override
protected void onStart() {
super.onStart();
// 活动即将可见,但还未完全显示(如:从后台回到前台)
// 可用于恢复一些状态,比如重新加载数据
}
@Override
protected void onResume() {
super.onResume();
// 活动完全可见并获得用户焦点,可以响应用户输入
// 通常在此处启动动画、开启传感器等
}
@Override
protected void onPause() {
super.onPause();
// 用户离开当前活动,但活动仍在后台运行
// 建议保存关键数据,如表单内容、位置信息
}
@Override
protected void onStop() {
super.onStop();
// 活动完全不可见,可能被其他活动覆盖
// 此时应释放资源,比如关闭数据库连接
}
@Override
protected void onDestroy() {
super.onDestroy();
// 活动被销毁,资源将被回收
// 最后清理操作,如取消监听、关闭线程
}
}
小贴士:生命周期方法的调用顺序是固定的,理解它们的触发时机,能帮你避免内存泄漏和状态错乱。比如
onPause()和onStop()都是“退出”阶段,但前者在活动仍可见时调用,后者在完全不可见后。
创建与声明活动:从零开始构建一个界面
要使用一个活动,必须在 AndroidManifest.xml 文件中进行声明。这就像给一个教室“登记注册”,没有登记,系统就找不到它。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="My App"
android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
<!-- 声明 MainActivity -->
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
android:name=".MainActivity":指定活动类名,.表示包名的相对路径。android:exported="true":表示该活动可以被其他 App 调用。主入口活动必须为 true。intent-filter:定义活动的启动方式。MAIN表示主入口,LAUNCHER表示在应用列表中显示图标。
注意:如果忘记在清单文件中声明活动,运行时会抛出
ActivityNotFoundException。这是初学者最常见的错误之一。
布局设计:用 XML 构建用户界面
Android 活动的界面由 XML 布局文件定义。这种分离方式让 UI 与逻辑解耦,便于维护和复用。
创建一个简单的布局文件 activity_main.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/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="欢迎使用 Android 活动"
android:textSize="20sp"
android:layout_marginBottom="32dp" />
<!-- 按钮:点击后跳转到新活动 -->
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="进入下一页"
android:layout_marginTop="16dp" />
</LinearLayout>
android:id="@+id/textView":为组件分配唯一 ID,用于在 Java 代码中引用。android:layout_width="match_parent":宽度占满父容器。android:gravity="center":内部子控件居中对齐。android:padding="16dp":内边距,防止内容贴边。
在 MainActivity 中绑定布局并设置按钮点击事件:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 找到按钮控件
Button button = findViewById(R.id.button);
// 设置点击监听器
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 创建意图,用于启动另一个活动
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
}
活动间的跳转与数据传递
在真实 App 中,用户需要在多个页面之间切换。Android 提供了 Intent 机制来实现活动之间的跳转与数据传递。
创建第二个活动
新建一个 SecondActivity.java:
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// 从 Intent 中获取传入的数据
Intent intent = getIntent();
String message = intent.getStringExtra("USER_MESSAGE");
// 找到 TextView 并显示接收到的内容
TextView textView = findViewById(R.id.textView2);
textView.setText("接收到的消息:" + message);
}
}
在第一个活动中传递数据
回到 MainActivity,修改按钮点击逻辑:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 创建意图,指定要跳转的目标活动
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
// 添加数据:键值对形式,key 为字符串,value 为可序列化的数据
intent.putExtra("USER_MESSAGE", "Hello 从 MainActivity 传来的消息");
// 启动新活动
startActivity(intent);
}
});
关键点:
putExtra()用于传递数据,getIntent().getStringExtra()用于接收。支持的数据类型包括 String、int、boolean、Bundle 等。
常见问题与最佳实践
在开发过程中,Android 活动常见的问题包括:
- 内存泄漏:在
onPause()或onStop()中未释放资源(如注册的广播接收器、监听器)。 - 状态丢失:未在
onSaveInstanceState()中保存临时状态,导致用户操作中断后无法恢复。 - 过度使用活动:一个 App 中活动过多,会导致导航混乱。建议使用 Fragment 实现页面模块化。
推荐做法:
- 使用
onSaveInstanceState()保存短期状态:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// 保存文本框内容
outState.putString("TEXT_CONTENT", editText.getText().toString());
}
- 在
onCreate()中恢复状态:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String content = savedInstanceState.getString("TEXT_CONTENT");
editText.setText(content);
}
}
- 避免在活动中写太多逻辑:将数据处理、网络请求等移到
ViewModel或Service中,保持活动轻量。
总结:Android 活动是 App 的基石
Android 活动不仅是 UI 的容器,更是整个 App 交互流程的起点。它通过生命周期管理保障了应用的稳定性,通过 Intent 实现了页面间的灵活跳转,通过布局与代码分离提升了开发效率。
无论你是初学者还是中级开发者,掌握 Android 活动的创建、声明、生命周期管理与数据传递,都是构建高质量 Android 应用的必要前提。
记住:每一个用户点击的背后,都是一次活动的启动与流转。理解它,才能掌控整个 App 的运行脉络。从今天开始,把每一个活动都当作一个“舞台”,精心设计,优雅登场。