Quản lý ứng dụng và tài nguyên

Hệ điều hành sẽ giám sát một ứng dụng Android đang chạy như một tiến trình độc lập. Nếu hệ thống xác định các tài nguyên trên thiết bị đạt đến dung lượng ngưỡng cho phép thì nó sẽ tiến hành tắt các tiến trình để giải phóng bộ nhớ. Khi chọn tiến trình để tắt, hệ thống căn cứ vào độ ưu tiên (priori) và trạng thái (state) của tiến trình.

Các trạng thái (states) của tiến trình Android

Một tiến trình (hay ứng dụng) Android có thể có một trong năm trạng thái như hình sau:

Các trạng thái được xếp hạng theo độ ưu tiên từ cao nhất (highest) đến thấp nhất (lowest).

  • Foreground Process: là tiến trình có độ ưu tiên cao nhất và là tiến trình cuối cùng bị tắt khi hệ thống cần giảm tải tài nguyên.
  • Visible Process: là tiến trình có một Activity hiển thị đến người dùng và đồng thời không ở trong trạng thái Foreground.
  • Service Process: là tiến trình chứa một dịch vụ (service) đang thực thi.
  • Background Process: là tiến trình chứa các Activity nhưng không hiển thị đến người dùng và cũng không chứa một dịch vụ nào.
  • Empty Process: là tiến trình không chứa bất cứ Activity hay dịch vụ đang hoạt động nào. Các tiến trình này được duy trì trong bộ nhớ để sẵn sàng phụ vụ cho các ứng dụng mới và là các tiến trình đầu tiên bị tắt (do có độ ưu tiên thấp nhất) khi hệ thống cần giải phóng tài nguyên.

Sự phụ thuộc giữa các tiến trình

Các tiến trình trong hệ thống không hẳn độc lập nhau mà chúng thường có mối quan hệ phụ thuộc lẫn nhau. Do đó, để tránh rủi ro khi tắt một tiến trình có quan hệ với các tiến trình khác, hệ hống tuân theo nguyên tắt: sắp xếp độ ưu tiên cho một tiến trình không được thấp hơn các tiến trình khác nó có quan hệ.

Chu kỳ sống của Activity

Trạng thái của một tiến trình Android được quyết định bởi trạng thái của các Activity và các thành phần cấu thành nên ứng dụng đó. Trạng thái của một Activity có thể thay đổi trong suối chu kỳ sống của ứng dụng Android và trạng thái hiện tại của một Activity được xác định bởi vị trí của Activity đó trong Activity Stack như hình sau:

Khi một ứng dụng Android thực thi, các Activity của nó sẽ được tổ chức trong Activity Stack, tức là, Activity cuối cùng sẽ được đặt ở đỉnh của Stack và là Activity đang thực thi.

Các trạng thái của Activity

Một Activity có thể trải qua các trạng thái khác nhau bao gồm:

  • Active/Running: đang hoạt động và ở tại đỉnh của Activity Stack
  • Paused: tạm dừng và có thể phục hồi lại trạng thái Active
  • Stopped: dừng và không hiển thị đến người dùng
  • Killed: bị tắt bởi hệ thống

Các trạng thái của Activity có thể thay đổi bởi một trong 3 nguyên nhân: sự di chuyển của một Activity giữa hai trạng thái của tiến trình là ForegroundBackground, Activity bị tắt bởi hệ thống, và cấu hình thiết bị thay đổi. Do đó, chúng ta cần có những cách thức để xử lý sự thay đổi trạng thái của Activity.

Trạng thái động (dynamic state) và trạng thái ổn định (persistent state)

Mục đích chính của việc quản lý chu kỳ sống của Activity là lưu giữ và phục hồi các trạng thái tại những thời điểm phù hợp. Trạng thái của Activity liên quan đến dữ liệu nó nắm giữ và giao diện người dùng. Activity có thể duy trì một mô hình dữ liệu trong bộ nhớ để lưu trữ cơ sở dữ liệu (database), nội dung nhà cung cấp (content provider) hay tập tin (file). Nhờ các mô hình dữ liệu này mà trong quá trình giao tiếp giữa các ứng dụng sẽ không bị mất mát dữ liệu. Ta gọi trạng thái của Activity lúc này là ổn định (persistent state). Ở một khía cạnh khác, Activity liên quan đến giao diện người dùng với dữ liệu thường thay đổi bởi người dùng. Lúc này, Activity đang ở trạng thái động (dynamic).

Như vậy, mục đích chính của trạng thái động là tạo cảm giác liên tục khi thay đổi trạng thái từ Foreground sang Background mà không cần quan tâm rằng các Activity có thể bị tắt hay phục hồi từ những người dùng không hiểu biết. Trạng thái ổn định, ở khía cạnh khác, giúp tránh mất mát dữ liệu khi các Activity bị tắt trong trạng thái Background.

Lớp Activity và các phương thức trong chu kỳ sống của Activity

Mỗi một Activity được thừa kế từ lớp Android Activity hay từ các lớp con của lớp Activity như AppCompatActivity hay FragmentActivity. Xem lại nội dung trong tập tin MainActivity.java từ các ứng dụng trong các bài trước chúng ta sẽ thấy cấu trúc như sau:


package com.ngocminhtran.myfirstapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);

     }

}

Trong trường hợp này Activity thừa kế từ lớp AppCompatActivity. Lớp Activity chứa một số phương thức dùng để quản lý chu kỳ sống của Activity. Các phương thức gồm:

  • onCreate(): được gọi khi Activity lần đầu được tạo.
  • onRestart(): được gọi khi Activity hoạt động trở lại khi bị hệ thống dừng trước đó
  • onStart(): được gọi ngay sau khi các phương thức onCeate hay onRestart được gọi. Phương thức này xác định Activity sẽ hiển thị đến người dùng.
  • onResume(): được gọi ngay sau onStart() để xác định Activity đang ở đỉnh của Activity Stack và người dùng đang tương tác với Activity này.
  • onPause(): theo sau onResume() hay onStop() xác định một Activity trở lại trạng thái Foreground.
  • onStop(): xác định Activity không hiển thị đến người dùng.
  • onDestroy(): xác định Activity bị hủy.

Bên cạnh các phương thức trên, lớp Activity còn có hai phương thức liên quan đến trạng thái động (dynamic state) của Activity là:

  • onRestoreInstanceState(): được gọi ngay sau onStart() trong tình huống Activity đang hoạt động trở lại từ một cuộc gọi trước đó.
  • onSaveIntanceState(): gọi trước khi Activity bị hủy để lưu lại trạng thái động hiện tại của Activity.

Thời gian sống của Activity

Thời gian sống của Activity có thể phân loại thành 3 khoảng thời gian hoạt động của một Activity như sau:

  • Entire Lifetime: là khoảng thời gian của một Activity giữa lời gọi onCreate() và lời gọi onDestroy()
  • Visible Lifetime: là khoảng thời gian của một Activity giữa lời gọi onStart() và lời gọi onStop()
  • Foreground Lifetime: là khoảng thời gian của một Activity giữa lời gọi onResume() và lời gọi onPause()

Thời gian sống của Activity có thể được trực quan như hình sau:

Lời cuối

Trong bài này chúng ta đã tìm hiểu các khái niệm về chu kỳ sống của ứng dụng Android và các Activity. Chúng ta cũng đã tìm hiểu qua lớp Activity và các phương thức liên quan đến chu kỳ sống của Activity. Mặc dù chỉ là lý thuyết nhưng rất cần thiết cho việc phát triển ứng dụng Android sau này.