Application's Life Cycle
Bài đăng này đã không được cập nhật trong 9 năm
COMPONENT
Một ứng dụng Android bao gồm một hoặc nhiều các components
tạm gọi là thành phần
. Những thành phần này được định nghĩa trong file manifest
. Một component
có thể là một trong số các thành phần sau đây :
Một Activity
Một Service
Một Broadcast Receiver
Một content Provider
1. Activity
Một activity
thường đại diện cho một single visual user interface
mà thông qua đấy các action
được tiến hành, thao tác.
Các activity
sẽ kết hợp với nhau để tạo nên một UI thống nhất. Mặc dù vậy nhưng mỗi activity
lại thực sự hoạt động độc lập với nhau.
Khi khởi động một ứng dụng thì sẽ có một main Activity được gọi và hiển thị màn hình giao diện của ứng dụng cho phép người dùng tương tác.
Để việc chuyển từ một activity
này sang một activity
khác thì bạn sẽ phải start một activity
thông qua một activity
hiện thời thông qua intents
.
2. Service
Một service
là thành phần chạy ngầm trong Android, nó sẽ không được chạy ở phía UI nơi mà người dùng có thể thấy được. Bạn có thể connect đến một service
đang chạy hoặc bạn cũng có thể khởi động một service
nếu nó không chạy.
Trong khi kết nối tới nó, bạn có thể giao tiếp với service
ấy thông qua một interface
mà service
sử dụng.
Service
sẽ được sử dụng để update dữ liệu, thông báo.
3. Broadcast Receiver
Một broadcast receiver
là một thành phần gần như không làm gì ngoài nhiệm vụ nhận và tương tác lại với broadcast announcements
.
Nhiều broadcast
phát sinh trong hệ thống code (vi dụ như : "you got a mail"), ngoài ra ứng dụng cũng có thể initiate broadcasts
.
Brodcast receiver
không được hiển thị ở phía UI. Tuy nhiên, nó có thể khởi động một activity
thông qua việc response lại với những thông tin mà nó nhận được, hoặc là nó cũng có thể sử dụng các notification manager để cảnh báo tới user
.
4. Content Provider
Content Provider
được sử dụng để quản lý và chia sẻ dữ liệu dữa các ứng dụng.
Thông thường thì dữ liệu sẽ được lưu trữ trong các file system hoặc là trong SQLite.
Content provider
sẽ thực hiện một chuẩn các phương thức cho phép những ứng dụng khác có thể nhận và lưu dữ liệu mà nó kiểm soát.
Tuy nhiên, ứng dụng không trực tiếp gọi những phương thức đó. Thay vì thế nó sử dụng một đối tượng content resolver
và gọi đến phương thức đấy. Một content resolver
có thể nói chuyện tới bất kì content provider
khá, nó cũng kết hợp với provider
để có thể quản lý việc giao tiếp với bất kì những process bên trong.
APPLICATION'S LIFE CYCLE
Tất cả các ứng dụng Android có process riêng để chạy (có thể hiểu là máy ảo sẽ tạo một instance riêng cho ứng dụng đó)
Bất kể khi nào có một request mà cần được xử lý bởi một component
cụ thể :
- Android sẽ đảm bảo rằng process ứng dụng của
component
này sẽ được chạy - khởi tạo nếu cần thiết
- tạo một instance tương thích của
component
ấy nếu cần thiết
Một process
Linux được đóng gói trong ứng dụng Android sẽ được tạo ra cho ứng dụng ấy khi mà một trong số những đoạn code của ứng dụng ấy cần được chạy, process này sẽ tiếp tục chạy cho đến khi
- process không cần thiết nữa
- system cần memory cho các ứng dụng khác
Một tính năng cơ bản của Android chính là lifetime của một process của ứng dụng sẽ không thể được kiểm soát bằng chinh ứng dụng ấy. Thay vì vậy, nó được kiểm soát thông qua sự kết hợp của
- các thành phần ứng dụng khác đang chạy
- độ quan trong của những ứng dụng này đối với
user
- hệ thống còn bao nhiêu bộ nhớ
Component LifeCycles
Các components
của ứng dụng sẽ có lifecycle
beginning
khi Android khởi tạo lifecycle để respond chointents
end
khi instance bị destroyedbetween
khi thỉnh thoảng có một vài instanceactive
hoặcinactive
, hoặc nếu như màactive
thì nó sẽ làvisible
hayinvisible
đối vớiuser
.
Activity Stack
Activities
trong hệ thống được quản lý bởi một activity stack
.
Khi có một activity
được started, nó sẽ được đặt lên đầu của stack, và bắt đầu chạy activity -- activity trước đầy sẽ luôn luôn nằm sau activity này trong stack, và nó sẽ thể được di chuyển tiếp về phía trên chùng nào new activity vẫn tồn tại.
Nếu user ấn vào nút Back, activity tiếp theo trong stack sẽ nhảy lên và trở thành active.
Life Cycle States
Một activity
cơ bản có 3 states :
- active or running :
activity
sẽ active hoặc running khi mà nó nằm ở phía trên của màn hình. - paused : nó sẽ ở trang thái
paused
nếu activity ấy không được focus lên nữa nhưng vẫn được nhìn thấy bởi user. Ví dụ như có một activity khác nằm trên cùng và activiity này là trong suốt hoặc activity này không chiếm full màn hình chẳng hạn. Trong trường hợp, paused activity vẫn hoàn toàn alive (nó duy trì tất cả các trạng thái và thông tin thành viên và vẫn duy trì liên kết tới cửa sổ quản lý), nhưng activity này có thể bị kill bởi hệ thống trong trường hợp có ít bộ nhớ. - stopped : activity bị stop hoàn toàn nếu nó bị cản trở bởi một activity khác. Nó vẫn có thể duy trì được tất cả các trạng thái và thông tin thành viên. Tuy nhiên, nó sẽ không thể quan sát được bởi user do màn hình cửa sổ của nó đã bị ẩn đi và nõ thông thường sẽ bị kill bởi hệ thống trong trường hợp cần.
Life Cycle Events
Nếu một activity bị pause hoặc stop, hệ thống có thể drop nó khỏi bộ nhớ hoặc sẻ hỏi nót để kết thúc (thông qua phương thức finish()
), hoặc đơn giản là kill process đó. Khi nó được hiển thị lại tới user, nó sẽ hoàn toàn được khởi động lại và khôi phục lại tới trạng thái trước đó của nó.
Dưới đây là danh sách các phương thức chuyern trạng thái của activity :
void onCreate(Bundle saveInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
Tất cả những phương thức trên bạn đều có thể override để thực hiện công việc mình cần khi trạng thái thay đổi.
** MUST **
Tất cả các activity cần phải chạy phương thức onCreate()
để thực hiện bước setup đầu tiên khi đối tượng lần đầu tiên được khởi tạo.
** Highly Recommended **
Nhiều activities cũng thực hiện phương thức onPause()
để commit thay đổi dữ liệu và chuẩn bị để dừng việc tương tác với user.
Entire Lifetime
entire lifetime
của một activity xảy ra giữa 2 lần gọionCreate()
lần đầu tiên với một lần gọi duy nhất phương thứconDestroy()
.- Một activity sẽ thiết lập tất cả các setup global trong
onCreate()
và release tất cả các resources còn lại trongonDestroy()
.
Visible Lifetime
Visible lifetime
của một activity xảy ra giữa một lần gọi onStart()
cho đến một lần gọi onStop()
tương ứng. Trong khoảng thời gian này, user có thể nhìn thấy activity trên màn hình, mặc dù nó có thể không ở trên cùng của màn hình/stack và có thể cũng không tương tác được với user.
- phương thức
onStart()
vàonStop()
có thể được gọi rất nhiều mỗi khi activity thây đổi giữa việc ẩn và hiện ra đối với user. - Giữa 2 phương thức, bạn có thể duy trì resource bạn cần để show activity tới user.
Foreground Lifetime
foreground lifetime
của một activity xảy ra giữa một lần gọi onResume()
cho đến lần gọi onPause()
tương ứng. Trong thời gian này, activity sẽ hiện lên trên tất cả các activity khác trên màn hình và nó tương tác với user.
MỘt activity có thể thường xuyên đổi trạng thái giữa trạng thái resumed
và paused
ví dụ như :
onPaused()
sẽ được gọi khi thiết bị rơi vào trạng thái sleep or khi một activity mới được startonResume()
được gọi khi một activity được trả về hoặc mộtintent
mới được chuyển đến.
Life Cycle Methods
** Method ** : onCreate()
- Được gọi khi lần đầu tiên activity được tạo
- Đây là lúc bạn thiết lập tất cả các normal static như là tạo views, bind data vào list v.v...
- Phương thức này truyền đối tượng
Bundle
chứa state trước đấy của activity, trong trường hợp bắt được state này. - Tiếp theo sau sẽ là
onStart()
** Method ** : onRestart()
- Gọi ngay khi actiivity bị stop hoặc ưu tiên để được start tiếp.
- Luôn theo sau
onStart()
** Method ** : onStart()
- Gọi trước khi activity có thể được nhìn thấy bởi user
- Tiếp theo sau
onResume()
nếu activity cần hiện lại trên cùng của màn hình screen hoặconStop()
nếu nó cần bị ẩn đi.
** Method ** : onResume()
- Gọi trước khi activity bắt đầu tương tác với user.
- Tại lúc này, activity nằm trên cùng của stack
- Luôn theo sau bới
onPause()
.
** Method ** : onPause()
- Gọi khi hệ thông chuẩn bị bắt đầu khôi phục activity khác
- Phương thức này sẽ commit tất cả những thay đổi chưa được lưu và dữ liệu, dung các animations và các thứ khác tiêu tốn CPU.
- Nó nên được thực hiện nhanh nhất có thể, bởi vì activity tiếp theo sẽ không thể resume được cho đến khi phương thức này trả giá trị về.
- Là phương thức theo sau
onResume()
nếu activity được trả về từ trên cùng màn hình hoặconStop()
nếu nó trở nên ẩn đối với user. - Activity trong state này có thể bị kill bởi hệ thống.
** Method ** : onStop()
- Được gọi khi activity không còn hiện lên đối với người dùng.
- Phương thức này xảy ra bởi vì nó bị destroy hoặc bởi vì một activity khác resume lên và đè lên nó.
- Xảy ra sau
onRestart()
nếu activity trở lại từ màn hình tương tác với user hoặconDestroy()
nếu activity này bị biến mất. - Activity trong state này có thể bị kill bởi hệ thống.
** Method ** : onDestroy()
- Được gọi khi acitivity bị destroy
- Đây là phương thức cuối cùng mà activity sẽ được gọi
- Nó có thể được gọi hoặc bởi vì activity đang kết thúc (có ai đó gọi
finish()
) , hoặc bởi vì hệ thống đang tạm thời hủy các instance của activity này để tạo nên không gian mới. - Bạn có thể phẩn biện giữa 2 trường hợp trên với phương thức
isFinishing()
. - Activity trong state này có thể bị kill bởi hệ thống.
Killable States
- Một activities trong trạng thái killable có thể bị dừng bởi hệ thống tại bất kì thời điển nào ngay sau khi phương thức trả về, mà không cần thực hiện thêm bất kì dòng code nào nữa.
- Có 3 phương thức
onPause()
,onStop()
,onDestroy()
là killable onPause()
là phương thức duy nhất đảm bảo sẽ được gọi trước khi process bị kill -onStop()
vàonDestroy()
có thể không được gọi.- Bạn nên sử dụng
onPause()
để lưu trử dữ liệu tạm thời trong bộ nhớ.
Nguồn : Theo bộ Slide - Chapter 03 dạy học Android của Cleveland State University
All rights reserved