Vòng đời của Activity (Activity Lifecycle)

Một phần của tài liệu Bài giảng lập trình di động android (Trang 31 - 37)

Khi một activity chuyển đổi hoặc thoát khỏi các trạng thái khác nhau như mô tả ở trên, activity sẽ được thông báo qua nhiều phương thức callback khác nhau. Bạn có thể ghi đè tất cả các phương thức callback để làm việc phù hợp khi trạng thái của activity thay đổi.

Vòng đời của Activity mô tả quá trình hoạt động và tương tác của một Activity kể từ khi nó bắt đầu chạy, cho tới khi ứng dụng bị tắt. Bao gồm cả quá trình Activity bị dừng tạm thời, khôi phục lại (resume),…

ThS. Bùi Trung Úy 32

Giải thích sơ đồ

Sơ đồ bắt đầu từ khi Activity bắt đầu chạy, tức là khi Activity được kích hoạt, và

được hệ thống để vào back-stack. Sau khi kích hoạt, lần lượt các callback onCreate(), onStart(), onResume() sẽđược hệ thống gọi đến.

Sau khi gọi đến các callback trên, thì Activity mới chính thức được xem là đang

chạy (Activity running).

Lúc này, nếu có bất kỳ Activity nào khác chiếm quyền hiển thị, thì Activity hiện tại sẽ rơi vào trạng thái onPause(). Nếu sự hiển thị của Activity khác làm cho Activity hiện tại không còn nhìn thấy nữa thì onStop() sẽđược gọi tiếp theo nữa.

Nếu Acvitity đã vào onPause(), tức là đang bị Activity khác đè lên, sau đó người dùng quay về lại Activity cũ, thì onResume() sẽ được gọi. Còn nếu Activity đã vào

onStop() rồi, mà người dùng quay về lại Activity cũ thì onRestart() được gọi.

Trong cảhai trường hợp Activity rơi vào onPause() hoặc onStop(), nó sẽ rất dễ bị

hệ thống thu hồi (tức là bị hủy) để giải phóng tài nguyên, khi này nếu quay lại

ThS. Bùi Trung Úy 33

cuối cùng, nếu một Activity bị hủy một cách có chủ đích, chẳng hạn như người dùng nhấn nút Back, hay gọi hàm finish(),… thì onDestroy() sẽđược kích hoạt và Activity kết thúc vòng đời của nó.

Nhìn vào sơ đồ trên, chúng ta có thể thấy có 3 chu kỳđược lặp lại hay ba vòng lặp lồng nhau trong vòng đời activity:

- Entire lifetime: Từ khi gọi onCreate() cho tới onDestroy() – tức là từ lúc Activity được gọi ra cho đến lúc nó bị huỷ.

- Visible liftetime: Từ khi gọi onStart() cho tới lúc gọi onStop(), trong trường hợp này ta vẫn có thể thấy màn hình Activity.

- Foreground lifetime: Từ khi gọi onResume() cho tới lúc gọi onPause(), quá trình này Activity luôn nằm ở foreground và ta có thểtương tác được với nó.

Các phương thức callback

- onCreate() – Hàm này được gọi khá sớm, ngay khi activity được kích hoạt và thậm chí người dùng còn chưa thấy gì thì callback này đã được gọi rồi. Ngoài ra, callback này chỉ được gọi một lần duy nhất khi Activity được khởi tạo, nên đây là nơi để thực hiện các khởi tạo cho activity như load giao diện, các lời gọi API, load database, tạo item list,...

- onStart() –Hàm này được gọi sau onCreate() khi Activity bắt đầu được hiện ra – ngay trước khi activity nhận tương tác với người dùng. Hoặc hệ thống cũng sẽ gọi lại onStart() sau khi gọi onRestart() nếu trước đó nó bị che khuất bởi Activity nào khác (một màn hình khác hoặc một ứng dụng khác) che hoàn toàn và rơi vào onStop().

Khi hệ thống gọi đến callback này thì Activity được nhìn thấy bởi người dùng và nhưng chưa tương tác được. Bởi đặc tính này mà onStart() ít được dùng đến.

- onResume()–Hàm này được gọi khi Activity đã nhìn thấy và nhận tương tác với

người dùng. Tại thời điểm này, activity ở trên cùng của ngăn xếp activity, và được focus xử lý.

Khi hệ thống gọi đến callback này thì bạn yên tâm rằng người dùng đã nhìn thấy và đã tương tác được với giao diện. Hoặc onResume() cũng được gọi sau khi Activity bị tạm dừng bởi một giao diện nào khác che đi một phần (hoặc toàn phần), rồi sau đó quay lại Activity hiện tại. Bạn có thể thấy rằng callback này được gọi rất nhiều lần trong một vòng đời của nó. Chính đặc điểm này của onResume() mà bạn có thể tận dụng để quay lại tác vụ mà người dùngđang bị dang dở khi onPause() được gọi.

Chẳng hạn như bạn đang soạn nội dung cho ứng dụng, mà có cuộc gọi đến, bạn sẽ lưu tạm nội dung này trong callback onPause(), để rồi khi onResume() được gọi lại khi người dùng kết thúc cuộc gọi và quay lại ứng dụng, bạn sẽ khôi phục nội dung đó để người dùng tiếp tục sử dụng ứng dụngnhư chưa có bất kỳ gián đoạn nào.

- onPause() – Hàm này được gọi khi có một thành phần nào đó che Activity hiện tại mà người dùng vẫn nhìn thấy Activity đó (nhìn thấy chứ không tương tác được).

ThS. Bùi Trung Úy 34 Chẳng hạn một popup hiện lên trên Activity. Sau này khi người dùng quay lại Activity thì onResume() sẽ được gọi.

Bạn có thể tưởng tượng rằng onPause() cũng sẽ được gọi khá nhiều lần trong một vòng đời Activity. Theo như Google thì onPause() được gọi đến khá nhanh, nếu bạn muốn lưu trữ dữ liệu, thì nên lưu những gì nhanh chóng. Nếu bạn muốn lưu trữ các dữ liệu lớn, hoặc gọi API kết nối server chỗ này, nhiều khả năng ứng dụng sẽ không kịp thực hiện. Do đó, thay vì làm các thao tác nặng nề ở onPause(), bạn có thể cân nhắc gọi chúng ở onStop().

- onStop() –Hàm này được gọi khi Activity không còn được nhìn thấy nữa, có thể một màn hình nào khác che lên hoàn toàn, có thể một ứng dụng nào đó vào foreground, hoặc người dùng nhấn nút Home để về màn hình chính.

Tuy nhiên khi onStop() được gọi không phải là lúc chúng ta cũng nói lời tạm biệt Activity, người dùng hoàn toàn có thể quay lại sử dụng Activity sau đó mà không cần phải khởi động lại Activity, khi này thì phương thức onRestart() và onStart() được gọi kế tiếp nhau.

- onRestart()–Hàm này được gọi khi activity khởi động lại sau khi đã bị dừng. - onDestroy() –Hàm này được gọi trước khi Activity bị hủy (hủy chủđộng hoặc bị

hủy bởi hệ thống khi cần tài nguyên). Đây là lời gọi cuối cùng mà activity nhận được, bạn có thể tận dụng callback này để giải phóng các tài nguyên hệ thống mà ở onStop() bạn chưa gọi đến.Vòng đời của một Activity kết thúc ở đây.

Minh họa vòng đời Activity bng code

Để dễ hiểu hơn bạn có thể sửa đổi lại code của Activity, ghi đè các phương thức callback như onStart(), onResume(),... thêm vào các thông báo (message) để xem phương thức đó được kích hoạt khi nào. Sau đó chạy lại ứng dụng và theo dõi các quá trình trong vòng đời của Activity hoạt động thế nào.

– Mở file MainActivity.java – Chọn Code/Override Methods

– Ở màn hình „Override Methods‟ chọn các hàm: onStart, onRestart, onResume, onPause, onStop, onDestroy,… việc này sẽ thêm các hàm callback vào trong MainActivity.java. Bạn viết thêm một số dòng lệnh như sau:

ThS. Bùi Trung Úy 35 MainActivity.java package com.example.helloandroid; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log;

public class MainActivity extends AppCompatActivity {

public static final String TAG ="HelloAndroid";

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.d(TAG, "onCreate called!");

}

@Override

protected void onStart() { super.onStart();

Log.d(TAG, "onStart called!");

}

@Override

protected void onResume() { super.onResume();

Log.d(TAG, "onResume called!");

}

@Override

protected void onPause() { super.onPause();

Log.d(TAG, "onPause called!");

}

@Override

protected void onRestart() { super.onRestart();

Log.d(TAG, "onRestart called!");

}

@Override

protected void onDestroy() { super.onDestroy();

Log.d(TAG, "onDestroy called!");

} }

ThS. Bùi Trung Úy 36

Tiếp theo, bạn thực hiện một số thao tác trên ứng dụng để xem các hàm callback khác được gọi như thế nào, như: nhấn nút Home rồi quay lại ứng dụng, mở ứng dụng khác, nhấn nút Back,…

Sử dụng bộ lọc logcat

Khi chạy ứng dụng, trong màn hình logcat sẽ hiển thị rất nhiều loại log khác nhau làm bạn khó tìm ra message mà mình cần, nó có thể của hệ thống hay của ứng dụng khác. Lúc này nếu muốn hiển thị chỉ những log liên quan đến yêu cầu nào đó, bạn cần phải sử dụng bộ lọc log.

ThS. Bùi Trung Úy 37 Trong cửa sổ logcat, chọn „Edit Filter Configuration‟

Sau đó bạn có thể tạo các bộ lọc cho riêng mình, như ví dụ dưới đây đã tạo bộ lọc có tên là HelloAndroid, bộ lọc này chỉ hiển thị log cho ứng dụng HelloAndroid có package name là: com.example.helloandroid:

Ngoài ra, bạn có thể tạo các bộ lọc khác để chỉ hiển thị theo „Log Tag‟, „Log Message‟, PID hoặc kết hợp các điều kiện này lại với nhau.

Một phần của tài liệu Bài giảng lập trình di động android (Trang 31 - 37)

Tải bản đầy đủ (PDF)

(133 trang)