Activity trong Android
Trong Android, Activity biểu thị một màn hình đơn với giao diện người dùng (UI) của ứng dụng và nó sẽ đóng vai trò là điểm nhập cảnh để người dùng tương tác với ứng dụng.
I. Activity Android là gì?
Nói chung, các ứng dụng Android sẽ chứa nhiều màn hình và mỗi màn hình sẽ là một phần mở rộng của lớp Activity. Bằng cách sử dụng các activity, chúng ta có thể đặt tất cả các component UI trong ứng dụng vào một màn hình đơn.
Từ nhiều activity trong ứng dụng Android, một activity có thể được đánh dấu là một main activity và đó là màn hình đầu tiên xuất hiện khởi chạy ứng dụng. Trong ứng dụng Android, mỗi activity có thể bắt đầu một activity khác để thực hiện các hành động khác nhau.
Ví dụ: ứng dụng danh bạ có nhiều activity, trong đó màn hình main activity sẽ hiển thị danh sách các liên hệ và từ màn hình main activity, chúng ta có thể khởi chạy các activity khác cung cấp màn hình để thực hiện một tác vụ như thêm liên hệ mới và tìm kiếm các liên hệ. Tất cả các activity này trong ứng dụng liên hệ bị ràng buộc lỏng lẻo với các activity khác nhưng sẽ phối hợp với nhau để cung cấp trải nghiệm người dùng tốt hơn.
Bài viết này được đăng tại [free tuts .net]
Nói chung, trong Android có sự phụ thuộc tối thiểu giữa các activity trong một ứng dụng. Để sử dụng các activity, chúng ta cần đăng ký thông tin các activity đó trong file manifest (AndroidMainfest.xml) và cần quản lý vòng đời activity đúng cách.
Để sử dụng các activity trong ứng dụng, cần xác định một activity với các thuộc tính bắt buộc trong file manifest (AndroidMainfest.xml) như được hiển thị bên dưới
<?xml version="1.0" encoding="utf-8"?> <manifest …..> <application …..> <activity android:name=".MainActivity" > ……. ……. </activity> ……. </application> </manifest>
Thuộc tính activity android:name sẽ đại diện cho tên của lớp và chúng ta cũng có thể thêm nhiều thuộc tính như icon, label, theme, permissions, v.v. vào một activity.
Trong ứng dụng Android, các activity có thể được triển khai như một lớp con của lớp Activity như dưới đây.
public class MainActivity extends Activity { }
Đây là cách chúng ta có thể sử dụng activity trong ứng dụng Android.
II. Vòng đời của Android activity
Nói chung, các activity trong ứng dụng Android sẽ trải qua một giai đoạn khác nhau trong vòng đời của chúng. Trong Android, lớp Activity có 7 phương thức callback như onCreate (), onStart (), onPause (), onRestart (), onResume (), onStop () và onDestroy () để mô tả cách activity sẽ hoạt động ở các giai đoạn khác nhau.
Bằng cách sử dụng các phương thức callback, chúng ta có thể xác định cách activity hoạt động khi người dùng nhập hoặc rời khỏi ứng dụng.
III. Các phương thức callback trong vòng đời android activity
Trong Android, một activity trải qua một loạt các trạng thái trong suốt cuộc đời của nó. Bằng cách sử dụng các phương thức callback, chúng ta có thể chuyển đổi activity giữa các trạng thái.
Hệ thống Android khởi chạy chương trình trong một Activity bắt đầu bằng cách gọi phương thức callback onCreate (). Có một chuỗi các phương thức callback bắt đầu một activity và một chuỗi các phương thức callback phá bỏ một activity.
Phần này sẽ cung cấp cho bạn thông tin chi tiết về các phương thức callback để xử lý các chuyển đổi activity giữa các trạng thái trong vòng đời.
1. onCreate()
Đây là phương thức callback đầu tiên và nó kích hoạt khi hệ thống tạo ra một activity lần đầu tiên. Trong quá trình tạo activity, activity được đưa vào trạng thái Created.
Nếu chúng ta có cách khởi động ứng dụng chỉ cần thực hiện một lần trong suốt vòng đời của một activity, thì chúng ta có thể viết cách đó trong phương thức onCreate().
Sau đây là ví dụ về việc xác định phương thức onCreate () trong activity.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
Khi phương thức onCreate() , activity sẽ nhập vào trạng thái và hệ thống gọi phương thức onStart().
2. onStart()
Phương thức callback onStart() sẽ gọi khi một activity được nhập vào trạng thái Started bằng cách hoàn thành phương thức onCreate(). Phương thức onStart () sẽ làm cho một activity hiển thị cho người dùng và việc thực hiện phương thức này sẽ kết thúc rất nhanh.
Sau đây là ví dụ về việc xác định phương thức onStart () trong activity.
@Override protected void onStart() { super.onStart() }
Sau khi phương thức onStart() thực hiện xong, activity sẽ chuyển sang trạng thái Resumed và hệ thống gọi phương thức onResume().
3. onResume()
Khi một activity được đưa vào trạng thái , hệ thống gọi phương thức callback onResume (). Trong trạng thái này activity bắt đầu tương tác với người dùng, điều đó có nghĩa là người dùng có thể thấy một phần chức năng và thiết kế của ứng dụng trên màn hình.
Chủ yếu chức năng cốt lõi của một ứng dụng được triển khai theo phương thức onResume ().
Ứng dụng sẽ ở trạng thái này cho đến khi một activity khác xảy ra để gián đoạn ứng dụng như tắt cuộc gọi điện thoại hoặc màn hình, v.v.
Trong trường hợp nếu có bất kỳ sự kiện gián đoạn nào xảy ra ở trạng thái Resumed, activity sẽ được chuyển sang trạng thái Paused và hệ thống sẽ gọi phương thức onPause ().
Sau khi một activity được trả về từ trạng thái Paused về trạng thái Resumed, hệ thống sẽ gọi phương thức onResume () do chúng ta cần triển khai phương thức onResume () để khởi tạo các thành phần mà chúng ta tạo trong phương thức onPause ().
Sau đây là ví dụ về định nghĩa phương thức onResume () trong activity.
@Override public void onResume() { super.onResume(); if (mCamera == null) { initializeCamera(); } }
Nếu có bất kỳ gián đoạn nào xảy ra ở trạng thái Resumed, activity sẽ được chuyển sang trạng thái Paused và hệ thống sẽ gọi phương thức onPause ().
4. onPause()
Bất cứ khi nào người dùng rời khỏi một activity hoặc activity hiện tại đang bị Paused thì hệ thống sẽ gọi phương thức onPause (). Phương thức onPause () được sử dụng để tạm dừng một activity (như dừng phát nhạc) khi activity ở trạng thái paused hoặc chuyển một activity trong khi chuyển từ ứng dụng này sang ứng dụng khác vì mỗi lần chỉ có thể tập trung một ứng dụng.
Sau đây là ví dụ về việc xác định phương thức onPause () trong activity.
@Override public void onPause() { super.onPause(); if (mCamera != null) { mCamera.release(); mCamera = null; } }
Sau khi hoàn thành thực thi phương thức onPause (), phương thức tiếp theo là onStop () hoặc onResume () tùy thuộc vào những gì xảy ra sau khi một activity được đưa vào trạng thái Paused.
5. onStop()
Hệ thống sẽ gọi phương thức onStop () khi một activity không còn hiển thị cho người dùng, khi đó activity sẽ chuyển sang trạng thái Dừng. Điều này xảy ra do activity hiện tại được đưa vào trạng thái Resumed hoặc activity mới được khởi chạy toàn màn hình hoặc activity hiện tại bị hủy.
Phương thức onStop () rất hữu ích để giải phóng tất cả các tài nguyên ứng dụng không còn cần thiết cho người dùng.
Sau đây là ví dụ về định nghĩa phương thức onStop () trong activity.
@Override protected void onStop() { super.onStop(); }
Phương thức callback tiếp theo được hệ thống đưa ra là onRestart (), trong trường hợp nếu activity quay trở lại để tương tác với người dùng hoặc onDestroy (), trong trường hợp nếu activity kết thúc chạy.
6. onRestart()
Hệ thống sẽ gọi phương thức onRestart () khi một activity tự khởi động lại sau khi dừng. Phương thức onRestart () sẽ khôi phục trạng thái activity kể từ thời điểm bị dừng.
Phương thức onRestart () trong activity sẽ luôn được theo sau bởi phương thức onStart ().
7. onDestroy()
Hệ thống sẽ gọi phương thức onDestroy () trước khi một activity bị hủy và đây là phương thức callback cuối cùng mà activity nhận.
Hệ thống sẽ gọi phương thức callback onDestory () này khi activity đang kết thúc hoặc hệ thống phá hủy activity để tiết kiệm không gian.
Sau đây là ví dụ về định nghĩa phương thức onDestroy () trong activity.
@Override public void onDestroy() { super.onDestroy(); }
Phương thức onDestroy () sẽ giải phóng tất cả các tài nguyên không được giải phóng bởi phương thức callback onStop () trước đó.
IV. Sơ đồ vòng đời activity của Android
Nói chung, trong lớp activity Android sử dụng các phương thức callback khác nhau như onCreate (), onStart (), onPause (), onRestart (), onResume (), onStop () và onDestroy () để trải qua các giai đoạn khác nhau của vòng đời activity.
Sau đây là biểu diễn bằng hình ảnh của vòng đời Android Activity cho thấy cách Activity sẽ hoạt động trong các giai đoạn khác nhau bằng phương thức callback.
Bất cứ khi nào người dùng cố gắng rời khỏi một activity như chuyển từ ứng dụng này sang ứng dụng khác, hệ thống sẽ sử dụng các phương thức callback để loại bỏ hoàn toàn hoặc một phần activity để tiếp tục activity từ nơi người dùng rời đi.
Dựa trên các yêu cầu của chúng ta, chúng ta có thể triển khai activity trong ứng dụng Android bằng phương thức callback và không cần thiết phải sử dụng tất cả các phương thức callback trong mỗi ứng dụng Android.
V. Ví dụ về vòng đời activity của Android
Sau đây là ví dụ về việc gọi một phương thức callback activity để xem quy trình vòng đời của một activity trong ứng dụng Android.
Ở đây chúng ta sẽ sử dụng ví dụ về ứng dụng được tạo trước đó và thực hiện một số sửa đổi đối với file MainActivity.java như được hiển thị bên dưới để nắm bắt quy trình bòng đời activity của Android.
1. Code MainActivity.java
Sau đây là các sửa đổi mã được thực hiện để bao gồm tất cả các phương thức callback vòng đời trong file MainActivity.java nằm trong thư mục \ java\com.tutlane.helloworld.
package com.tutlane.helloworld; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("Activity Lifecycle","onCreate invoked"); } @Override protected void onStart() { super.onStart(); Log.d("Activity Lifecycle","onStart invoked"); } @Override protected void onResume() { super.onResume(); Log.d("Activity Lifecycle","onResume invoked"); } @Override protected void onPause() { super.onPause(); Log.d("Activity Lifecycle","onPause invoked"); } @Override protected void onStop() { super.onStop(); Log.d("Activity Lifecycle","onStop invoked"); } @Override protected void onRestart() { super.onRestart(); Log.d("Activity Lifecycle","onRestart invoked"); } @Override protected void onDestroy() { super.onDestroy(); Log.d("Activity Lifecycle","onDestroy invoked"); } }
Nếu bạn quan sát code ở trên, chúng ta đã xác định một câu lệnh như là bộ "setContentView (R.layout.activity_main);" sẽ giúp tải tất cả các component UI được xác định trong file Activity_main.xml và phương thức Log.d () được sử dụng để tạo thông điệp tường trình.
Trong ứng dụng của chúng ta, chúng ta có thể có nhiều hơn một file activity và chúng ta cần khai báo tất cả các activity trong file AndroidManifest.xml. Trong file xml file kê khai bằng cách sử dụng các thuộc tính hành động MAIN và danh mục LAUNCHER trong các bộ lọc intent (<intent-filter>), chúng ta có thể đề cập đến main activity mở ra khi người dùng khởi chạy ứng dụng của chúng ta bằng biểu tượng trình khởi chạy.
Trong trường hợp nếu chúng ta không đề cập đến hành động MAIN, hệ thống sẽ quyết định activity nào cần bắt đầu và nếu chúng ta không thêm danh mục LAUNCHER cho main activity, biểu tượng ứng dụng của chúng ta sẽ không xuất hiện trong danh sách ứng dụng trên màn hình chính.
Mã của file AndroidManifest.xml sẽ giống như được hiển thị bên dưới.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tutlane.helloworld" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
2. Kết quả của ví dụ về vòng đời Android activity
Bây giờ hãy chạy ứng dụng của bạn bằng Thiết bị ảo Android (AVD) trong android studio bằng cách nhấp vào biểu tượng Play trên thanh công cụ hoặc nhấn Shift + F10. Kết quả ứng dụng của chúng ta sẽ giống như dưới đây.
Bây giờ hãy mở Trình giám sát thiết bị Android (Tools -> Android -> Android Device Monitor) để xem các log messages trong cửa sổ LogCat trong android studio như bên dưới.
Nếu bạn quan sát các log messages trong cửa sổ LogCat phương thức onCreate, onStart và onResume được gọi bởi hệ thống.
Bây giờ hãy nhấp vào nút Home trong Android Emulator, ngay lập tức activity được nhập vào trạng thái Resumed và hệ thống sẽ gọi phương thức onPause () như hiển thị bên dưới.
Sau một thời gian, activity sẽ chuyển sang trạng thái Paused và hệ thống sẽ gọi phương thức onStop () như dưới đây.
Bây giờ một lần nữa khởi chạy ứng dụng của chúng ta từ danh sách các ứng dụng trên màn hình chính như dưới đây.
Nếu bạn quan sát các log messages trong cửa sổ LogCat một lần nữa các phương thức onRestart, onStart và onResume được gọi bởi hệ thống như được hiển thị bên dưới.
Bây giờ bấm vào nút Back trong trình giả lập Android, hệ thống sẽ gọi phương thức onPause và sau một thời gian các phương thức onStop, onDestroy sẽ được gọi như dưới đây.
Ở đây chúng ta cần nhớ rằng các phương thức onCreate và onDestroy sẽ chỉ gọi một lần trong suốt vòng đời activity.
Đây là cách quá trình vòng đời Android activity sẽ gọi các phương thức khác nhau trong khi chuyển từ giai đoạn này sang giai đoạn khác.