安卓Activity如何高效管理生命周期?

99ANYc3cd6
预计阅读时长 20 分钟
位置: 首页 安卓 正文

什么是 Activity?

你可以把 Activity 想象成一个“屏幕”或者“窗口”,它是 Android 应用程序中与用户进行交互的一个单一屏幕。

安卓 activity
(图片来源网络,侵删)
  • 一个 App 通常由多个 Activity 组成,一个微信 App 就有登录 Activity、聊天列表 Activity、聊天窗口 Activity、朋友圈 Activity 等等。
  • 每个 Activity 都有自己的生命周期,负责处理用户的输入事件(如点击、滑动)和绘制自己的 UI 界面。

Activity 的核心生命周期

理解 Activity 的生命周期是掌握 Android 开发的关键。Activity 从创建到销毁会经历一系列的状态变化,这些状态由系统管理,并通过一系列回调方法通知开发者。

以下是 Activity 生命周期的主要方法,按照典型的调用顺序排列:

onCreate()

  • 调用时机Activity 被创建时调用,这是生命周期中第一个调用的方法。
  • 作用:进行一些一次性的初始化工作。
    • 设置布局文件(setContentView(R.layout.activity_main))。
    • 初始化数据。
    • 绑定事件监听器。
  • 注意:此方法只会调用一次。

onStart()

  • 调用时机Activity 即将对用户可见时调用,它紧跟在 onCreate() 之后,或者在 Activity 从不可见变为可见时(从另一个 Activity 返回)。
  • 作用Activity 已经准备好显示,但可能还没有出现在前台,通常这里可以做一些轻量级的操作,比如注册一个广播接收器来监听系统变化。

onResume()

  • 调用时机Activity 位于前台,并且可以与用户进行交互时调用,它紧跟在 onStart() 之后。
  • 作用Activity 处于“运行”状态,此时用户的所有输入都会被这个 Activity 捕获,通常在这里启动动画、摄像头等需要前台交互的资源。

onPause()

  • 调用时机:系统即将启动另一个 Activity(或另一个应用)时调用,当前 Activity 会部分被遮盖或完全不可见。
  • 作用
    • 保存关键数据:因为 onPause() 返回后,Activity 可能随时被销毁,所以在这里保存用户未提交的数据是很好的时机。
    • 释放资源:停止消耗 CPU 的动画、停止摄像头预览、释放网络连接等。
  • 注意:这个方法的执行速度要快,因为下一个 Activity 必须等待它执行完毕才能显示。

onStop()

  • 调用时机Activity 完全不可见时调用,用户导航到了另一个 Activity,或者按了 Home 键。
  • 作用
    • 释放更重的资源:在 onPause() 中没来得及释放的资源可以在这里释放,例如复杂的后台线程。
    • 停止所有非必要的操作,以节省电量。
  • 注意Activity 实例仍然保留在内存中,如果系统需要内存,它可能会被销毁(调用 onDestroy()),否则用户返回时可以快速恢复(调用 onRestart() -> onStart() -> onResume())。

onDestroy()

  • 调用时机Activity 即将被销毁时调用,这是生命周期中最后一个调用的方法。
  • 作用:进行最终的清理工作,
    • 停止所有在后台运行的线程。
    • 解除绑定的服务。
    • 移除所有的回调引用。

onRestart()

  • 调用时机ActivityStopped 状态(不可见)重新变为 Started 状态(可见)时调用,它发生在用户从其他 Activity 返回到当前 Activity 之前。
  • 作用:很少使用,通常用于进行一些特殊的恢复逻辑。

Activity 的基本用法

创建一个 Activity

  1. 创建 Java/Kotlin 类:继承自 Activity 或其子类(如 AppCompatActivity,为了兼容性推荐使用 AppCompatActivity)。

    // MyActivity.kt
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    class MyActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_my) // 加载布局文件
        }
    }
  2. 创建布局文件:在 res/layout/ 目录下创建对应的 XML 文件,activity_my.xml

    安卓 activity
    (图片来源网络,侵删)
    <!-- res/layout/activity_my.xml -->
    <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Hello, My Activity!"
        android:gravity="center" />
  3. 在 AndroidManifest.xml 中注册这一步非常重要! 每一个 Activity 都必须在 AndroidManifest.xml 文件中声明,否则系统无法找到它。

    <!-- AndroidManifest.xml -->
    <manifest ...>
        <application ...>
            <!-- 默认启动的 Activity -->
            <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>
            <!-- 我们新创建的 Activity -->
            <activity
                android:name=".MyActivity"
                android:exported="false" />
        </application>
    </manifest>
    • android:name: 指定 Activity 的类名, 代表当前包名。
    • android:exported: 表示该 Activity 是否能被其他应用调用。false 表示私有。
    • LAUNCHERMAIN: 这两个 intent-filter 组合表示该 Activity 是应用的入口点,会出现在桌面上。

启动一个 Activity

通过 Intent(意图)来启动 ActivityIntent 是 Android 中不同组件间通信的“信使”。

从当前 Activity 启动另一个 Activity:

// 在 MainActivity 的某个方法中,比如按钮点击事件里
val intent = Intent(this, MyActivity::class.java)
startActivity(intent)

向启动的 Activity 传递数据:

安卓 activity
(图片来源网络,侵删)
// 发送方
val intent = Intent(this, MyActivity::class.java)
intent.putExtra("message_key", "你好,MyActivity!")
startActivity(intent)
// 接收方 (在 MyActivity 的 onCreate 或其他方法中)
val message = intent.getStringExtra("message_key")
// 使用 message...

关闭一个 Activity

调用 finish() 方法来关闭当前 Activity,它会销毁当前 Activity 并返回到上一个 Activity

// 在 MyActivity 中
finish() // 关闭 MyActivity

进阶概念

Activity 启动模式

启动模式决定了 Activity 实例在任务栈中的行为,通过在 AndroidManifest.xml 中为 <activity> 标签设置 android:launchMode 属性来指定。

  • standard (默认模式): 每次启动都会创建一个新的 Activity 实例。
  • singleTop: 如果要启动的 Activity 已经在任务栈的顶部,则不会创建新的实例,而是会调用其 onNewIntent() 方法。
  • singleTask: 如果要启动的 Activity 已经存在于任务栈中,则不会创建新实例,而是会把它上面的所有 Activity 都出栈,使其成为栈顶,并调用其 onNewIntent() 方法,非常适合作为应用的首页。
  • singleInstance: 创建一个新的任务栈来存放这个 Activity,并且这个任务栈中只有这一个 Activity 实例,其他应用可以通过 Intent 直接启动它。

Task (任务)

Activity 是按“任务”来组织的,一个任务就是一组 Activity 的集合,用户可以来回导航这些 Activity,当你从主屏幕启动一个应用时,系统会为其创建一个新的任务,并将该应用的 LAUNCHER Activity 放入栈底。

Fragment (碎片)

FragmentActivity 中可重用的一部分 UI 和行为,它必须嵌入在 Activity 中,一个 Activity 可以包含多个 Fragment,并且一个 Fragment 也可以被多个 Activity 重用,这使得构建灵活的、适配不同屏幕尺寸(如手机和平板)的 UI 变得非常容易。


概念 描述
定义 应用的一个单一屏幕,与用户交互。
生命周期 onCreate() -> onStart() -> onResume() -> (前台运行) -> onPause() -> onStop() -> onDestroy()
核心作用 onCreate() 初始化,onResume() 获取焦点,onPause() 保存数据/释放资源,onDestroy() 销毁。
启动方式 使用 IntentstartActivity()
注册 必须在 AndroidManifest.xml 中声明。
启动模式 控制实例在任务栈中的创建和管理方式。

掌握 Activity 是 Android 开发的第一步,理解其生命周期和启动机制对于构建稳定、高效的应用至关重要。

-- 展开阅读全文 --
头像
台式电脑如何连接WiFi?
« 上一篇 今天
手机WiFi密码忘了?手机上怎么查?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]