• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=暂停和继续Activity
2page.tags=Activity生命周期
3helpoutsWidget=true
4
5trainingnavtop=true
6
7@jd:body
8
9<div id="tb-wrapper">
10  <div id="tb">
11
12    <h2>本课程将向您展示如何</h2>
13    <ol>
14      <li><a href="#Pause">暂停Activity</a></li>
15      <li><a href="#Resume">继续Activity</a></li>
16    </ol>
17
18    <h2>您还应阅读</h2>
19    <ul>
20      <li><a href="{@docRoot}guide/components/activities.html">Activity</a>
21      </li>
22    </ul>
23
24<h2>试一试</h2>
25
26<div class="download-box">
27 <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">下载演示</a>
28 <p class="filename">ActivityLifecycle.zip</p>
29</div>
30
31  </div>
32</div>
33
34<p>在正常使用应用的过程中,前台Activity有时会被其他导致Activity<em>暂停的可视组件阻挡</em>。
35例如,当半透明Activity打开时(比如对话框样式中的Activity),上一个Activity会暂停。
36只要Activity仍然部分可见但目前又未处于焦点之中,它会一直暂停。
37</p>
38
39<p>但是,一旦Activity完全被阻挡并且不可见,它便<em>停止</em>(将在下一堂课中讨论)。
40</p>
41
42<p>当您的Activity进入暂停状态时,系统会对您的 {@link android.app.Activity} 调用 {@link
43android.app.Activity#onPause onPause()} 方法,通过该方法,您可以停止不应在暂停时继续的进行之中的操作(比如视频)或保留任何应该永久保存的信息,以防用户坚持离开应用。如果用户从暂停状态返回到您的Activity,系统会重新开始该Activity并调用
44{@link android.app.Activity#onResume onResume()} 方法。
45
46
47</p>
48
49<p class="note"><strong>注意:</strong>当您的Activity收到对 {@link
50android.app.Activity#onPause()} 的调用时,可能意味着Activity将暂停
51一会,并且用户可能从焦点返回到您的Activity。但这通常意味着用户即将离开您的Activity。
52</p>
53
54<img src="{@docRoot}images/training/basics/basic-lifecycle-paused.png" />
55<p class="img-caption"><strong>图 1.</strong>当半透明Activity阻挡您的Activity时,系统会调用 {@link android.app.Activity#onPause onPause()} 并且Activity会在“暂停”状态下等待 (1)。
56
57如果用户在Activity仍然处于暂停状态时返回Activity,则系统会调用 {@link android.app.Activity#onResume onResume()} (2)。
58</p>
59
60
61<h2 id="Pause">暂停Activity</h2>
62
63<p>当系统为您的Activity调用 {@link android.app.Activity#onPause()} 时,它从技术角度看意味着您的Activity仍然处于部分可见状态,但往往说明用户即将离开Activity并且它很快就要进入“停止”状态。
64
65您通常应使用
66 {@link android.app.Activity#onPause()} 回调:</p>
67
68<ul>
69  <li>停止动画或其他可能消耗 CPU 的进行之中的操作。</li>
70  <li>提交未保存的更改,但仅当用户离开时希望永久性保存此类更改(比如电子邮件草稿)。
71</li>
72  <li>释放系统资源,比如广播接收器、传感器手柄(比如 GPS) 或当您的Activity暂停且用户不需要它们时仍然可能影响电池寿命的任何其他资源。
73
74</li>
75</ul>
76
77<p>例如,如果您的应用使用 {@link android.hardware.Camera},
78{@link android.app.Activity#onPause()} 方法是释放它的好位置。</p>
79
80<pre>
81&#64;Override
82public void onPause() {
83    super.onPause();  // Always call the superclass method first
84
85    // Release the Camera because we don't need it when paused
86    // and other activities might need to use it.
87    if (mCamera != null) {
88        mCamera.release()
89        mCamera = null;
90    }
91}
92</pre>
93
94<p>一般情况下,您<strong>不得</strong>使用 {@link android.app.Activity#onPause()} 永久性存储用户更改(比如输入表格的个人信息)。
95只有在您确定用户希望自动保存这些更改的情况(比如,电子邮件草稿)下,才能在 {@link android.app.Activity#onPause()}中永久性存储用户更改。但您应避免在 {@link
96android.app.Activity#onPause()} 期间执行 CPU 密集型工作,比如向数据库写入信息,因为这会拖慢向下一Activity过渡的过程(您应改为在
97{@link android.app.Activity#onStop onStop()}期间执行高负载关机操作。
98
99
100
101</p>
102
103<p>您应通过相对简单的方式在 {@link android.app.Activity#onPause
104onPause()} 方法中完成大量操作,这样才能加快在您的Activity确实停止的情况下用户向下一个目标过渡的速度。
105</p>
106
107<p class="note"><strong>注意:</strong>当您的Activity暂停时,{@link
108android.app.Activity} 实例将驻留在内存中并且在Activity继续时被再次调用。您无需重新初始化在执行任何导致进入“继续”状态的回调方法期间创建的组件。
109
110</p>
111
112
113
114<h2 id="Resume">继续Activity</h2>
115
116<p>当用户从“暂停”状态继续您的Activity时,系统会调用 {@link
117android.app.Activity#onResume()} 方法。</p>
118
119<p>请注意,每当您的Activity进入前台时系统便会调用此方法,包括它初次创建之时。
120同样地,您应实现{@link
121android.app.Activity#onResume()} 初始化您在 {@link
122android.app.Activity#onPause()} 期间释放的组件并且执行每当Activity进入“继续”状态时必须进行的任何其他初始化操作(比如开始动画和初始化只在Activity具有用户焦点时使用的组件)。
123
124</p>
125
126<p>{@link android.app.Activity#onResume()} 的以下示例对应于以上的
127 {@link android.app.Activity#onPause()} 示例,因此它初始化Activity暂停时释放的照相机。
128</p>
129
130<pre>
131&#64;Override
132public void onResume() {
133    super.onResume();  // Always call the superclass method first
134
135    // Get the Camera instance as the activity achieves full user focus
136    if (mCamera == null) {
137        initializeCamera(); // Local method to handle camera init
138    }
139}
140</pre>
141
142
143
144
145
146
147
148