2.1.2.1. Mô hình vòng đời Activity
Nội dung phần này sẽ trình bày về mô hình vòng đời của Activity trong ứng dụng Android.
Như đã đề cập ở các phần trước, trong mỗi ứng dụng có thể có một hoặc nhiều Activity. Mỗi một Activity sẽ có một vòng đời riêng độc lập hoàn toàn với Activity khác. Bên trong hệ thống, các Activity được quản lý bởi một ngăn xếp Activity (Activity
stack). Khi một Activity mới được khởi tạo, nó được đặt ở đỉnh của stack và trở thành Activity đang chạy (Active activity), các Activity trước sẽ tạm dừng, lưu ở bên dưới Activity mới trong stack và sẽ không thấy trong suốt quá trình Activity mới tồn tại. Nếu người dùng ấn nút back hoặc đóng Activity đang chạy thì Activity kế tiếp trong stack sẽ di chuyển lên và trở thành Active activity.
Hình 2.2. Activity stack Một Activity có vòng đời hoạt động theo mô hình sau:
Các phương thức quản lý vòng đời Activity được định nghĩa sẵn trong lớp Activity gồm:
- onCreate() : hàm này được gọi khi Activity được khởi tạo, dùng để thiết lập giao diện ứng dụng và thực thi những thao tác cơ bản.
- onStart() : hàm này được gọi khi Activity xuất hiện trên màn hình. - onResume() : hàm này được gọi ngay sau onStart() hoặc khi người dùng
tương tác với Activity.
- onPause() : hàm này được gọi khi Activity hiện thời bị đóng, hệ thống đang gọi đến một Activity trước đó.
- onStop() : hàm này được gọi khi Activity hiện thời không còn được hiển thị tới người dùng hoặc Activity khác đang được hiển thị tới người dùng. - onDestroy() : hàm này được gọi trước khi Activity bị giải phóng khỏi hệ
thống.
- onRestart() : hàm này được gọi khi Activity đang ở trạng thái dừng (sự kiện onStop() được gọi) và muốn khởi động lại.
2.1.2.2. Lập trình quản lý vòng đời ứng dụng di động
Nội dung phần này sẽ trình bày về việc lập trình quản lý vòng đời của Activity trong ứng dụng Android.
Bước 1: từ AndroidStudio, tạo Android project có tên Activity101 Bước 2: tạo một activity mới bằng một trong hai cách sau:
Cách 1: Tạo Activity bằng mã nguồn
Tạo lớp Java kế thừa từ lớp Activity cơ sở
package net.learn2develop.Activity101;
import android.app.Activity;
import android.os.Bundle;
public class Activity101Activity extends Activity {
/** Called when the activity is first created. */ @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.main); }
}
Activity này tải giao diện từ file XML có tên main.xml, được định nghĩa trong folder res/layout, thông qua câu lệnh:
setContentView(R.layout.main);
Khai báo activity trên trong file AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> manifest
xmlns:android="http://schemas.android.com/apk/res/android" package="net.learn2develop.Activity101"
android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".Activity101Activity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Cách 2: Tạo mới Activity bằng thao tác trên giao diện
Nháy chuột phải vào project Activity101, chọn new -> Other -> Android -> Android Activity, nhập thông số cho Activity
Khi đó Activity mới sẽ được tạo ra gồm 2 file : file xử lý logic (Activity101Activity.java) và file giao diện lưu trong res/layout (main.xml). Khai báo activity trên trong file AndroidManifest.xml giống như cách 1
Bước 3: Quản lý vòng đời Activity qua các hàm sự kiện trong mô hình vòng đời Activity.
Thêm mã nguồn in đậm sau trong file Activity101Activity.java :
package net.learn2develop.Activity101;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class Activity101Activity extends Activity {
String tag = "Lifecycle";
/** Called when the activity is first created. */ @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.main);
}
public void onStart() {
super.onStart();
Log.d(tag, "In the onStart() event");
}
public void onRestart() {
super.onRestart();
Log.d(tag, "In the onRestart() event");
}
public void onResume() {
super.onResume();
Log.d(tag, "In the onResume() event");
}
public void onPause() {
super.onPause();
Log.d(tag, "In the onPause() event");
}
public void onStop() {
super.onStop();
Log.d(tag, "In the onStop() event");
}
public void onDestroy() {
super.onDestroy();
Log.d(tag, "In the onDestroy() event");
} }
Bước 4: Bấm F11 để debug ứng dụng trên Emulator
v Khi ứng dụng chạy trên Emulator, quan sát cửa sổ debug LogCat: 11-16 06:25:59.396: D/Lifecycle(559): In the onCreate() event 11-16 06:25:59.396: D/Lifecycle(559): In the onStart() event 11-16 06:25:59.396: D/Lifecycle(559): In the onResume() event
v Bấm nút Back từ Android Emulator, những nội dung sau sẽ được in ra: 11-16 06:29:26.665: D/Lifecycle(559): In the onPause() event 11-16 06:29:28.465: D/Lifecycle(559): In the onStop() event 11-16 06:29:28.465: D/Lifecycle(559): In the onDestroy() event
v Bấm giữ nút Home và bấm icon của ứng dụng để mở lại ứng dụng, những nội dung sau sẽ được in ra:
11-16 06:31:08.905: D/Lifecycle(559): In the onCreate() event 11-16 06:31:08.905: D/Lifecycle(559): In the onStart() event 11-16 06:31:08.925: D/Lifecycle(559): In the onResume() event
v Bấm nút Phone trên Android Emulator để chuyển Activity hoạt động ở trạng thái nền (background), những nội dung sau sẽ được in ra:
11-16 06:32:00.585: D/Lifecycle(559): In the onPause() event 11-16 06:32:05.015: D/Lifecycle(559): In the onStop() event
v Bấm nút Back từ Android Emulator để thoát chương trình gọi điện trên, khi đó Activity trên sẽ được gọi lại, những nội dung sau sẽ được in ra:
11-16 06:32:50.515: D/Lifecycle(559): In the onRestart() event 11-16 06:32:50.515: D/Lifecycle(559): In the onStart() event 11-16 06:32:50.515: D/Lifecycle(559): In the onResume() event
v Chú ý rằng sự kiện OnDestroy() không được gọi cho biết rằng Activity vẫn còn tồn tại trong bộ nhớ.