Android Activity生命周期与Intent机制详解

发布时间:2026/7/19 1:12:04
Android Activity生命周期与Intent机制详解 1. Android活动Activity基础概念解析Activity作为Android四大组件之首是每个Android开发者必须掌握的核心概念。简单来说Activity就是用户与应用程序交互的界面窗口它承载了应用的可视化界面和用户操作逻辑。就像餐厅里的服务员Activity负责把应用的功能端到用户面前。在技术实现上Activity继承自android.app.Activity类每个Activity都需要在AndroidManifest.xml中声明。典型的Activity声明如下activity android:name.MainActivity android:labelstring/app_name android:themestyle/AppTheme intent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.LAUNCHER / /intent-filter /activity这里有几个关键属性需要注意android:name指定Activity的类名android:label设置Activity在任务栈中显示的名称android:theme定义Activity的视觉主题intent-filter中的MAIN和LAUNCHER组合表示这是应用的入口Activity提示即使Activity没有界面如后台处理Activity也必须在清单文件中声明否则系统会抛出ActivityNotFoundException。1.1 Activity生命周期深度剖析理解Activity生命周期是Android开发的基本功。Activity的生命周期由以下核心方法构成onCreate()Activity创建时调用用于初始化基本组件onStart()Activity可见但未获得焦点时调用onResume()Activity获得焦点并可与用户交互时调用onPause()其他Activity获得焦点时调用onStop()Activity完全不可见时调用onDestroy()Activity被销毁前调用onRestart()Activity从停止状态重新启动时调用这些方法构成了Activity的完整生命周期开发者可以通过重写这些方法在特定时机执行相应逻辑。例如我们通常在onCreate()中初始化视图在onPause()中保存临时数据。public class MainActivity extends AppCompatActivity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化视图和变量 } Override protected void onPause() { super.onPause(); // 保存用户输入等临时数据 } }生命周期方法调用顺序可以用一个简单场景来说明当用户从Activity A跳转到Activity B时A的onPause()被调用B的onCreate() → onStart() → onResume()依次执行A的onStop()被调用如果B完全覆盖A常见误区很多新手会混淆onPause()和onStop()的区别。简单来说onPause()在Activity失去焦点时立即调用可能只是被对话框部分遮挡而onStop()是在Activity完全不可见时才调用。2. Activity间通信与Intent机制2.1 Intent基础与应用Intent是Android组件间通信的核心机制特别适用于Activity之间的跳转和数据传递。Intent分为显式Intent和隐式Intent两种显式Intent明确指定目标Activity类名Intent intent new Intent(this, TargetActivity.class); startActivity(intent);隐式Intent通过action、category等描述操作意图由系统匹配最适合的ActivityIntent intent new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(https://www.example.com)); startActivity(intent);Intent不仅可以启动Activity还能携带数据。通过putExtra()方法可以附加各种类型的数据Intent intent new Intent(this, DetailActivity.class); intent.putExtra(user_id, 12345); intent.putExtra(user_name, 张三); startActivity(intent);在目标Activity中通过getIntent()获取传递的数据Intent intent getIntent(); int userId intent.getIntExtra(user_id, 0); String userName intent.getStringExtra(user_name);2.2 Activity启动模式详解Android通过任务栈Task管理Activity实例而启动模式决定了Activity如何与任务栈交互。共有四种启动模式standard默认模式每次启动都创建新实例singleTop如果目标Activity已在栈顶则复用实例singleTask在整个任务栈中保持唯一实例singleInstance独占一个任务栈且栈中只有它自己在AndroidManifest.xml中配置启动模式activity android:name.DetailActivity android:launchModesingleTop /activity不同启动模式的应用场景standard普通页面跳转singleTop防止快速点击重复创建如支付页面singleTask应用主界面singleInstance独立运行的页面如来电界面实战技巧使用adb shell dumpsys activity activities命令可以查看当前任务栈状态调试启动模式问题非常有用。3. Activity高级特性与优化3.1 状态保存与恢复当系统因资源配置变更如旋转屏幕或内存不足销毁Activity时我们需要保存临时状态。重写onSaveInstanceState()和onRestoreInstanceState()可以实现状态保存Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(edit_text, mEditText.getText().toString()); } Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); String text savedInstanceState.getString(edit_text); mEditText.setText(text); }注意onSaveInstanceState()不是持久化存储的替代方案它只适用于临时UI状态。重要数据应该存储在数据库或SharedPreferences中。3.2 多窗口模式适配从Android 7.0开始系统支持多窗口模式分屏、画中画等。Activity需要处理以下场景配置变更时的快速重建失去焦点时的资源释放尺寸变化时的布局调整在清单文件中声明多窗口支持activity android:name.MainActivity android:resizeableActivitytrue android:supportsPictureInPicturetrue /activity处理画中画模式的关键代码// 进入画中画模式 private void enterPictureInPictureMode() { if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) { PictureInPictureParams params new PictureInPictureParams.Builder() .setAspectRatio(new Rational(16, 9)) .build(); enterPictureInPictureMode(params); } } // 处理模式变化 Override public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) { if (isInPictureInPictureMode) { // 隐藏非必要UI元素 } else { // 恢复完整UI } }4. Activity开发常见问题与解决方案4.1 内存泄漏预防Activity是最容易发生内存泄漏的组件之一。常见泄漏场景及解决方案静态引用静态变量持有Activity引用// 错误示例 public class LeakHelper { public static Activity sActivity; } // 正确做法使用弱引用 public class SafeHelper { public static WeakReferenceActivity sActivityRef; }匿名内部类长时间运行的任务持有Activity引用// 错误示例 mButton.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { new Thread(() - { // 长时间操作 runOnUiThread(() - { // 更新UI }); }).start(); } }); // 正确做法使用静态内部类弱引用 private static class SafeTask implements Runnable { private final WeakReferenceActivity mActivityRef; SafeTask(Activity activity) { mActivityRef new WeakReference(activity); } Override public void run() { Activity activity mActivityRef.get(); if (activity ! null !activity.isFinishing()) { activity.runOnUiThread(() - { // 更新UI }); } } }4.2 启动性能优化Activity启动速度直接影响用户体验。优化建议减少onCreate()中的耗时操作使用ViewStub延迟加载复杂布局避免在UI线程进行IO操作使用SplashActivity预加载资源检查启动时间的简单方法adb shell am start -W com.example.app/.MainActivity输出结果中重点关注ThisTime最后一个Activity启动耗时TotalTime所有Activity启动总耗时WaitTimeAMS启动Activity的总耗时4.3 兼容性处理不同Android版本的Activity行为差异权限变化Android 6.0需要运行时请求危险权限Android 10限制了后台启动Activity行为变化Android 7.0多窗口支持Android 8.0限制透明Activity方向Android 11限制包可见性处理兼容性的推荐做法if (Build.VERSION.SDK_INT Build.VERSION_CODES.M) { // 处理6.0特有逻辑 if (checkSelfPermission(Manifest.permission.CAMERA) ! PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.CAMERA}, 100); } } else { // 旧版本直接执行 openCamera(); }在Activity开发过程中我最大的体会是理解生命周期和掌握Intent机制是基础而性能优化和内存管理则是进阶关键。特别是在处理复杂界面跳转时清晰的启动模式设计和合理的任务栈管理能让应用行为更加可预测。建议新手开发者多使用Android Studio的Layout Inspector和Profiler工具直观地观察Activity的运行状态和性能表现。