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ó—dù hệ thống đang tạo, dừng hay tiếp tục nó, hay hủy nó—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—đố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 <activity>}</a> 143làm con của phần tử <a href="{@docRoot}guide/topics/manifest/application-element.html">{@code <application>}</a> 144. Ví dụ:</p> 145 146<pre> 147<manifest ... > 148 <application ... > 149 <activity android:name=".ExampleActivity" /> 150 ... 151 </application ... > 152 ... 153</manifest > 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—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 <activity>}</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<activity>}</a> cũng có thể quy định các bộ lọc ý định khác nhau—bằng cách sử dụng phần tử <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code 172<intent-filter>}</a> —để 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<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"> 182 <intent-filter> 183 <action android:name="android.intent.action.MAIN" /> 184 <category android:name="android.intent.category.LAUNCHER" /> 185 </intent-filter> 186</activity> 187</pre> 188 189<p>Phần tử <a href="{@docRoot}guide/topics/manifest/action-element.html">{@code 190<action>}</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<category>}</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<intent-filter>}</a> bao gồm một phần tử 204<a href="{@docRoot}guide/topics/manifest/action-element.html">{@code 205<action>}</a> và, không bắt buộc, một phần tử <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code 206<category>}</a> và/hoặc một phần tử <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code 207<data>}</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ị—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@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 && 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—nếu có thì 302{@code resultCode} sẽ là {@link android.app.Activity#RESULT_OK}—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—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 @Override 378 public void {@link android.app.Activity#onCreate onCreate}(Bundle savedInstanceState) { 379 super.onCreate(savedInstanceState); 380 // The activity is being created. 381 } 382 @Override 383 protected void {@link android.app.Activity#onStart onStart()} { 384 super.onStart(); 385 // The activity is about to become visible. 386 } 387 @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 @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 @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 @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—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 — 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;"> </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;"> </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ỏ—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ỏ—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—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)—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