1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| Android 提供 4 种启动模式,可以在 AndroidManifest.xml 的 <activity> 节点里配置 android:launchMode,也可以在启动时加 Intent 的 Flag 控制。
1. standard(标准模式,默认)
特性: 每次调用 startActivity() 都会新建一个 Activity 实例,压入任务栈顶部。
生命周期: 每次都是全新的实例,都会执行 onCreate()。
场景: 绝大多数页面,比如:商品详情页、设置页。
<activity android:name=".ui.activity.CheckDeviceActivity" android:launchMode="standard"/>
startActivity(new Intent(this, CheckDeviceActivity.class)); // 每次点都会创建新的 CheckDeviceActivity
2. singleTop(栈顶复用模式)
特性: 如果要启动的 Activity 已经在栈顶,则不会新建实例,而是复用已有实例,并回调 onNewIntent()。
生命周期: 不会走 onCreate(),而是走 onNewIntent()。
场景: 避免重复创建,比如:消息中心、搜索页。
<activity android:name=".ui.activity.NotificationActivity" android:launchMode="singleTop"/>
// 如果 NotificationActivity 已经在栈顶,就不会新建,只会回调 onNewIntent() startActivity(new Intent(this, NotificationActivity.class));
3. singleTask(栈内复用模式)
特性: 系统会查找任务栈中是否已有该 Activity 实例:
如果有 → 复用,并将它上面的所有 Activity 弹出(清空)。
如果没有 → 创建新实例。
生命周期: 复用时会回调 onNewIntent()。
场景: 入口类页面(如 App 首页、主界面),保证唯一性。
<activity android:name=".ui.activity.MainActivity" android:launchMode="singleTask"/>
// 无论从哪里启动 MainActivity,栈里只会保留一个 MainActivity 实例 startActivity(new Intent(this, MainActivity.class));
4. singleInstance(单实例模式)
特性: 该 Activity 会独占一个新的任务栈,且全局只有一个实例。
如果别的应用拉起它,也会共用同一个实例。
生命周期: 始终复用唯一实例。
场景: 系统级别的全局页面,比如:来电界面、锁屏界面。
<activity android:name=".ui.activity.CallActivity" android:launchMode="singleInstance"/>
// CallActivity 始终全局唯一,独立任务栈 startActivity(new Intent(this, CallActivity.class));
✅ 实际开发建议
一般页面 → 用默认 standard 就行。
避免重复打开的页面(如消息中心) → 用 singleTop。
保证唯一入口(如 MainActivity) → 用 singleTask。
特殊全局页面(如视频通话、锁屏) → 用 singleInstance。
|