0%

安卓四种启动模式

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。