• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Các hoạt động
2page.tags=hoạt động,ý định
3@jd:body
4
5<div id="qv-wrapper">
6<div id="qv">
7<h2>Trong tài liệu này</h2>
8<ol>
9  <li><a href="#Creating">Tạo một Hoạt động</a>
10    <ol>
11      <li><a href="#UI">Triển khai một giao diện người dùng</a></li>
12      <li><a href="#Declaring">Khai báo hoạt động trong bản kê khai</a></li>
13    </ol>
14  </li>
15  <li><a href="#StartingAnActivity">Bắt đầu một Hoạt động</a>
16    <ol>
17      <li><a href="#StartingAnActivityForResult">Bắt đầu một hoạt động cho một kết quả</a></li>
18    </ol>
19  </li>
20  <li><a href="#ShuttingDown">Tắt một Hoạt động</a></li>
21  <li><a href="#Lifecycle">Quản lý Vòng đời của Hoạt động</a>
22    <ol>
23      <li><a href="#ImplementingLifecycleCallbacks">Triển khai gọi lại vòng đời</a></li>
24      <li><a href="#SavingActivityState">Lưu trạng thái của hoạt động</a></li>
25      <li><a href="#ConfigurationChanges">Xử lý thay đổi về cấu hình</a></li>
26      <li><a href="#CoordinatingActivities">Điều phối hoạt động</a></li>
27    </ol>
28  </li>
29</ol>
30
31<h2>Lớp khóa</h2>
32<ol>
33  <li>{@link android.app.Activity}</li>
34</ol>
35
36<h2>Xem thêm</h2>
37<ol>
38  <li><a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tác vụ và Ngăn
39Xếp</a></li>
40</ol>
41
42</div>
43</div>
44
45
46
47<p>{@link android.app.Activity} là một thành phần ứng dụng cung cấp một màn hình mà với nó
48người dùng có thể tương tác để thực hiện một điều gì đó, chẳng hạn như quay số điện thoại, chụp ảnh, gửi e-mail hoặc
49xem bản đồ. Mỗi hoạt động được cho trong một cửa sổ là nơi để vẽ giao diện người dùng của nó. Cửa sổ này
50thường lấp đầy màn hình, nhưng có thể nhỏ hơn màn hình và nổi bên trên các cửa sổ
51khác.</p>
52
53<p> Ứng dụng thường bao gồm nhiều hoạt động được liên kết lỏng lẻo
54với nhau. Thường thì một hoạt động trong một ứng dụng sẽ được quy định là hoạt động "chính", nó được
55trình bày trước người dùng khi khởi chạy ứng dụng lần đầu. Sau đó, mỗi
56hoạt động có thể bắt đầu một hoạt động khác để thực hiện các hành động khác nhau. Mỗi khi một hoạt động
57mới bắt đầu, hoạt động trước đó sẽ bị dừng lại, nhưng hệ thống vẫn giữ nguyên hoạt động
58trong một ngăn xếp ("back stack"). Khi một hoạt động mới bắt đầu, nó được đẩy lên ngăn xếp và
59chiếm lấy tiêu điểm của người dùng. Ngăn xếp sẽ tuân theo cơ chế xếp chồng cơ bản "vào cuối, ra đầu",
60vì thế, khi người dùng kết thúc hoạt động hiện tại và nhấn nút <em>Quay lại</em>, nó
61sẽ được đẩy ra khỏi ngăn xếp (và bị hủy) và hoạt động trước đó sẽ tiếp tục. (Ngăn xếp được
62đề cập kỹ hơn trong tài liệu <a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tác vụ
63và Ngăn Xếp</a>.)</p>
64
65<p>Khi một hoạt động bị dừng vì một hoạt động mới bắt đầu, nó được thông báo về sự thay đổi trạng thái này
66qua các phương pháp gọi lại vòng đời của hoạt động.
67Có một vài phương pháp gọi lại vòng đời mà một hoạt động có thể nhận, do một thay đổi về
68trạng thái của nó&mdash;dù hệ thống đang tạo, dừng hay tiếp tục nó, hay hủy nó&mdash;và
69mỗi lần gọi lại cho bạn cơ hội thực hiện công việc cụ thể
70phù hợp với sự thay đổi trạng thái đó. Ví dụ, khi bị dừng, hoạt động của bạn sẽ giải phóng mọi
71đối tượng lớn, chẳng hạn như các kết nối mạng hoặc cơ sở dữ liệu. Khi hoạt động tiếp tục, bạn có thể
72thu lại những tài nguyên cần thiết và tiếp tục những hành động bị gián đoạn. Những chuyển tiếp trạng thái này
73đều là một phần của vòng đời hoạt động.</p>
74
75<p>Phần còn lại của tài liệu này bàn đến những nội dung cơ bản về cách xây dựng và sử dụng một hoạt động,
76bao gồm một nội dung đề cập đầy đủ về cách vận hành của vòng đời hoạt động, để bạn có thể quản lý tốt
77sự chuyển tiếp giữa các trạng thái hoạt động khác nhau.</p>
78
79
80
81<h2 id="Creating">Tạo một Hoạt động</h2>
82
83<p>Để tạo một hoạt động, bạn phải tạo một lớp con của {@link android.app.Activity} (hoặc
84một lớp con hiện tại của nó). Trong lớp con của mình, bạn cần triển khai các phương pháp gọi lại mà hệ thống
85gọi khi hoạt động chuyển tiếp giữa các trạng thái khác nhau trong vòng đời, chẳng hạn như khi
86hoạt động đang được tạo, dừng, tiếp tục, hoặc hủy. Hai phương pháp gọi lại quan trọng nhất
87là:</p>
88
89<dl>
90  <dt>{@link android.app.Activity#onCreate onCreate()}</dt>
91  <dd>Bạn phải triển khai phương pháp này. Hệ thống gọi phương pháp này khi tạo hoạt động
92của bạn. Trong quá trình thực hiện của mình, bạn nên khởi chạy những thành phần thiết yếu cho hoạt động
93của mình.
94    Quan trọng nhất, đây là lúc bạn phải gọi {@link android.app.Activity#setContentView
95    setContentView()} để định nghĩa bố trí cho giao diện người dùng của hoạt động.</dd>
96  <dt>{@link android.app.Activity#onPause onPause()}</dt>
97  <dd>Hệ thống gọi phương pháp này là dấu hiệu đầu tiên về việc người dùng đang rời khỏi hoạt động
98của bạn (mặc dù không phải lúc nào cũng có nghĩa rằng hoạt động đang bị hủy). Trường hợp này thường là khi bạn
99định thực hiện bất kỳ thay đổi nào vẫn cần có hiệu lực ngoài phiên của người dùng hiện thời (vì
100người dùng có thể không quay lại).</dd>
101</dl>
102
103<p>Có một vài phương pháp gọi lại vòng đời khác mà bạn nên sử dụng để đem đến
104một trải nghiệm người dùng mượt mà giữa các hoạt động và xử lý những gián đoạn bất ngờ khiến hoạt động của bạn
105bị dừng và thậm chí bị hủy. Tất cả phương pháp gọi lại vòng đời được bàn sau trong phần
106nói về <a href="#Lifecycle">Quản lý Vòng đời của Hoạt động</a>.</p>
107
108
109
110<h3 id="UI">Triển khai một giao diện người dùng</h3>
111
112<p> Giao diện người dùng cho một hoạt động sẽ được cung cấp theo phân cấp dạng xem&mdash;đối tượng được suy ra
113từ lớp {@link android.view.View}.  Mỗi chế độ xem kiểm soát một không gian chữ nhật riêng
114trong cửa sổ của hoạt động và có thể phản hồi trước tương tác của người dùng. Ví dụ, chế độ xem có thể là
115một nút khởi xướng một hành động khi người dùng chạm vào nó.</p>
116
117<p>Android cung cấp nhiều chế độ xem sẵn có mà bạn có thể sử dụng để thiết kế và tổ chức cho bố trí
118của mình. "Widget" là những chế độ xem cung cấp những phần tử trực quan (và tương tác) cho màn hình, chẳng hạn như
119nút, trường văn bản, hộp kiểm, hay chỉ là một hình ảnh. "Bố trí" là những chế độ xem được suy ra từ {@link
120android.view.ViewGroup} cung cấp một mô hình bố trí duy nhất cho các chế độ xem con của nó, chẳng hạn như bố trí
121tuyến tính, bố trí lưới, hoặc bố trí tương đối. Bạn cũng có thể chia thành lớp con {@link android.view.View} và các lớp
122{@link android.view.ViewGroup} (hoặc các lớp con hiện tại) để tạo widget và
123bố trí của chính mình và áp dụng chúng vào bố trí hoạt động của bạn.</p>
124
125<p>Cách phổ biến nhất để định nghĩa một bố trí bằng cách sử dụng các chế độ xem là dùng một tệp bố trí XML được lưu trong tài nguyên ứng dụng
126của bạn. Bằng cách này, bạn có thể duy trì thiết kế giao diện người dùng của mình độc lập với
127mã nguồn định nghĩa hành vi của hoạt động. Bạn có thể đặt bố trí làm UI cho hoạt động
128của mình bằng {@link android.app.Activity#setContentView(int) setContentView()}, chuyển
129ID tài nguyên cho bố trí. Tuy nhiên, bạn cũng có thể tạo {@link android.view.View} mới trong mã hoạt động
130của mình và xây dựng một cấp bậc chế độ xem bằng cách chèn các {@link
131android.view.View} mới vào một {@link android.view.ViewGroup}, sau đó sử dụng bố trí đó bằng cách chuyển root
132{@link android.view.ViewGroup} sang {@link android.app.Activity#setContentView(View)
133setContentView()}.</p>
134
135<p>Để biết thông tin về việc tạo một giao diện người dùng, hãy xem tài liệu <a href="{@docRoot}guide/topics/ui/index.html">Giao diện Người dùng</a>.</p>
136
137
138
139<h3 id="Declaring">Khai báo hoạt động trong bản kê khai</h3>
140
141<p>Bạn phải khai báo hoạt động của mình trong tệp bản kê khai để hoạt động
142có thể truy cập được vào hệ thống. Để khai báo hoạt động của mình, hãy mở tệp bản kê khai của bạn và thêm một phần tử  <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a>
143làm con của phần tử <a href="{@docRoot}guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a>
144. Ví dụ:</p>
145
146<pre>
147&lt;manifest ... &gt;
148  &lt;application ... &gt;
149      &lt;activity android:name=".ExampleActivity" /&gt;
150      ...
151  &lt;/application ... &gt;
152  ...
153&lt;/manifest &gt;
154</pre>
155
156<p>Có vài thuộc tính khác mà bạn có thể nêu trong phần tử này, để định nghĩa các thuộc tính
157như nhãn cho hoạt động, biểu tượng cho hoạt động, hoặc chủ đề mô tả kiểu UI của
158hoạt động. Thuộc tính <a href="{@docRoot}guide/topics/manifest/activity-element.html#nm">{@code android:name}</a>
159là thuộc tính bắt buộc duy nhất&mdash;nó quy định tên lớp của hoạt động. Một khi
160bạn phát hành ứng dụng của mình, bạn không nên thay đổi tên này, vì nếu bạn làm vậy, bạn có thể làm hỏng
161một số tính năng, chẳng hạn như các lối tắt của ứng dụng (hãy đọc bài đăng trên blog, <a href="http://android-developers.blogspot.com/2011/06/things-that-cannot-change.html">Những Điều
162Không Thay Đổi Được</a>).</p>
163
164<p>Xem tài liệu tham khảo phần tử <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a>
165để biết thêm thông tin về việc khai báo hoạt động của bạn trong bản kê khai.</p>
166
167
168<h4>Sử dụng các bộ lọc ý định</h4>
169
170<p>Một phần tử <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
171&lt;activity&gt;}</a> cũng có thể quy định các bộ lọc ý định khác nhau&mdash;bằng cách sử dụng phần tử <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
172&lt;intent-filter&gt;}</a> &mdash;để khai báo cách thức mà các thành phần khác của ứng dụng có thể
173kích hoạt nó.</p>
174
175<p>Khi bạn tạo một ứng dụng mới bằng cách sử dụng các công cụ SDK của Android, hoạt động chương trình nhỏ
176được tạo cho bạn sẽ tự động bao gồm một bộ lọc ý định khai báo hoạt động
177phản hồi lại hành động "chính" và nên được đặt trong thể loại "trình khởi chạy". Bộ lọc ý định
178trông như thế này:</p>
179
180<pre>
181&lt;activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"&gt;
182    &lt;intent-filter&gt;
183        &lt;action android:name="android.intent.action.MAIN" /&gt;
184        &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
185    &lt;/intent-filter&gt;
186&lt;/activity&gt;
187</pre>
188
189<p>Phần tử <a href="{@docRoot}guide/topics/manifest/action-element.html">{@code
190&lt;action&gt;}</a> quy định rằng đây là điểm mục nhập "chính" đối với ứng dụng. Phần tử <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code
191&lt;category&gt;}</a> quy định rằng hoạt động này nên được liệt kê trong trình khởi chạy ứng dụng của hệ thống
192(để cho phép người dùng khởi chạy hoạt động này).</p>
193
194<p>Nếu bạn có ý định cho ứng dụng của mình được độc lập và không cho phép các ứng dụng khác
195kích hoạt các hoạt động của nó, vậy bạn không cần bất kỳ bộ lọc ý định nào khác. Chỉ một hoạt động nên có
196hành động "chính" và thể loại "trình khởi chạy" như trong ví dụ trước. Những hoạt động mà
197bạn không muốn cung cấp sẵn cho các ứng dụng khác không nên có bộ lọc ý định và bạn có thể
198tự mình bắt đầu chúng bằng cách sử dụng các ý định rõ ràng (như được đề cập trong phần sau).</p>
199
200<p>Tuy nhiên, nếu bạn muốn hoạt động của mình phản hồi lại những ý định ngầm mà được chuyển giao từ
201các ứng dụng khác (và chính bạn), thì bạn phải định nghĩa các bộ lọc ý định bổ sung cho hoạt động
202của mình. Với mỗi loại ý định mà bạn muốn phản hồi, bạn phải nêu một <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
203&lt;intent-filter&gt;}</a> bao gồm một phần tử
204<a href="{@docRoot}guide/topics/manifest/action-element.html">{@code
205&lt;action&gt;}</a> và, không bắt buộc, một phần tử <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code
206&lt;category&gt;}</a> và/hoặc một phần tử <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code
207&lt;data&gt;}</a>. Những phần tử này quy định loại ý định mà hoạt động của bạn có thể
208phản hồi.</p>
209
210<p>Để biết thêm thông tin về cách thức các hoạt động của bạn có thể phản hồi lại ý định, hãy xem tài liệu <a href="{@docRoot}guide/components/intents-filters.html">Ý định và Bộ lọc Ý định</a>
211.</p>
212
213
214
215<h2 id="StartingAnActivity">Bắt đầu một Hoạt động</h2>
216
217<p>Bạn có thể bắt đầu một hoạt động khác bằng cách gọi {@link android.app.Activity#startActivity
218  startActivity()}, chuyển cho nó một {@link android.content.Intent} mà mô tả hoạt động bạn
219muốn bắt đầu. Ý định này sẽ quy định hoặc hoạt động chính xác mà bạn muốn bắt đầu hoặc mô tả
220 loại hành động mà bạn muốn thực hiện (và hệ thống lựa chọn hoạt động phù hợp cho bạn,
221thậm chí
222có thể từ một ứng dụng khác). Một ý định cũng có thể mang theo lượng nhỏ dữ liệu sẽ được
223 sử dụng bởi hoạt động được bắt đầu.</p>
224
225<p>Khi đang làm việc trong ứng dụng của chính mình, bạn thường sẽ cần khởi chạy một hoạt động đã biết.
226 Bạn có thể làm vậy bằng cách tạo một ý định trong đó quy định rõ hoạt động bạn muốn bắt đầu,
227sử dụng tên lớp đó. Ví dụ, sau đây là cách một hoạt động bắt đầu một hoạt động khác có tên {@code
228SignInActivity}:</p>
229
230<pre>
231Intent intent = new Intent(this, SignInActivity.class);
232startActivity(intent);
233</pre>
234
235<p>Tuy nhiên, ứng dụng của bạn cũng có thể muốn thực hiện một số hành động, chẳng hạn như gửi một e-mail, tin nhắn
236 văn bản, hoặc cập nhật trạng thái, bằng cách sử dụng dữ liệu từ hoạt động của bạn. Trong trường hợp này, ứng dụng của bạn có thể
237 không có các hoạt động của chính nó để thực hiện những hành động đó, vì vậy, thay vào đó, bạn có thể tận dụng những hoạt động
238 được cung cấp bởi các ứng dụng khác trên thiết bị mà có thể thực hiện hành động cho bạn. Đây là lúc
239ý định thực sự có giá trị&mdash;bạn có thể tạo một ý định mô tả một hành động bạn muốn
240thực hiện và hệ thống
241 sẽ khởi chạy hoạt động phù hợp đó từ một ứng dụng khác. Nếu có
242 nhiều hoạt động mà có thể xử lý ý định, vậy người dùng có thể chọn hoạt động nào sẽ sử dụng. Ví
243 dụ, nếu bạn muốn cho phép người dùng gửi e-mail, bạn có thể tạo
244 ý định sau:</p>
245
246<pre>
247Intent intent = new Intent(Intent.ACTION_SEND);
248intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
249startActivity(intent);
250</pre>
251
252<p>{@link android.content.Intent#EXTRA_EMAIL} phụ được thêm vào ý định là một mảng xâu của
253 các địa chỉ e-mail mà e-mail sẽ được gửi tới. Khi một ứng dụng e-mail phản hồi
254 ý định này, nó đọc mảng xâu được cung cấp trong phần phụ và đặt nó vào trường "đến" của mẫu soạn thảo
255 e-mail. Trong trường hợp này, hoạt động của ứng dụng e-mail bắt đầu và khi người dùng
256 làm xong, hoạt động của bạn sẽ tiếp tục.</p>
257
258
259
260
261<h3 id="StartingAnActivityForResult">Bắt đầu một hoạt động cho một kết quả</h3>
262
263<p>Đôi khi bạn có thể muốn nhận được một kết quả từ hoạt động mà bạn bắt đầu. Trong trường hợp đó,
264hãy bắt đầu hoạt động bằng cách gọi {@link android.app.Activity#startActivityForResult
265  startActivityForResult()} (thay vì {@link android.app.Activity#startActivity
266  startActivity()}). Rồi để nhận được kết quả từ hoạt động
267sau đó, hãy triển khai phương pháp gọi lại {@link android.app.Activity#onActivityResult onActivityResult()}
268. Khi hoạt động sau đó diễn ra xong, nó trả về một kết quả trong một {@link
269android.content.Intent} cho phương pháp {@link android.app.Activity#onActivityResult onActivityResult()}
270của bạn.</p>
271
272<p>Ví dụ, bạn có thể muốn người dùng chọn một trong các liên lạc của họ, vì vậy hoạt động của bạn có thể
273làm gì đó với thông tin trong liên lạc đó. Đây là cách bạn có thể tạo một ý định như vậy và
274xử lý kết quả:</p>
275
276<pre>
277private void pickContact() {
278    // Create an intent to "pick" a contact, as defined by the content provider URI
279    Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
280    startActivityForResult(intent, PICK_CONTACT_REQUEST);
281}
282
283&#64;Override
284protected void onActivityResult(int requestCode, int resultCode, Intent data) {
285    // If the request went well (OK) and the request was PICK_CONTACT_REQUEST
286    if (resultCode == Activity.RESULT_OK &amp;&amp; requestCode == PICK_CONTACT_REQUEST) {
287        // Perform a query to the contact's content provider for the contact's name
288        Cursor cursor = getContentResolver().query(data.getData(),
289        new String[] {Contacts.DISPLAY_NAME}, null, null, null);
290        if (cursor.moveToFirst()) { // True if the cursor is not empty
291            int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
292            String name = cursor.getString(columnIndex);
293            // Do something with the selected contact's name...
294        }
295    }
296}
297</pre>
298
299<p>Ví dụ này thể hiện lô-gic cơ bản mà bạn sẽ sử dụng trong phương pháp {@link
300android.app.Activity#onActivityResult onActivityResult()} của mình để xử lý một
301kết quả hoạt động. Điều kiện đầu tiên kiểm tra xem yêu cầu có thành công không&mdash;nếu có thì
302{@code resultCode} sẽ là {@link android.app.Activity#RESULT_OK}&mdash;và liệu yêu cầu
303mà kiểm tra này đang phản hồi có được biết hay không&mdash;trong trường hợp này, {@code requestCode} phù hợp với
304tham số thứ hai được gửi bằng {@link android.app.Activity#startActivityForResult
305startActivityForResult()}. Từ đó, mã xử lý kết quả hoạt động bằng cách truy vấn
306dữ liệu được trả về trong {@link android.content.Intent} (tham số {@code data}).</p>
307
308<p>Điều xảy ra đó là, {@link
309android.content.ContentResolver} sẽ thực hiện một truy vấn đối với nhà cung cấp nội dung, truy vấn này trả về một
310{@link android.database.Cursor} cho phép đọc dữ liệu được truy vấn. Để biết thêm thông tin, hãy xem tài liệu
311<a href="{@docRoot}guide/topics/providers/content-providers.html">Trình cung cấp Nội dung</a>.</p>
312
313<p>Để biết thêm thông tin về việc sử dụng ý định, hãy xem tài liệu <a href="{@docRoot}guide/components/intents-filters.html">Ý định và Bộ lọc
314Ý định</a>.</p>
315
316
317<h2 id="ShuttingDown">Tắt một Hoạt động</h2>
318
319<p>Bạn có thể tắt một hoạt động bằng cách gọi phương pháp {@link android.app.Activity#finish
320finish()} của nó. Bạn cũng có thể tắt một hoạt động riêng mà trước đó bạn đã bắt đầu bằng cách gọi
321{@link android.app.Activity#finishActivity finishActivity()}.</p>
322
323<p class="note"><strong>Lưu ý:</strong> Trong hầu hết trường hợp, bạn không nên kết thúc một hoạt động một cách rõ ràng
324bằng cách sử dụng những phương pháp này. Như đề cập trong phần sau về vòng đời của hoạt động, hệ thống
325Android quản lý tuổi thọ của một hoạt động cho bạn, vì vậy bạn không cần kết thúc các hoạt động
326của chính mình. Việc gọi những phương pháp này có thể ảnh hưởng tiêu cực tới trải nghiệm người dùng
327kỳ vọng và chỉ nên được sử dụng khi bạn tuyệt đối không muốn người dùng quay lại thực thể này của
328hoạt động.</p>
329
330
331<h2 id="Lifecycle">Quản lý Vòng đời của Hoạt động</h2>
332
333<p>Việc quản lý vòng đời các hoạt động của bạn bằng cách triển khai các phương pháp gọi lại
334rất quan trọng đối với việc xây dựng một ứng dụng mạnh
335và linh hoạt. Vòng đời của một hoạt động trực tiếp bị ảnh hưởng bởi sự liên kết giữa nó với
336các hoạt động khác, tác vụ của nó và ngăn xếp (back stack).</p>
337
338<p>Về cơ bản, một hoạt động có thể tồn tại ở ba trạng thái:</p>
339
340<dl>
341  <dt><i>Tiếp tục</i></dt>
342    <dd>Hoạt động ở tiền cảnh của màn hình và có tiêu điểm của người dùng. (Trạng thái này
343đôi khi cũng được gọi là "đang chạy".)</dd>
344
345  <dt><i>Tạm dừng</i></dt>
346    <dd>Một hoạt động khác ở tiền cảnh và có tiêu điểm, nhưng hoạt động này vẫn hiển thị. Cụ thể,
347một hoạt động khác hiển thị ở trên hoạt động này và hoạt động đó trong suốt một phần hoặc không
348che toàn bộ màn hình. Trạng thái tạm dừng hoàn toàn đang hoạt động (đối tượng {@link android.app.Activity}
349được giữ lại trong bộ nhớ, nó duy trì tất cả thông tin về trạng thái và thành viên, và vẫn gắn với
350trình quản lý cửa sổ), nhưng có thể bị hệ thống tắt bỏ trong trường hợp bộ nhớ cực kỳ thấp.</dd>
351
352  <dt><i>Dừng</i></dt>
353    <dd>Hoạt động bị che khuất hoàn toàn bởi một hoạt động khác (hoạt động hiện đang
354“dưới nền"). Hoạt động dừng cũng vẫn đang hoạt động ({@link android.app.Activity}
355đối tượng được giữ lại trong bộ nhớ, nó duy trì tất cả thông tin về trạng thái và thành viên, nhưng <em>không</em>
356gắn với trình quản lý cửa sổ). Tuy nhiên, hoạt động không còn hiển thị với người dùng nữa và hệ thống
357có thể tắt bỏ hoạt động này khi cần bộ nhớ ở nơi khác.</dd>
358</dl>
359
360<p>Nếu một hoạt động bị tạm dừng hoặc dừng, hệ thống có thể bỏ nó khỏi bộ nhớ hoặc bằng cách yêu cầu nó
361kết thúc (gọi phương pháp {@link android.app.Activity#finish finish()} của nó), hoặc đơn giản là tắt bỏ tiến trình
362của hoạt động.  Khi hoạt động được mở lại (sau khi bị kết thúc hoặc tắt bỏ), nó phải được tạo
363lại hoàn toàn.</p>
364
365
366
367<h3 id="ImplementingLifecycleCallbacks">Triển khai gọi lại vòng đời</h3>
368
369<p>Khi một hoạt động chuyển tiếp vào ra các trạng thái khác nhau nêu trên, nó được thông báo
370thông qua các phương pháp gọi lại. Tất cả phương pháp gọi lại đều là những móc (hook) mà bạn
371có thể khống chế để làm công việc phù hợp khi trạng thái hoạt động của bạn thay đổi. Hoạt động khung sau
372bao gồm từng phương pháp trong các phương pháp vòng đời cơ bản:</p>
373
374
375<pre>
376public class ExampleActivity extends Activity {
377    &#64;Override
378    public void {@link android.app.Activity#onCreate onCreate}(Bundle savedInstanceState) {
379        super.onCreate(savedInstanceState);
380        // The activity is being created.
381    }
382    &#64;Override
383    protected void {@link android.app.Activity#onStart onStart()} {
384        super.onStart();
385        // The activity is about to become visible.
386    }
387    &#64;Override
388    protected void {@link android.app.Activity#onResume onResume()} {
389        super.onResume();
390        // The activity has become visible (it is now "resumed").
391    }
392    &#64;Override
393    protected void {@link android.app.Activity#onPause onPause()} {
394        super.onPause();
395        // Another activity is taking focus (this activity is about to be "paused").
396    }
397    &#64;Override
398    protected void {@link android.app.Activity#onStop onStop()} {
399        super.onStop();
400        // The activity is no longer visible (it is now "stopped")
401    }
402    &#64;Override
403    protected void {@link android.app.Activity#onDestroy onDestroy()} {
404        super.onDestroy();
405        // The activity is about to be destroyed.
406    }
407}
408</pre>
409
410<p class="note"><strong>Lưu ý:</strong> Việc bạn triển khai những phương pháp vòng đời này phải luôn
411gọi triển khai siêu lớp trước khi làm bất kỳ công việc nào, như minh họa trong các ví dụ bên trên.</p>
412
413<p>Cùng nhau, những phương pháp này định nghĩa toàn bộ vòng đời của một hoạt động. Bằng việc triển khai những phương pháp
414này, bạn có thể theo dõi ba vòng lặp lồng nhau trong vòng đời của hoạt động: </p>
415
416<ul>
417<li><b>Toàn bộ vòng đời</b> của một hoạt động sẽ xảy ra từ thời điểm lệnh gọi đến {@link
418android.app.Activity#onCreate onCreate()} cho tới thời điểm lệnh gọi đến {@link
419android.app.Activity#onDestroy}. Hoạt động của bạn nên thực hiện thiết lập
420trạng thái "chung" (chẳng hạn như định nghĩa bố trí) trong {@link android.app.Activity#onCreate onCreate()}, và
421giải phóng tất cả tài nguyên còn lại trong {@link android.app.Activity#onDestroy}. Ví dụ, nếu hoạt động của bạn
422có một luồng đang chạy ngầm để tải xuống dữ liệu từ mạng, nó có thể tạo
423luồng đó trong {@link android.app.Activity#onCreate onCreate()} rồi dừng luồng trong {@link
424android.app.Activity#onDestroy}.</li>
425
426<li><p><b>Vòng đời hiển thị</b> của một hoạt động xảy ra từ thời điểm lệnh gọi đến {@link
427android.app.Activity#onStart onStart()} cho tới lệnh gọi đến {@link
428android.app.Activity#onStop onStop()}. Trong thời gian này, người dùng có thể thấy hoạt động
429trên màn hình và tương tác với nó. Ví dụ, {@link android.app.Activity#onStop onStop()} được gọi
430khi một hoạt động mới bắt đầu và không còn hiển thị nữa. Giữa hai phương pháp này, bạn có thể
431duy trì các tài nguyên cần để cho người dùng thấy hoạt động. Ví dụ, bạn có thể đăng ký một
432{@link android.content.BroadcastReceiver} trong {@link
433android.app.Activity#onStart onStart()} để theo dõi các thay đổi tác động tới UI của mình, và bỏ đăng ký
434nó trong {@link android.app.Activity#onStop onStop()} khi người dùng không còn thấy thứ bạn đang
435hiển thị nữa. Hệ thống có thể gọi {@link android.app.Activity#onStart onStart()} và {@link
436android.app.Activity#onStop onStop()} nhiều lần trong suốt vòng đời của hoạt động, khi đó
437hoạt động luân chuyển giữa trạng thái hiển thị và ẩn với người dùng.</p></li>
438
439<li><p><b>Vòng đời ở tiền cảnh</b> của một hoạt động xảy ra từ thời điểm lệnh gọi đến {@link
440android.app.Activity#onResume onResume()} cho tới thời điểm lệnh gọi đến {@link android.app.Activity#onPause
441onPause()}. Trong thời gian này, hoạt động sẽ ở phía trước tất cả hoạt động khác trên màn hình và có
442tiêu điểm đầu vào của người dùng.  Hoạt động có thể thường xuyên chuyển tiếp vào và ra tiền cảnh&mdash;ví
443dụ, {@link android.app.Activity#onPause onPause()} được gọi khi thiết bị vào trạng thái ngủ hoặc
444khi một hộp thoại xuất hiện. Vì trạng thái này có thể chuyển tiếp thường xuyên, mã trong hai phương pháp này nên
445tương đối nhẹ để tránh chuyển tiếp chậm khiến người dùng phải đợi.</p></li>
446</ul>
447
448<p>Hình 1 minh họa những vòng lặp này và các đường dẫn mà một hoạt động có thể diễn ra giữa các trạng thái.
449Hình chữ nhật đại diện cho các phương pháp gọi lại bạn có thể triển khai để thực hiện thao tác khi
450hoạt động chuyển tiếp giữa những trạng thái này. <p>
451
452<img src="{@docRoot}images/activity_lifecycle.png" alt="" />
453<p class="img-caption"><strong>Hình 1.</strong> Vòng đời của hoạt động.</p>
454
455<p>Những phương pháp gọi lại vòng đời này cũng được liệt kê trong bảng 1, trong đó mô tả từng phương pháp
456gọi lại một cách chi tiết hơn và xác định từng phương pháp
457trong vòng đời tổng thể của hoạt động, bao gồm việc hệ thống có thể tắt bỏ hoạt động hay không sau khi
458phương pháp gọi lại hoàn tất.</p>
459
460<p class="table-caption"><strong>Bảng 1.</strong> Tóm tắt các phương pháp gọi lại
461trong vòng đời của hoạt động.</p>
462
463<table border="2" width="85%" frame="hsides" rules="rows">
464<colgroup align="left" span="3"></colgroup>
465<colgroup align="left"></colgroup>
466<colgroup align="center"></colgroup>
467<colgroup align="center"></colgroup>
468
469<thead>
470<tr><th colspan="3">Phương pháp</th> <th>Mô tả</th> <th>Có thể tắt bỏ sau?</th> <th>Tiếp theo</th></tr>
471</thead>
472
473<tbody>
474<tr>
475  <td colspan="3" align="left"><code>{@link android.app.Activity#onCreate onCreate()}</code></td>
476  <td>Được gọi khi hoạt động mới được tạo.
477      Đây là lúc bạn nên thực hiện tất cả thiết lập cố định thông thường của mình &mdash;
478      tạo chế độ xem, kết ghép dữ liệu với danh sách, v.v.  Phương pháp này được chuyển cho
479      một đối tượng Gói chứa trạng thái trước đây của hoạt động, nếu trạng thái
480      đó được thu lại (xem phần <a href="#actstate">Lưu Trạng thái Hoạt động</a>,
481      ở đoạn sau).
482      <p>Luôn được theo sau bởi {@code onStart()}.</p></td>
483  <td align="center">Không</td>
484      <td align="center">{@code onStart()}</td>
485</tr>
486
487<tr>
488   <td rowspan="5" style="border-left: none; border-right: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
489   <td colspan="2" align="left"><code>{@link android.app.Activity#onRestart
490onRestart()}</code></td>
491   <td>Được gọi sau khi hoạt động đã được dừng, ngay trước khi hoạt động được
492       bắt đầu lại.
493       <p>Luôn được theo sau bởi {@code onStart()}</p></td>
494   <td align="center">Không</td>
495   <td align="center">{@code onStart()}</td>
496</tr>
497
498<tr>
499   <td colspan="2" align="left"><code>{@link android.app.Activity#onStart onStart()}</code></td>
500   <td>Được gọi ngay trước khi hoạt động hiển thị trước người dùng.
501       <p>Được theo sau bởi {@code onResume()} nếu hoạt động vào
502       tiền cảnh, hoặc {@code onStop()} nếu hoạt động bị ẩn.</p></td>
503    <td align="center">Không</td>
504    <td align="center">{@code onResume()} <br/>hoặc<br/> {@code onStop()}</td>
505</tr>
506
507<tr>
508   <td rowspan="2" style="border-left: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
509   <td align="left"><code>{@link android.app.Activity#onResume onResume()}</code></td>
510   <td>Được gọi ngay trước khi hoạt động bắt đầu
511       tương tác với người dùng.  Tại điểm này, hoạt động nằm ở
512       trên cùng của chồng hoạt động, trong đó mục nhập của người dùng sẽ đến hoạt động này.
513       <p>Luôn được theo sau bởi {@code onPause()}.</p></td>
514   <td align="center">Không</td>
515   <td align="center">{@code onPause()}</td>
516</tr>
517
518<tr>
519   <td align="left"><code>{@link android.app.Activity#onPause onPause()}</code></td>
520   <td>Được gọi khi hệ thống sắp bắt đầu tiếp tục một hoạt động
521       khác.  Phương pháp này thường được sử dụng để thực hiện các thay đổi chưa lưu cho
522       dữ liệu liên tục, dừng các hoạt ảnh và những việc khác mà có thể tiêu tốn công suất
523       CPU, v.v.  Nó sẽ thực hiện rất nhanh, vì
524       hoạt động tiếp theo sẽ không được tiếp tục tới khi nó trở lại.
525       <p>Được theo sau hoặc bởi {@code onResume()} nếu hoạt động
526       trở lại phía trước, hoặc bởi {@code onStop()} nếu nó
527       không hiển thị với người dùng.</td>
528   <td align="center"><strong style="color:#800000">Có</strong></td>
529   <td align="center">{@code onResume()} <br/>hoặc<br/> {@code onStop()}</td>
530</tr>
531
532<tr>
533   <td colspan="2" align="left"><code>{@link android.app.Activity#onStop onStop()}</code></td>
534   <td>Được gọi khi hoạt động không còn hiển thị với người dùng.  Điều này
535       có thể xảy ra vì nó đang bị hủy, hoặc vì một hoạt động khác
536       (đang tồn tại hoặc mới) đã được tiếp tục và đang che khuất nó.
537       <p>Được theo sau hoặc bởi {@code onRestart()} nếu
538       hoạt động đang quay lại để tương tác với người dùng, hoặc bởi
539       {@code onDestroy()} nếu hoạt động này sẽ đi mất.</p></td>
540   <td align="center"><strong style="color:#800000">Có</strong></td>
541   <td align="center">{@code onRestart()} <br/>hoặc<br/> {@code onDestroy()}</td>
542</tr>
543
544<tr>
545   <td colspan="3" align="left"><code>{@link android.app.Activity#onDestroy
546onDestroy()}</code></td>
547   <td>Được gọi trước khi hoạt động bị hủy.  Đây là lần gọi cuối cùng
548       mà hoạt động sẽ nhận được.  Nên gọi nó hoặc vì
549       hoạt động đang kết thúc (ai đó đã gọi <code>{@link android.app.Activity#finish
550       finish()}</code> trên nó), hoặc vì hệ thống đang tạm thời hủy thực thể này của
551       hoạt động để tiết kiệm bộ nhớ trống.  Bạn có thể phân biệt
552       những những kịch bản này bằng phương pháp <code>{@link
553       android.app.Activity#isFinishing isFinishing()}</code>.</td>
554   <td align="center"><strong style="color:#800000">Có</strong></td>
555   <td align="center"><em>không có gì</em></td>
556</tr>
557</tbody>
558</table>
559
560<p>Cột ghi "Có thể tắt bỏ sau?" cho biết liệu hệ thống có thể
561tắt bỏ tiến trình đang lưu trữ hoạt động vào bất cứ lúc nào <em>sau khi phương pháp trả về</em>, mà không
562thực hiện một dòng mã khác của hoạt động hay không.  Ba phương pháp được ghi là "có": ({@link
563android.app.Activity#onPause
564onPause()}, {@link android.app.Activity#onStop onStop()}, và {@link android.app.Activity#onDestroy
565onDestroy()}). Vì {@link android.app.Activity#onPause onPause()} là phương pháp đầu tiên
566trong ba phương pháp, sau khi hoạt động được tạo, {@link android.app.Activity#onPause onPause()} là
567phương pháp cuối cùng được bảo đảm sẽ được gọi trước khi tiến trình <em>có thể</em> bị tắt bỏ&mdash;nếu
568hệ thống phải khôi phục bộ nhớ trong một tình huống khẩn cấp, khi đó {@link
569android.app.Activity#onStop onStop()} và {@link android.app.Activity#onDestroy onDestroy()} có thể
570không được gọi. Vì thế, bạn nên sử dụng {@link android.app.Activity#onPause onPause()} để ghi
571dữ liệu cố định quan trọng (chẳng hạn như những chỉnh sửa của người dùng) vào thiết bị lưu trữ. Tuy nhiên, bạn nên chọn lọc
572thông tin nào phải được giữ lại trong {@link android.app.Activity#onPause onPause()}, vì bất kỳ
573thủ tục chặn nào trong phương pháp này cũng chặn chuyển tiếp sang hoạt động kế tiếp và làm chậm trải nghiệm
574của người dùng.</p>
575
576<p> Những phương pháp được ghi "Không" trong cột <b>Có thể tắt bỏ</b> sẽ bảo vệ tiến trình đang lưu trữ
577hoạt động khỏi bị tắt bỏ từ thời điểm chúng được gọi.  Vì thế, một hoạt động có thể tắt bỏ được
578từ thời điểm {@link android.app.Activity#onPause onPause()} trở về tới thời điểm
579{@link android.app.Activity#onResume onResume()} sẽ được gọi. Nó sẽ không thể lại tắt bỏ được tới khi
580{@link android.app.Activity#onPause onPause()} lại được gọi và trả về. </p>
581
582<p class="note"><strong>Lưu ý:</strong> Một hoạt động mà không thể "tắt bỏ được" về mặt kỹ thuật bởi
583định nghĩa này trong bảng 1 vẫn có thể bị hệ thống tắt bỏ&mdash;nhưng điều đó chỉ xảy ra trong
584những hoàn cảnh cực đoan khi không còn giải pháp nào khác. Thời điểm một hoạt động có thể bị tắt bỏ được
585đề cập kỹ hơn trong tài liệu <a href="{@docRoot}guide/components/processes-and-threads.html">Tiến trình và
586Luồng</a>.</p>
587
588
589<h3 id="SavingActivityState">Lưu trạng thái của hoạt động</h3>
590
591<p>Phần giới thiệu về <a href="#Lifecycle">Quản lý Vòng đời của Hoạt động</a> có đề cập sơ qua
592rằng
593khi một hoạt động bị tạm dừng hoặc dừng, trạng thái của hoạt động đó sẽ được giữ lại. Điều này đúng vì
594đối tượng {@link android.app.Activity} vẫn được giữ trong bộ nhớ khi nó bị tạm dừng hoặc
595dừng&mdash;tất cả thông tin về các thành viên và trạng thái hiện tại của nó vẫn hoạt động. Vì thế, bất kỳ thay đổi nào
596mà người dùng đã thực hiện trong hoạt động đều được giữ lại sao cho khi hoạt động trở về
597tiền cảnh (khi nó "tiếp tục"), thì những thay đổi này vẫn còn đó.</p>
598
599<p>Tuy nhiên, khi hệ thống hủy một hoạt động để khôi phục bộ nhớ, đối tượng {@link
600android.app.Activity} bị hủy, vì vậy hệ thống không thể đơn thuần tiếp tục hoạt động với trạng thái
601không bị ảnh hưởng. Thay vào đó, hệ thống phải tạo lại đối tượng {@link android.app.Activity} nếu người dùng
602điều hướng trở lại nó. Tuy vậy, người dùng không biết
603rằng hệ thống đã hủy hoạt động và tạo lại nó và, vì thế, có thể
604cho rằng hoạt động sẽ vẫn nguyên như cũ. Trong tình huống này, bạn có thể đảm bảo rằng
605thông tin quan trọng về trạng thái của hoạt động được giữ nguyên bằng cách triển khai một phương pháp gọi lại
606bổ sung cho phép bạn lưu thông tin về trạng thái của hoạt động của mình: {@link
607android.app.Activity#onSaveInstanceState onSaveInstanceState()}.</p>
608
609<p>Hệ thống gọi {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}
610trước khi khiến hoạt động dễ bị hủy. Hệ thống chuyển cho phương pháp này
611một {@link android.os.Bundle} trong đó bạn có thể lưu
612thông tin trạng thái về hoạt động như cặp tên giá trị, bằng cách sử dụng các phương pháp như {@link
613android.os.Bundle#putString putString()} và {@link
614android.os.Bundle#putInt putInt()}. Sau đó, nếu hệ thống tắt bỏ tiến trình ứng dụng của bạn
615và người dùng điều hướng trở lại hoạt động của bạn, hệ thống sẽ tạo lại hoạt động đó và
616chuyển {@link android.os.Bundle} cho cả {@link android.app.Activity#onCreate onCreate()} và {@link
617android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}. Sử dụng một trong
618hai phương pháp này, bạn có thể trích xuất trạng thái đã lưu của mình từ {@link android.os.Bundle} và khôi phục
619trạng thái của hoạt động. Nếu không có thông tin trạng thái để khôi phục, khi đó {@link
620android.os.Bundle} được chuyển cho bạn sẽ rỗng (là trường hợp khi hoạt động được tạo
621lần đầu).</p>
622
623<img src="{@docRoot}images/fundamentals/restore_instance.png" alt="" />
624<p class="img-caption"><strong>Hình 2.</strong> Hai cách mà theo đó một hoạt động trở về tiêu điểm
625của người dùng với trạng thái không thay đổi: hoặc hoạt động bị hủy, rồi tạo lại và hoạt động phải khôi phục
626trạng thái đã lưu trước đó, hoặc hoạt động bị dừng, rồi tiếp tục và trạng thái của hoạt động
627giữ nguyên không đổi.</p>
628
629<p class="note"><strong>Lưu ý:</strong> Không có gì bảo đảm rằng {@link
630android.app.Activity#onSaveInstanceState onSaveInstanceState()} sẽ được gọi trước khi hoạt động
631của bạn bị hủy, vì có những trường hợp mà sẽ không cần lưu trạng thái
632(chẳng hạn như khi người dùng rời bỏ hoạt động của bạn bằng cách sử dụng nút <em>Quay lại</em>, vì người dùng
633rõ ràng
634đang đóng hoạt động). Nếu hệ thống gọi {@link android.app.Activity#onSaveInstanceState
635onSaveInstanceState()}, nó làm vậy trước {@link
636android.app.Activity#onStop onStop()} và có thể trước cả {@link android.app.Activity#onPause
637onPause()}.</p>
638
639<p>Tuy nhiên, ngay cả khi bạn không làm gì và không triển khai {@link
640android.app.Activity#onSaveInstanceState onSaveInstanceState()}, một phần trạng thái của hoạt động được khôi phục
641bởi việc lớp {@link android.app.Activity} triển khai mặc định {@link
642android.app.Activity#onSaveInstanceState onSaveInstanceState()}. Cụ thể, triển khai
643mặc định sẽ gọi phương pháp {@link
644android.view.View#onSaveInstanceState onSaveInstanceState()} tương ứng cho mọi {@link
645android.view.View} trong bố trí, nó cho phép mỗi chế độ xem cung cấp thông tin về chính nó
646mà sẽ được lưu. Gần như mọi widget trong khuôn khổ Android đều triển khai phương pháp này nếu
647phù hợp, sao cho mọi thay đổi hiển thị đối với UI đều tự động được lưu và khôi phục khi hoạt động
648của bạn được tạo lại. Ví dụ, widget {@link android.widget.EditText} lưu mọi văn bản
649do người dùng điền vào và widget {@link android.widget.CheckBox} lưu sẽ thông tin cho dù đã được kiểm tra
650hay chưa. Việc duy nhất bạn cần làm đó là cung cấp một ID duy nhất (với thuộc tính <a href="{@docRoot}guide/topics/resources/layout-resource.html#idvalue">{@code android:id}</a>
651) cho mỗi widget bạn muốn lưu trạng thái của nó. Nếu một widget không có ID thì hệ thống
652không thể lưu trạng thái của nó.</p>
653
654<div class="sidebox-wrapper">
655<div class="sidebox">
656<p>Bạn cũng có thể rõ ràng dừng một chế độ xem trong bố trí của mình khỏi việc lưu trạng thái của nó bằng cách đặt thuộc tính
657{@link android.R.attr#saveEnabled android:saveEnabled} thành {@code "false"} hoặc bằng cách gọi
658phương pháp {@link android.view.View#setSaveEnabled setSaveEnabled()}. Thường thì bạn không nên
659vô hiệu hóa điều này, nhưng có thể làm nếu bạn muốn khôi phục trạng thái của UI hoạt động khác đi.</p>
660</div>
661</div>
662
663<p>Mặc dù việc triển khai mặc định {@link
664android.app.Activity#onSaveInstanceState onSaveInstanceState()} lưu thông tin hữu ích về
665UI hoạt động của bạn, bạn có thể vẫn cần khống chế nó để lưu thêm thông tin.
666Ví dụ, bạn có thể cần lưu các giá trị thành viên đã thay đổi trong vòng đời của hoạt động (mà
667có thể tương quan với các giá trị được khôi phục trong UI, nhưng các thành viên nắm giữ giá trị UI đó không được
668khôi phục theo mặc định).</p>
669
670<p>Vì việc triển khai mặc định {@link
671android.app.Activity#onSaveInstanceState onSaveInstanceState()} giúp lưu trạng thái của UI, nếu
672bạn khống chế phương pháp để lưu thêm thông tin trạng thái, bạn nên luôn luôn gọi
673triển khai siêu lớp của {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}
674trước khi thực hiện bất kỳ công việc nào. Tương tự, bạn cũng nên gọi triển khai siêu lớp {@link
675android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} nếu bạn khống chế nó, để
676triển khai mặc định có thể khôi phục các trạng thái xem.</p>
677
678<p class="note"><strong>Lưu ý:</strong> Vì {@link android.app.Activity#onSaveInstanceState
679onSaveInstanceState()} không đảm bảo
680sẽ được gọi, bạn chỉ nên sử dụng nó để ghi trạng thái giao thời của hoạt động (trạng thái của
681UI)&mdash;bạn không nên sử dụng nó để lưu giữ dữ liệu liên tục.  Thay vào đó, bạn nên sử dụng  {@link
682android.app.Activity#onPause onPause()} để lưu giữ dữ liệu liên tục (chẳng hạn như dữ liệu mà nên được lưu
683vào một cơ sở dữ liệu) khi người dùng rời bỏ hoạt động.</p>
684
685<p>Một cách hay để kiểm tra khả năng khôi phục trạng thái của ứng dụng của bạn đó là chỉ cần xoay
686thiết bị sao cho hướng màn hình thay đổi. Khi hướng màn hình thay đổi, hệ thống
687hủy và tạo lại hoạt động để áp dụng các tài nguyên thay thế mà có thể có sẵn
688cho cấu hình màn hình mới. Chỉ với lý do này mà một điều rất quan trọng đó là hoạt động của bạn
689hoàn toàn khôi phục trạng thái của mình khi nó được tạo lại, vì người dùng thường xoay màn hình trong khi
690sử dụng ứng dụng.</p>
691
692
693<h3 id="ConfigurationChanges">Xử lý thay đổi về cấu hình</h3>
694
695<p>Một số cấu hình thiết bị có thể thay đổi trong thời gian chạy (chẳng hạn như hướng màn hình, sự sẵn có
696của bàn phím, và ngôn ngữ). Khi sự thay đổi đó diễn ra, Android tạo lại hoạt động đang chạy
697(hệ thống gọi {@link android.app.Activity#onDestroy}, rồi ngay lập tức gọi {@link
698android.app.Activity#onCreate onCreate()}). Hành vi này
699được thiết kế để giúp ứng dụng của bạn điều chỉnh theo những cấu hình mới bằng cách tự động tải lại ứng dụng
700của bạn bằng các tài nguyên thay thế mà bạn đã cung cấp (chẳng hạn như bố trí khác cho
701các hướng và kích cỡ màn hình khác).</p>
702
703<p>Nếu bạn thiết kế hoạt động của mình một cách phù hợp để xử lý khởi động lại do thay đổi hướng màn hình và
704khôi phục trạng thái hoạt động như nêu trên, ứng dụng của bạn sẽ linh hoạt hơn trước
705những sự kiện bất ngờ khác trong vòng đời của hoạt động.</p>
706
707<p>Cách tốt nhất để xử lý khởi động lại đó là
708 lưu và khôi phục trạng thái hoạt động của bạn bằng cách sử dụng {@link
709  android.app.Activity#onSaveInstanceState onSaveInstanceState()} và {@link
710android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} (hoặc {@link
711android.app.Activity#onCreate onCreate()}), như đã đề cập trong phần trước.</p>
712
713<p>Để biết thêm thông tin về những thay đổi cấu hình xảy ra tại thời điểm chạy và cách bạn có thể xử lý
714chúng, hãy đọc hướng dẫn <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Xử lý
715Thay đổi trong Thời gian chạy</a>.</p>
716
717
718
719<h3 id="CoordinatingActivities">Điều phối hoạt động</h3>
720
721 <p>Khi một hoạt động bắt đầu một hoạt động khác, cả hai đều trải qua những chuyển tiếp vòng đời. Hoạt động thứ nhất
722tạm dừng và dừng (tuy nhiên, nó sẽ không dừng nếu vẫn hiển thị được dưới nền), trong khi hoạt động kia
723được tạo. Trong trường hợp những hoạt động này chia sẻ dữ liệu được lưu vào đĩa hoặc nơi khác, điều quan trọng là
724phải hiểu rằng hoạt động thứ nhất không bị dừng hoàn toàn trước khi hoạt động thứ hai được tạo.
725Thay vào đó, tiến trình bắt đầu hoạt động thứ hai chồng lấp với tiến trình dừng hoạt động
726thứ nhất.</p>
727
728<p>Thứ tự gọi lại vòng đời được định nghĩa rõ, cụ thể là khi hai hoạt động trong cùng tiến trình
729và hoạt động này bắt đầu hoạt động kia. Sau đây là thứ tự thao tác diễn ra khi Hoạt động
730A bắt đầu Hoạt động B: </p>
731
732<ol>
733<li>Phương pháp {@link android.app.Activity#onPause onPause()} của Hoạt động A thực thi.</li>
734
735<li>{@link android.app.Activity#onCreate onCreate()} của Hoạt động B, {@link
736android.app.Activity#onStart onStart()}, và các phương pháp {@link android.app.Activity#onResume onResume()}
737thực thi theo trình tự. (Hoạt động B lúc này có tiêu điểm của người dùng.)</li>
738
739<li>Sau đó, nếu Hoạt động A không còn hiển thị trên màn hình, phương pháp {@link
740android.app.Activity#onStop onStop()} của nó sẽ thực thi.</li>
741</ol>
742
743 <p>Trình tự gọi lại vòng đời có thể dự đoán này cho phép bạn quản lý chuyển tiếp
744thông tin từ hoạt động này sang hoạt động khác. Ví dụ, nếu bạn phải ghi vào một cơ sở dữ liệu khi
745hoạt động thứ nhất dừng sao cho hoạt động theo sau có thể đọc nó, khi đó bạn nên ghi vào
746cơ sở dữ liệu trong khi {@link android.app.Activity#onPause onPause()} thay vì trong khi {@link
747android.app.Activity#onStop onStop()}.</p>
748
749<!--
750<h2>Beginner's Path</h2>
751
752<p>For more information about how Android maintains a history of activities and
753enables user multitasking, continue with the <b><a
754href="{@docRoot}guide/components/tasks-and-back-stack.html">Tasks and Back
755Stack</a></b> document.</p>
756-->
757