Android 活动(Activity)(长文讲解)

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 实现页面模块化。

推荐做法:

  1. 使用 onSaveInstanceState() 保存短期状态
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // 保存文本框内容
    outState.putString("TEXT_CONTENT", editText.getText().toString());
}
  1. 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);
    }
}
  1. 避免在活动中写太多逻辑:将数据处理、网络请求等移到 ViewModelService 中,保持活动轻量。

总结:Android 活动是 App 的基石

Android 活动不仅是 UI 的容器,更是整个 App 交互流程的起点。它通过生命周期管理保障了应用的稳定性,通过 Intent 实现了页面间的灵活跳转,通过布局与代码分离提升了开发效率。

无论你是初学者还是中级开发者,掌握 Android 活动的创建、声明、生命周期管理与数据传递,都是构建高质量 Android 应用的必要前提。

记住:每一个用户点击的背后,都是一次活动的启动与流转。理解它,才能掌控整个 App 的运行脉络。从今天开始,把每一个活动都当作一个“舞台”,精心设计,优雅登场。