Android Activity开发指南:从基础到实战

📅 2026/7/19 1:19:12
Android Activity开发指南:从基础到实战
1. 初识Android Activity从零开始的界面开发之旅作为一名刚入职的Android开发新手第一次接触Activity这个概念时我脑海中浮现的是一堆问号。Activity到底是什么为什么说它是Android四大组件之首经过一个月的实战摸索我终于理解了Activity在Android应用中的核心地位——它就像是我们手机屏幕上每一个可见的窗口用户的所有交互操作都发生在Activity这个舞台上。在Android Studio中创建一个新的Activity时系统会自动生成三个关键文件Java/Kotlin类文件、XML布局文件和AndroidManifest.xml中的声明。这三件套构成了一个Activity的基本骨架。以MainActivity为例它的类文件继承自AppCompatActivityXML文件定义了按钮、文本框等UI元素而Manifest文件则告诉系统嗨这里有一个Activity可以随时调用新手常见误区很多初学者会忽略AndroidManifest.xml中的Activity声明导致应用崩溃。Android系统强制要求所有Activity都必须在此注册这是与其他平台开发的重要区别。2. Activity生命周期理解应用的前台与后台当我第一次看到Activity生命周期图时那些onCreate()、onStart()、onResume()等方法名让我眼花缭乱。直到自己动手实验后才真正明白这些回调方法的调用时机和意义。最经典的生命周期场景莫过于屏幕旋转——Activity会经历销毁重建的过程这时onSaveInstanceState()就成了保存临时数据的关键。Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(key, 需要保存的数据); } Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState ! null) { String data savedInstanceState.getString(key); } }在实际项目中我遇到过因生命周期处理不当导致的bug在onResume()中启动了一个耗时网络请求当用户快速切换Activity时旧Activity的请求回调可能会更新已经不可见的UI。解决方案是使用LiveData或RxJava的生命周期感知组件。3. Activity间通信Intent的妙用Activity之间如何传递数据这是我入职后遇到的第一个实际开发问题。Android提供的Intent机制就像Activity之间的邮差不仅能携带基本数据类型还能传递自定义对象需实现Parcelable接口。下面是一个典型的启动新Activity并传递数据的例子// 发送方Activity Intent intent new Intent(this, TargetActivity.class); intent.putExtra(username, 张三); intent.putExtra(age, 25); startActivity(intent); // 接收方Activity String username getIntent().getStringExtra(username); int age getIntent().getIntExtra(age, 0);更复杂的场景是期待返回结果的Activity跳转。比如从联系人列表选择联系人后返回当前页面这时需要使用startActivityForResult()// 启动选择Activity startActivityForResult( new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI), REQUEST_CODE_PICK_CONTACT ); // 处理返回结果 Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode REQUEST_CODE_PICK_CONTACT resultCode RESULT_OK) { // 处理选择的联系人数据 } }4. Activity的启动模式解决实际场景的栈管理问题当应用需要特殊的多实例管理需求时Activity的启动模式就派上用场了。Android提供了四种启动模式通过在AndroidManifest.xml中配置launchMode属性实现standard默认每次启动都创建新实例singleTop如果已在栈顶则不创建新实例singleTask整个任务栈只存在一个实例singleInstance单独存在于一个任务栈中一个典型的应用场景是应用的首页Activity。通常我们会设置为singleTask避免用户点击返回键时重复创建主页activity android:name.MainActivity android:launchModesingleTask android:labelstring/app_name /activity我在开发新闻应用时曾遇到详情页重复打开的问题——用户从通知栏多次点击同一条新闻通知会创建多个相同的详情页。通过将详情页设置为singleTop并处理onNewIntent()回调完美解决了这个问题。5. Activity与Fragment的配合使用现代Android开发中Fragment已经成为Activity的重要搭档。一个Activity可以包含多个Fragment就像浏览器中的多个标签页。这种组合方式特别适合平板等大屏设备也便于实现灵活的UI布局。在Activity中管理Fragment的基本流程// 添加Fragment getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, new MyFragment()) .commit(); // 替换Fragment getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container, new AnotherFragment()) .addToBackStack(null) // 允许返回 .commit();重要提示Fragment有自己的生命周期但与宿主Activity的生命周期紧密关联。当Activity暂停时其中的所有Fragment也会暂停。理解这种关联关系对正确处理UI状态至关重要。6. 常见问题排查与性能优化在实际开发中我积累了一些Activity相关的调试经验内存泄漏排查使用Android Profiler检查Activity实例是否被意外持有。常见泄漏场景包括静态变量引用、未取消的Handler或RxJava订阅等。启动速度优化避免在onCreate()中执行耗时操作。对于冷启动白屏问题可以使用windowBackground主题属性设置启动图style nameAppTheme.Launcher item nameandroid:windowBackgrounddrawable/launch_screen/item /style状态恢复除了onSaveInstanceState()对于复杂数据可以考虑使用ViewModel来保存。ViewModel的生命周期比Activity更长在配置变更时不会被销毁。权限请求Android 6.0需要运行时权限申请。注意处理用户拒绝权限后的降级方案if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) ! PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_CAMERA); }7. 现代Android开发中的Activity新特性随着Jetpack组件的普及Activity的开发模式也在演进ViewBinding替代findViewById在build.gradle中启用viewBinding后可以类型安全地访问视图private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.textView.text Hello ViewBinding }Activity Result API新的API简化了startActivityForResult的处理val startForResult registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result - if (result.resultCode Activity.RESULT_OK) { val data: Intent? result.data // 处理返回数据 } } // 启动Activity startForResult.launch(Intent(this, TargetActivity::class.java))Navigation组件通过导航图管理Activity和Fragment之间的跳转关系可视化地设计应用流程。在项目实践中我发现合理组合这些新技术可以显著提升开发效率和代码质量。比如将Navigation组件与ViewModel结合使用既能清晰管理页面流又能妥善处理数据持久化问题。