Android开发四大组件和生命周期及setFlags
文章目录
- Android开发四大组件
- 1. Activity(活动)
- 2. Service(服务)
- 3. BroadcastReceiver(广播接收器)
- 4. ContentProvider(内容提供者)
- 共同特点
- Activity 生命周期详解
- 完整的生命周期方法
- 特殊情况生命周期方法
- 生命周期图示
- 常见场景的生命周期变化
- Intent的setFlags(int flags)方法详解
- 常用标志(Flags)分类
- 1. 任务栈控制标志
- FLAG_ACTIVITY_NEW_TASK (0x10000000)
- FLAG_ACTIVITY_CLEAR_TASK (0x00008000)
- FLAG_ACTIVITY_CLEAR_TOP (0x04000000)
- 2. Activity 实例管理标志
- FLAG_ACTIVITY_SINGLE_TOP (0x20000000)
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS (0x00800000)
- 3. 任务栈历史管理标志
- FLAG_ACTIVITY_NO_HISTORY (0x40000000)
- FLAG_ACTIVITY_REORDER_TO_FRONT (0x00020000)
- 4. 其他常用标志
- FLAG_ACTIVITY_NO_ANIMATION (0x00010000)
- FLAG_ACTIVITY_MULTIPLE_TASK (0x08000000)
- 组合使用示例
- 注意事项
Android开发四大组件
Android四大组件是Android应用开发的基础架构,包括:
1. Activity(活动)
- 作用:用户交互界面
- 特点:
- 提供可视化用户界面
- 一个应用通常由多个Activity组成
- 通过Intent进行跳转
- 生命周期:onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()
2. Service(服务)
- 作用:后台运行组件
- 特点:
- 无用户界面
- 可用于长时间运行操作(如下载、播放音乐)
- 分为启动状态和绑定状态
- 类型:
- Started Service(启动服务)
- Bound Service(绑定服务)
3. BroadcastReceiver(广播接收器)
- 作用:接收系统或应用广播消息
- 特点:
- 用于响应系统级事件(如电量低、网络变化)
- 可以静态注册(Manifest)或动态注册(代码)
- 通过IntentFilter指定接收的广播类型
4. ContentProvider(内容提供者)
- 作用:数据共享组件
- 特点:
- 管理结构化数据共享
- 提供统一接口访问数据
- 通过URI标识数据
- 常用于应用间数据共享
共同特点
- 都需要在AndroidManifest.xml中声明
- 都可以通过Intent进行激活或通信
- 都有各自的生命周期
这些组件构成了Android应用的基本框架,开发者通过组合使用这些组件来构建功能丰富的应用程序。
Activity 生命周期详解
Activity 生命周期是 Android 开发中最重要的概念之一,它描述了 Activity 从创建到销毁的整个过程。理解生命周期对于正确处理资源管理、数据保存和用户体验至关重要。
完整的生命周期方法
-
onCreate()
- Activity 首次创建时调用
- 必须实现的方法,用于初始化基本组件
- 应该在此处调用
setContentView()
设置布局 - 接收
savedInstanceState
参数(可能为 null)
-
onStart()
- Activity 变为可见状态时调用
- 此时 Activity 还未出现在前台,不能与用户交互
- 适合初始化需要在 Activity 可见时运行的组件
-
onResume()
- Activity 进入前台并可与用户交互时调用
- 在此方法中恢复动画、摄像头等独占资源
- 应用的核心功能通常在此状态下运行
-
onPause()
- 当 Activity 开始失去焦点时调用
- 另一个 Activity 即将进入前台(如对话框或新 Activity)
- 应该在此保存持久性数据,停止动画等消耗资源操作
- 注意:不能执行耗时操作,否则会影响新 Activity 的显示
-
onStop()
- Activity 完全不可见时调用
- 新 Activity 已完全覆盖当前 Activity
- 释放不需要在 Activity 不可见时使用的资源
-
onDestroy()
- Activity 被销毁前调用
- 可能是用户主动关闭或系统为回收内存
- 清理所有资源,避免内存泄漏
-
onRestart()
- Activity 从停止状态重新启动时调用
- 在
onStop()
后且 Activity 再次显示前调用
特殊情况生命周期方法
-
onSaveInstanceState(Bundle outState)
- 在 Activity 可能被销毁前调用(如屏幕旋转)
- 用于保存临时状态到 Bundle 对象
- 数据会在
onCreate()
或onRestoreInstanceState()
中恢复
-
onRestoreInstanceState(Bundle savedInstanceState)
- 在
onStart()
之后调用 - 恢复之前通过
onSaveInstanceState()
保存的状态
- 在
生命周期图示
启动Activity → onCreate() → onStart() → onResume() → Activity运行中↑ ↓ onPause() ← ↓ onStop() ←| → onRestart() → onStart()└─────── onDestroy()
常见场景的生命周期变化
-
正常启动和退出
- onCreate() → onStart() → onResume()
- onPause() → onStop() → onDestroy()
-
按下Home键
- onPause() → onStop()
-
从后台返回
- onRestart() → onStart() → onResume()
-
屏幕旋转
- onPause() → onSaveInstanceState() → onStop() → onDestroy()
- onCreate() → onStart() → onRestoreInstanceState() → onResume()
理解并正确管理 Activity 生命周期是开发稳定、高效 Android 应用的基础。
Intent的setFlags(int flags)方法详解
Intent.setFlags(int flags)
是 Android 中用于控制 Activity 启动行为的重要方法,它通过设置各种标志(flags)来影响 Activity 的任务栈(Task)和启动模式。
常用标志(Flags)分类
1. 任务栈控制标志
FLAG_ACTIVITY_NEW_TASK (0x10000000)
- 作用:在新任务中启动 Activity
- 使用场景:
- 从 Service 或 BroadcastReceiver 启动 Activity 时必须使用
- 创建独立的任务栈
- 注意:如果已有该 Activity 的实例存在,会将该实例带到前台
FLAG_ACTIVITY_CLEAR_TASK (0x00008000)
- 作用:清除现有任务栈中的所有 Activity
- 配合使用:通常与 FLAG_ACTIVITY_NEW_TASK 一起使用
- 效果:新 Activity 将成为任务栈中唯一的 Activity
FLAG_ACTIVITY_CLEAR_TOP (0x04000000)
- 作用:如果目标 Activity 已在栈中,则清除它上面的所有 Activity
- 行为:
- 如果目标 Activity 在栈顶:直接使用现有实例
- 如果目标 Activity 在栈中但不在栈顶:销毁它上面的所有 Activity
- 常见用途:返回应用主界面
2. Activity 实例管理标志
FLAG_ACTIVITY_SINGLE_TOP (0x20000000)
- 作用:相当于 launchMode=“singleTop”
- 行为:如果目标 Activity 已在栈顶,则不会创建新实例,而是调用其
onNewIntent()
- 使用场景:防止重复创建相同的 Activity(如通知点击)
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS (0x00800000)
- 作用:Activity 不会出现在最近任务列表中
- 使用场景:敏感页面或临时页面
3. 任务栈历史管理标志
FLAG_ACTIVITY_NO_HISTORY (0x40000000)
- 作用:Activity 不会保留在任务栈中
- 行为:用户离开后,该 Activity 会被立即销毁
- 使用场景:临时中间页面(如登录页面)
FLAG_ACTIVITY_REORDER_TO_FRONT (0x00020000)
- 作用:如果 Activity 已在任务栈中,则将其移到栈顶而不创建新实例
- 行为:调用现有实例的
onNewIntent()
- 使用场景:重新激活已存在的 Activity
4. 其他常用标志
FLAG_ACTIVITY_NO_ANIMATION (0x00010000)
- 作用:禁用 Activity 切换动画
- 使用场景:需要无动画过渡时
FLAG_ACTIVITY_MULTIPLE_TASK (0x08000000)
- 作用:总是创建新任务,即使已有相同任务存在
- 配合使用:必须与 FLAG_ACTIVITY_NEW_TASK 一起使用
组合使用示例
// 示例1:清除整个任务栈并启动新的主Activity
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);// 示例2:单例模式启动Activity(如果已存在则调到前台)
Intent intent = new Intent(this, DetailActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);// 示例3:防止重复创建相同的Activity(类似singleTop)
Intent intent = new Intent(this, NotificationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
注意事项
- 标志可以通过
|
运算符组合使用 - 某些标志需要特定组合才能生效(如 FLAG_ACTIVITY_NEW_TASK)
- 这些标志会覆盖 Manifest 中设置的 launchMode
- 在 Android 5.0+ 中,任务栈行为有部分变化,需注意兼容性
- 过度使用标志可能导致任务栈管理混乱,应谨慎使用
理解这些标志对于控制应用导航流程和任务栈行为非常重要,合理使用可以创建更符合预期的用户体验。