Application''s Life Cycle
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. ...
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 cho intents
- end khi instance bị destroyed
- between khi thỉnh thoảng có một vài instance active hoặc inactive, hoặc nếu như mà active thì nó sẽ là visible hay invisible đối với user.
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ọi onCreate() lần đầu tiên với một lần gọi duy nhất phương thức onDestroy().
- 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 trong onDestroy().
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 start
- onResume() được gọi khi một activity được trả về hoặc một intent 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ặc onStop() 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ặc onStop() 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ặc onDestroy() 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