Activity #

一、Activity概述 #

Activity是Android四大组件之一,是用户与应用程序交互的入口点。一个Activity通常对应一个屏幕,用户可以在这个屏幕上进行操作。

1.1 Activity的特点 #

  • 提供用户界面
  • 管理用户交互
  • 具有生命周期
  • 可以相互跳转

1.2 Activity的注册 #

所有Activity必须在AndroidManifest.xml中注册:

xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">

    <application>
        <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
            android:name=".SecondActivity"
            android:exported="false" />
    </application>

</manifest>

1.3 Activity属性 #

属性 说明
android:name Activity类名
android:label Activity标题
android:icon Activity图标
android:theme Activity主题
android:exported 是否可被其他应用启动
android:launchMode 启动模式
android:screenOrientation 屏幕方向
android:configChanges 配置变化处理

二、Activity生命周期 #

2.1 生命周期图解 #

text
                    创建
                      │
                      ▼
              ┌───────────────┐
              │   onCreate()  │
              └───────┬───────┘
                      │
                      ▼
              ┌───────────────┐
              │   onStart()   │
              └───────┬───────┘
                      │
                      ▼
              ┌───────────────┐
         ┌────│  onResume()   │◄───────────┐
         │    └───────────────┘            │
         │             │                   │
         │             ▼                   │
         │    ┌───────────────┐            │
         │    │   运行中       │            │
         │    └───────────────┘            │
         │             │                   │
         │             ▼                   │
         │    ┌───────────────┐            │
         │    │   onPause()   │────────────┘
         │    └───────┬───────┘
         │            │
         │            ▼
         │    ┌───────────────┐
         │    │   onStop()    │
         │    └───────┬───────┘
         │            │
         │            ▼
         │    ┌───────────────┐
         └───►│  onDestroy()  │
              └───────────────┘

2.2 生命周期方法 #

kotlin
class MainActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.d("MainActivity", "onCreate")
    }
    
    override fun onStart() {
        super.onStart()
        Log.d("MainActivity", "onStart")
    }
    
    override fun onResume() {
        super.onResume()
        Log.d("MainActivity", "onResume")
    }
    
    override fun onPause() {
        super.onPause()
        Log.d("MainActivity", "onPause")
    }
    
    override fun onStop() {
        super.onStop()
        Log.d("MainActivity", "onStop")
    }
    
    override fun onDestroy() {
        super.onDestroy()
        Log.d("MainActivity", "onDestroy")
    }
    
    override fun onRestart() {
        super.onRestart()
        Log.d("MainActivity", "onRestart")
    }
}

2.3 生命周期说明 #

方法 说明 典型操作
onCreate() Activity创建时调用 初始化、加载布局
onStart() Activity变为可见时调用 注册广播接收器
onResume() Activity获得焦点时调用 恢复动画、相机预览
onPause() Activity失去焦点时调用 暂停动画、保存草稿
onStop() Activity不可见时调用 释放资源、注销广播
onDestroy() Activity销毁时调用 释放所有资源
onRestart() Activity从停止状态重启 恢复数据

2.4 典型场景生命周期 #

启动Activity #

text
onCreate() -> onStart() -> onResume()

打开新Activity(当前Activity进入后台) #

text
onPause() -> onStop()

返回到Activity #

text
onRestart() -> onStart() -> onResume()

关闭Activity #

text
onPause() -> onStop() -> onDestroy()

屏幕旋转 #

text
onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume()

2.5 保存和恢复状态 #

kotlin
class MainActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // 恢复数据
        savedInstanceState?.let {
            val score = it.getInt("score", 0)
            updateScore(score)
        }
    }
    
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // 保存数据
        outState.putInt("score", currentScore)
    }
    
    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        // 恢复数据
        val score = savedInstanceState.getInt("score", 0)
        updateScore(score)
    }
}

三、Activity启动模式 #

3.1 四种启动模式 #

模式 说明
standard 默认模式,每次启动创建新实例
singleTop 栈顶复用,如果已在栈顶则复用
singleTask 栈内复用,清除其上方所有Activity
singleInstance 单实例模式,独占一个任务栈

3.2 配置启动模式 #

xml
<activity
    android:name=".MainActivity"
    android:launchMode="singleTop" />

或使用Intent标志:

kotlin
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(intent)

3.3 standard模式 #

每次启动都创建新实例:

text
任务栈: [A]
启动B: [A, B]
启动B: [A, B, B]
启动B: [A, B, B, B]

3.4 singleTop模式 #

如果目标Activity已在栈顶,则复用:

text
任务栈: [A, B]
启动B: [A, B]  // 复用栈顶B,调用onNewIntent()
启动C: [A, B, C]
启动B: [A, B, C, B]
kotlin
class MainActivity : AppCompatActivity() {
    
    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // 处理新Intent
        val data = intent?.getStringExtra("data")
    }
}

3.5 singleTask模式 #

如果任务栈中已存在,则复用并清除其上方所有Activity:

text
任务栈: [A, B, C, D]
启动B: [A, B]  // C、D被清除

3.6 singleInstance模式 #

Activity独占一个任务栈:

text
任务栈1: [A, B]
启动C(singleInstance):
任务栈1: [A, B]
任务栈2: [C]

3.7 Intent标志 #

标志 说明
FLAG_ACTIVITY_NEW_TASK 新任务中启动
FLAG_ACTIVITY_SINGLE_TOP 相当于singleTop
FLAG_ACTIVITY_CLEAR_TOP 清除目标上方所有Activity
FLAG_ACTIVITY_NO_HISTORY 不保留在任务栈中
FLAG_ACTIVITY_CLEAR_TASK 启动时清除任务栈

四、Activity跳转与数据传递 #

4.1 基本跳转 #

kotlin
// 显式Intent
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)

// 隐式Intent
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.example.com")
startActivity(intent)

4.2 传递数据 #

kotlin
// 发送数据
val intent = Intent(this, SecondActivity::class.java).apply {
    putExtra("name", "Kotlin")
    putExtra("age", 10)
    putExtra("isStudent", true)
}
startActivity(intent)

// 接收数据
class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        val name = intent.getStringExtra("name")
        val age = intent.getIntExtra("age", 0)
        val isStudent = intent.getBooleanExtra("isStudent", false)
    }
}

4.3 传递对象 #

kotlin
// 实现Parcelable接口
@Parcelize
data class User(val id: Int, val name: String) : Parcelable

// 发送
val user = User(1, "Kotlin")
val intent = Intent(this, SecondActivity::class.java).apply {
    putExtra("user", user)
}
startActivity(intent)

// 接收
val user = intent.getParcelableExtra<User>("user")

4.4 startActivityForResult(已废弃) #

kotlin
// 发送请求
val intent = Intent(this, SecondActivity::class.java)
startActivityForResult(intent, REQUEST_CODE)

// 接收结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        val result = data?.getStringExtra("result")
    }
}

// 返回结果
class SecondActivity : AppCompatActivity() {
    fun returnResult() {
        val intent = Intent().apply {
            putExtra("result", "Success")
        }
        setResult(RESULT_OK, intent)
        finish()
    }
}

4.5 Activity Result API(推荐) #

kotlin
class MainActivity : AppCompatActivity() {
    
    private val startForResult = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result ->
        if (result.resultCode == RESULT_OK) {
            val data = result.data?.getStringExtra("result")
        }
    }
    
    fun openSecondActivity() {
        val intent = Intent(this, SecondActivity::class.java)
        startForResult.launch(intent)
    }
}

4.6 请求权限 #

kotlin
private val requestPermission = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
) { isGranted ->
    if (isGranted) {
        // 权限已授予
    } else {
        // 权限被拒绝
    }
}

fun requestCameraPermission() {
    requestPermission.launch(Manifest.permission.CAMERA)
}

五、任务栈管理 #

5.1 任务栈概念 #

任务栈(Task)是一组Activity的集合,按照打开顺序排列。后打开的Activity位于栈顶。

5.2 查看任务栈 #

kotlin
// 获取任务信息
val manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val tasks = manager.appTasks

for (task in tasks) {
    Log.d("Task", "Task ID: ${task.taskInfo.id}")
    Log.d("Task", "Base Activity: ${task.taskInfo.baseActivity}")
}

5.3 清除任务栈 #

kotlin
// 清除任务栈并启动新Activity
val intent = Intent(this, MainActivity::class.java).apply {
    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
}
startActivity(intent)

六、Activity最佳实践 #

6.1 使用ViewModel保存数据 #

kotlin
class MainViewModel : ViewModel() {
    private val _score = MutableLiveData<Int>()
    val score: LiveData<Int> = _score
    
    fun updateScore(newScore: Int) {
        _score.value = newScore
    }
}

class MainActivity : AppCompatActivity() {
    private val viewModel: MainViewModel by viewModels()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        viewModel.score.observe(this) { score ->
            updateScoreUI(score)
        }
    }
}

6.2 处理配置变化 #

xml
<activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenSize|keyboardHidden" />
kotlin
override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    when (newConfig.orientation) {
        Configuration.ORIENTATION_LANDSCAPE -> {
            // 横屏处理
        }
        Configuration.ORIENTATION_PORTRAIT -> {
            // 竖屏处理
        }
    }
}

6.3 避免内存泄漏 #

kotlin
class MainActivity : AppCompatActivity() {
    private var handler: Handler? = null
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        handler = Handler(Looper.getMainLooper())
    }
    
    override fun onDestroy() {
        super.onDestroy()
        // 移除所有消息
        handler?.removeCallbacksAndMessages(null)
        handler = null
    }
}

七、总结 #

本章详细介绍了Activity:

  1. Activity的基本概念和注册
  2. 生命周期的各个阶段
  3. 四种启动模式
  4. Activity之间的跳转和数据传递
  5. 任务栈管理
  6. 最佳实践

Activity是Android开发的基础,理解其生命周期和启动模式对于开发高质量应用至关重要。

最后更新:2026-03-26