Activity và Fragment trong Android
Khi người dùng tương tác với một ứng dụng trên thiết bị Android, họ hầu như luôn luôn tương tác với một Activity, một màn hình đơn nhất trên thiết bị. Sau khi Google phát hành phiên bản Android Honeycomb, các đối tượng Fragment đã được thêm vào hệ điều hành để cho phép sử dụng lại code dễ dàng hơn ...
Khi người dùng tương tác với một ứng dụng trên thiết bị Android, họ hầu như luôn luôn tương tác với một Activity, một màn hình đơn nhất trên thiết bị. Sau khi Google phát hành phiên bản Android Honeycomb, các đối tượng Fragment đã được thêm vào hệ điều hành để cho phép sử dụng lại code dễ dàng hơn và mỗi lần thay đổi nội dung trên màn hình mà không cần phải huỷ/xây dựng lại một Activity mới.
Trong hướng dẫn này, bạn tìm hiểu thêm về các đối tượng Activity và Fragment trên Android, vòng đời của chúng, và khi nào và làm thế nào bạn nên sử dụng chúng trong các ứng dụng của riêng bạn
Là đại diện cho một màn hình với một giao diện người dùng _ Thông thường trong một ứng dụng (Application) sẽ có một hoặc nhiều Activity (bạn hiểu đại khái là các màn hình tương tác giống như Form trong .Net).
– Mỗi một Activity này sẽ có một vòng đời riêng độc lập hoàn toàn với các Activity khác, bạn sẽ hiểu rõ hơn về vòng đời trong phần Life Cycle States. Việc hiểu rõ vòng đời của Activity là rất quan trọng trong việc xử lý thông tin.
– Mỗi một Activity muốn được triệu gọi trong ứng dụng thì bắt buộc nó phải được khai báo trong Manifest
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
Trong đoạn code ở trên, bạn cũng thấy một thẻ intent-filter với một action vàcategory. Mặc dù đi sâu vào chi tiết đối với các phần tử này nằm ngoài phạm vi của hướng dẫn này, nhưng bạn nên biết rằng những dòng bổ sung đó là cách hệ thống nhận biết Activity nào để mở trước tiên khi người dùng chọn ứng dụng của bạn.
Một khi bạn đã tạo ra một Activity, bạn có thể cần kết hợp nó với một tập tin Layout XMLđể bạn có thể dễ dàng sử dụng các đối tượng View từ Layout. Bạn có thể làm điều này trong phương thức onCreate().
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
1.1 Activity life cycle :
Tại thời điểm này, bạn có thể tự hỏionCreate()là gì và lý do tại sao chúng ta sử dụng nó. Phương thức onCreate() là một trong những phương thức kết hợp với vòng đời của Activity. Nó được gọi khi Activity lần đầu được tạo ra. Đây là nơi bạn có thể thực một số bước khởi tạo chung trong Activity của bạn vì nó bảo đảm sẽ được gọi trước tiên trong vòng đời Activity như bạn có thể nhìn thấy dưới đây.
onCreate() Đây là phương thức callback đầu tiên và được gọi khi Activity được tạo đầu tiên onStart() Phương thức callback này được gọi khi Activity trở nên nhìn thấy tới người dùng onResume() Được gọi khi người dùng bắt đầu tương tác với ứng dụng onPause() Activity tạm dừng không nhận input từ người dùng và không thể thực thi bất cứ code nào và được gọi khi activity hiện tại đang được dừng và activity trước đó đang được phục hồi onStop() Callback này được gọi trươc skhi activity bị hủy bởi hệ thống onDestroy() Callback này được gọi trươc skhi activity bị hủy bởi hệ thống onRestart() Được gọi khi activity tái khởi động sau khi dừng nó
Một phương thức khác là không thấy có trong biểu đồ ở trên là onSaveInstanceState(). Phương thức này được gọi khi một Activity bị phá hủy và cho phép bạn lưu các thông tin đơn giản trong Bundle. Khi onCreate() được gọi một lần nữa, bạn có thể trích xuất thông tin mà bạn đã lưu trước đó. Điều tương tự cũng có thể được thực hiện từ phương thức onRestoreInstanceState()
– Visible Lifetime:
- sảy ra từ sau 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 (có thể tương tác khi nó là foreground, không tương tác được khi nó không phải foreground như đã giải thích ở trên)
– Foreground Lifetime:
- Sảy ra từ khi gọi onResume –> cho tới lúc gọi onPause : trong suốt thời gian này Activity luôn nằm ở trên cùng và Ta có thể tương tác được với nó
1.2 Activity Stack :
-
Hoạt động theo cơ chế LIFO (LAST IN FIRST OUT)
-
Mỗi Activitymới mở lên nó sẽ ở bên trên Activity cũ
-
Khi mở activity mới thì activity cũ sẽ xảy ra sự kiện onPause và onStop -Nếu mở lên và chỉ làm che khuất một phần activity cũ thì xảy ra sự kiện onPause -/khi gọi lại activity cũ thì nó phải gọi hàm onResume
Được giới thiệu cùng với Android 3.0 (Honeycomb), các đối tượng Fragment là một công cụ tuyệt vời xử lý nhiều vấn đề khi chỉ có các lớp Activity. Fragment cho phép tổ chức các thành phần giao diện người dùng của dự án cho các thiết bị khác nhau bằng cách cho bạn khả năng hiển thị nhiều phần giao diện người dùng trên một màn hình lớn hơn, chẳng hạn như một máy tính bảng, hoặc để hiển thị một cái tại một thời điểm và liên kết chúng với nhau trên thiết bị di động nhỏ.
Chúng cũng giúp phân đoạn code thành khối dễ quản lý, thay vì phải dựa vào các lớp Activity lớn, phức tạp. Một tính năng cuối cùng, và có giá trị nhất, là các Fragment cho phép ứng dụng dễ dàng điều hướng và cung cấp một cách đơn giản để giao tiếp qua lại giữa các phần khác nhau của ứng dụng.
Fragment là một phần giao diện người dùng hoặc hành vi của một ứng dụng. Fragment có thể được đặt trong Activity, nó có thể cho phép thiết kế activity với nhiều mô-đun.
Một số điểm quan trọng về Fragment :
-
Fragment cũng có layout của riêng của nó, cũng có các hành vi và vòng đời riêng.
-
Chúng ta có thể thêm hoặc xóa Fragment trong một Activity trong khi Activity này đang chạy.
-
Có thể kết hợp nhiều Fragment trong một Activity để xây dựng giao diện người dùng đa khung.
-
Một Fragment có thể được sử dụng trong nhiều Activitiy.
-
Vòng đời của Fragment có quan hệ chặt chẽ với vòng đời của Activity đang dùng nó, nghĩa là khi Activity bị tạm dừng thì các Fragment sẽ dừng lại.
-
Fragment có thể thực hiện một hành vi mà không có trong thành phần giao diện người dùng.
-
Fragment được thêm vào API 11 trở lên.
2.1 Vòng đời Fragment
Vòng đời của một Fragment Mỗi Fragment có vòng đời riêng của nó, và vòng đời này giống với vòng đời của một Activity. Giai đoạn 1: Khi một Fragment được tạo, nó sẽ đi qua một số trạng thái:
Giai đoạn 1: Khi một Fragment được tạo, nó sẽ đi qua một số trạng thái:
onAttach() onCreate() onCreateView() onActivityCreated() Giai đoạn 2: Khi một Fragment được hiển thị:
onStart() onResume()
**Giai đoạn 3: ** Khi Fragment chạy ẩn dưới nền:
onPause() onStop() **Giai đoạn 4: **Khi hủy một Fragment:
onPause() onStop() onDestroyView() onDestroy() onDetach()
Các phương thước trong Fragment :
onAttach() :Sự thể hiện (instance) của Fragment được gắn kết với một sự thể hiện của activity. Fragment và Activity không hoàn toàn được khởi tạo. Đặc biệt khi bạn lấy trong phương thức này một tham chiếu tới activity mà sử dụng Fragment cho công việc khởi tạo xa hơn.
onCreate() Hệ thống gọi phương thức này khi tạo Fragment. Bạn nên khởi tạo các thành phần cơ bản của Fragment mà bạn muốn duy trì khi Fragment bị dừng hoặc tạm dừng, sau đó được phục hồi lại.
onCreateView() Hệ thống gọi phương này khi cần Fragment đó để vẽ giao diện UI lần đầu tiên. Để vẽ một UI cho Fragment của bạn, bạn phải trả về một thành phần View từ phương thức này. Đó là root của layout. Bạn có thể trả về null nếu Fragment không cung cấp một giao diện UI.
onActivityCreated() Được gọi sau phương thức onCreateView() khi host activity được tạo. Sự thể hiện của Activity và Fragment đã được tạo cùng với cấu trúc view của activity đó. Tại điểm này, View có thể được truy cập với phương thức findViewById(). Ví dụ, trong phương thức này bạn có thể khởi tạo các đối tượng mà cần một đối tượng Context.
onStart() : khi Fragment hoạt động
onResume() Fragment hoạt động trở lại.
onPause() Hệ thống gọi phương thức này khi có dấu hiệu chỉ rằng người dùng đang rời khỏi Fragment này.
onStop() Fragment đang bị dừng bằng cách gọi phương thức này.
onDestroyView() Fragment view sẽ hủy sau khi gọi phương thức này.
onDestroy() : Được gọi để xóa trạng thái của Fragment.
2.2 Các lớp con của Fragment
Mặc dù lớp Fragment là lớp mạnh mẽ theo cách thức riêng của nó, nhưng nó không thể phát huy hết tiềm năng của nó mà không được mở rộng để phục vụ mục đích của ứng dụng. May mắn thay, Google đã cung cấp rất nhiều các lớp con khác nhau của Fragment để giúp các nhà phát triển nhanh chóng xây dựng các ứng dụng tuyệt vời.
Trong phần này, tôi muốn nêu bật một vài cái trong số chúng để truyền cảm hứng cho bạn xây dựng các lớp Fragment tuyệt vời của riêng bạn. Điều quan trọng cần phải biết được là các Fragment nào được xây dựng sẵn vì vậy bạn sẽ không lặp lại chúng.
ListFragment
Fragment này có tích hợp một ListView bên trong và một số phương thức trợ giúp để làm cho thành phần này nổi bật, chẳng hạn như một ProgressBar không xác định (một vòng tròn, quay liên tục) và TextView để hiển thị văn bản khi List rỗng.
MapFragment
Đây là một Fragment rất có giá trị, gói trong nó một MapView để sử dụng với các dịch vụ Google Maps. Thay vì phải tự mình viết tất cả các code, bạn có thể thừa kế Fragment này để thêm chức năng bản đồ cơ bản vào ứng dụng của bạn.
BrowseFragment và DetailsFragment Cả hai Frament sẵn có này là một phần của Leanback Support Library Android cho TV và chúng xử lý giao diện người dùng và các chức năng cơ bản cho việc phát triển ứng dụng cho một thiết bị TV.
Dù hướng dẫn này không đi sâu vào các lớp Activity và Fragment hoạt động như thế nào, nhưng bây giờ bạn cũng đã biết rằng chúng là các thành phần quan trọng để xây dựng giao diện người dùng cho ứng dụng của bạn. Bạn đã được giới thiệu về vòng đời của các Activity và Fragment, và chúng ta đã xem xét một số lớp con tiện lợi của Fragment có thể giúp bạn xây dựng nên những ứng dụng tuyệt vời.
Khi bạn tiếp tục làm việc với Android, bạn sẽ thấy và được học về nhiều các lớp Activity và Fragment khác nhau sẵn có cho bạn và bạn sẽ không phải mất công, xây dựng lại thành của riêng bạn.