Beginning Android for Application - Chapter 2: Activities, Fragments, Intents
Trong chương 2 bạn sẽ được tìm hiểu về:
- Vòng đời của activity
- Sử dụng fragment để customize (tùy biến) UI
- Sử dụng theme và style cho activities
- Làm cách nào để hiển thị activities như là một dialog windows
- Tìm hiểu định nghĩa về intents
- Sử dụng intent object để link activities
- Intent filter giúp bạn lựa chọn kết nối với các activities khác như thế nào
- Hiển thị alert để thông báo cho người dùng.
gì được tác động ví dụ như một người trong Contacts database. Data được xác định như một URI object. Một vài những action thường gặp là: Một vài những data thường gặp là: Thangit14.blogspot.com Thangit14@gmail.com 57 Chú ý: Phần “Using intent filters” sẽ giải thích các kiểu data mà bạn có thể định nghĩa để sử dụng trong một activity. Nhìn chung, cặp action và data mô tả cách mà hệ điều hành hoạt động. Ví dụ, để gọi một số, bạn cần sử dụng cặp ACTION_DIAL/tel:+651234567. Để hiển thị list danh bạn đc lưu trữ trong điện thoại, bạn sử dụng cặp ACTION_VIEW/content://contacts. Để lấy một contact từ danh bạn, bạn sử dụng cặp ACTION_PICK/content://contacts. Ở button đầu tiên, bạn tạo một Intent object và sau đó truyền 2 tham số vào constructor: Hằng số android.content.Intent.ACTION_VIEW thực chất tham chiếu đến action :”android.intent.action.view”, vì thế dòng lệnh trên có thể được viết như sau: Hoặc có thể viết tách ra: Ở đây, bạn set data sử dụng phương thức setData(). Ở button thứ 2, bạn gọi đến một số điện thoại bằng việc truyền số điện thoại vào data: Trong trường hợp này, dialer sẽ hiển thị number được gọi. Người dùng phải ấn vào dial button để gọi. Nếu bạn muốn thực hiện cuộc gọi trực tiếp mà không cần tương tác với người dùng thì dòng lệnh như sau: Thangit14.blogspot.com Thangit14@gmail.com 58 Chú ý: Nếu bạn muốn ứng dụng thực hiện một cuộc gọi đến một số xác định, bạn cần thêm android.permission.CALL_PHONE permision vào ứng dụng của bạn. Để hiển thị dialer mà không cần chỉ ra số cần gọi, cách đơn giản là bạn chỉ cần bỏ qua phần data: Button thứ 3 hiển thị một map sử dụng ACTION_VIEW Thay vì sử dụng “http” bạn sử dụng cấu trúc “geo” Hiểu rõ về Intent Object. Giờ thì bạn đã biết cách sử dụng Intent Object để gọi activity khác. Bây giờ chính là thời điểm để tóm tắt và tìm hiểu kĩ hơn về cách mà Intent Object thực hiện. Đầu tiên, bạn đã học cách gọi một activity khác bằng cách truyền một action đến constructor của Intent object: Action (“net.learn2develop.SecondActivity”) được gọi như là component name. Nó được sử dụng để xác định activity/application mà bạn muốn gọi. Bạn cũng có thể dùng conponent name bằng cách chỉ ra class name của activity : Bạn cũng có thể tạo ra một Intent Object bằng cách truyền một action constain và data: Action xác định xem bạn muốn làm gì, trong khi data chứa data được gửi đến activity để nó có thể làm gì đó tiếp theo. Bạn có thể truyền data vào Intent object sử dụng setData() method: Thangit14.blogspot.com Thangit14@gmail.com 59 Trong ví dụ này, bạn muốn view một web page. Android OS sẽ tìm kiếm tất cả activities có thể thực hiện request của bạn. Chức năng này được biết như là intent resolution. Phần tiếp theo chúng ta sẽ thảo luận thêm về cách mà các activities của bạn có thể được gọi bởi các activities khác. Với một vài intent, không cần thiết phải đưa vào data. Ví dụ, để select một contact trên danh bạn, bạn xác định action và sau đó chỉ ra dạng của MIME sử dụng method setType(): Chú ý: Chương 7 sẽ thảo luận làm cách nào để sử dụng Contacts Application, Phương thức setType() chỉ ra rõ ràng kiểu dữ liệu của MIME để xác định kiểu data để trả về. MIME type cho ContactsContrac.Contacts.CONTENT_TYPE là “vnd.android.cursor/contact”. Bên cạnh việc chỉ ra action, data, type, một Intent object còn có thể xác định một category. Một category nhóm những activities thành một đơn vị logic để Android có thể sử dụng nó cho quá trình filtering tốt hơn. Chương tiếp theo sẽ tiếp tục thảo luận về categories. Tóm lại, một Intent object có thể bao gồm những thông tin sau: Thangit14.blogspot.com Thangit14@gmail.com 60 Sử dụng Intent Filters. Phần trước, bạn đã thấy cách môt activity có thể gọi ra bởi một activity khác sử dụng Intent object. Để cho các activities khác có thể gọi activity của bạn, bạn cần chỉ ra action và category trong thẻ trong file AndroidManifest.xml Đây là một ví dụ đơn giản nhất, hãy xem xét những ví dụ khác, phức tạp hơn: Thangit14.blogspot.com Thangit14@gmail.com 61 Thangit14.blogspot.com Thangit14@gmail.com 62 Thangit14.blogspot.com Thangit14@gmail.com 63 Phân tích hoạt động: Trong ví dụ này, bán đã tạo ra một activity mới có tên MyBrowserActivity. Đầu tiên, bạn cần phải khai báo trong file AndroidManifest.xml Trong element, bạn khai báo nó với 2 action, one category, và một data. Điều này có nghĩa là tất cả các activities khác có thể gọi activity này sử dụng một trong 2 action: “android.intent.action.VIEW” hoặc “net.learn2develop.MyBrowser”. Với tất cả các activities mà bạn muốn gọi tới nó thì sử dụng phương thức startActivity() hoặc startActivityForResult(), và chúng cần phải có “android.intent.category.DEFAULT” category. Nếu không, activity của bạn sẽ không được gọi bởi các activity khác. Thẻ xác định kiểu dữ liệu được nhận từ activity. Trong ví dụ này, data được bắt đầu với tiền tố http. Ta cũng có thể viết lại intent filter ở ví dụ này như sau: Thangit14.blogspot.com Thangit14@gmail.com 64 Viết theo cách này sẽ dễ đọc hơn nhiều, và nhóm được các thành phần action, category, filter thành một intent filter. Nếu bây giờ bạn sử dụng ACTION_VIEW action, Android sẽ hiển thị lựa chọn như Figure 2-27 Bạn có thể chọn sử dụng Browser Application hay Intents Application mà bạn đã viết code. Chú ý rằng khi nhiều activities được match vào Intent object giống như trường hợp này, dialog titled “Complete action using” sẽ xuất hiện. Bạn có thể thay đổi nó bằng cách sử dụng phương thức createChooser() : Điều này sẽ làm xuất hiện như Figure 2-28. Để í rằng lựa chọn “Use by default for this action” sẽ không xuất hiện. Tính năng tích cực khác của việc sử dụng createChooser() là trong trường hợp mà không có activity nào match với Intent object thì ứng dụng của bạn sẽ không bị crash. Nó sẽ hiển thị ra một message như Figure 2-29: Thangit14.blogspot.com Thangit14@gmail.com 65 Adding Categories. Bạn có thể nhóm activities vào những categories bằng cách sử dụng element trong intent filter. Bạn thêm element vào file AndroidManifest.xml như sau: Thangit14.blogspot.com Thangit14@gmail.com 66 Sau đó, bạn thêm dòng code sau để gọi trực tiếp MyBrowserActivity: Bạn đã thêm một category vào Intent object sử dụng method addCategory(). Nếu bạn không làm việc này, activity MyBrowserActivity vẫn sẽ được gọi và nó sẽ match với default category: android.intent.actegoty.DEFAULT. Tuy nhiên, nếu bạn chỉ ra một category không match với category được định nghĩa trong intent filter, thì activity đó sẽ không được chạy. Như bạn thấy, category “net.learn2develop.OtherApps” không match với bất cì category nào trong intent filter, vì thế một run-time exception sẽ được ném ra( Nếu bạn không sử dụng createChooser() method của Intent class). Để có thể chạy được bạn cần phải thêm intent filter như sau: Bạn có thể nhiều categories vào một Intent object; ví dụ: Thangit14.blogspot.com Thangit14@gmail.com 67 Bởi vì intent filter không định nghĩa net.learn3develop.SomeOtherApps category, nên đọan mã trên sẽ không phù hợp để gọi ra MyBrowserActivity activity. Để chạy được, bạn cần thêm net.learn2develop.SomeOtherApps category vào intent filter. Từ ví dụ này, ta thấy rằng khi sử dụng Intent object với categories, tất cả categories được thêm vào Intent object phải được định nghĩa trong intent filter. Hiển thị Notifications. Cho đến hiện giờ thì chúng ra vẫn đang sử dụng Toast class để hiển thị một message đến người dùng. Toast class là một cách tiện dụng để hiển thị thông báo cho người dùng, nhưng nó không liên tục. Nó sáng trên màn hình vài giây và sau đó biến mất. Nếu nó chứa thông tin quan trọng, người dùng có thể sẽ không nhìn thấy nó. Để hiển thị một message quan trọng, bạn nên sử dụng những phương thức liên tục (presistent method). NotificationManager được dùng để hiển thị một persistent message, được gọi là status bar (cũng có thể gọi là notification bar), Thangit14.blogspot.com Thangit14@gmail.com 68 Thangit14.blogspot.com Thangit14@gmail.com 69 Thangit14.blogspot.com Thangit14@gmail.com 70 Phân tích hoạt động: Để hiển thị một motification, đầu tiên, bạn tạo một Intent object để chỉ đến Notificaiont class. Thangit14.blogspot.com Thangit14@gmail.com 71 Intent này được sử dụng để gọi ra một activity khác khi người dùng chọn một notificaion từ list hiển thị trên màn hình. Ở đây, bạn đã thêm một cặp name/value vào Intent object vì thế bạn có thể nhận dạng notification ID, xác định notification được gửi đến activity nào. ID này sẽ được sử dụng để dismiss notification sau này. Bạn có thể cần tạo ra một PendingIntent object. Một PendingIntent object giúp bạn thực hiện một action thay cho ứng dụng của bạn, thường vào thời điểm cuối cùng, bất kể ứng dụng của bạn có đang chạy hay không. Phương thức getActivity() lấy về một PendingIntent object và cần phải truyền vào các tham số sau: Sau đó tạo ra instance của NotificationManager và Notification class. Notificaion cho phép bạn chỉ ra notification Sau đó bạn mô tả chi tiết về notificaion sử dụng setLatestEventInfo(): Thangit14.blogspot.com Thangit14@gmail.com 72 Cuối cùng, ta hiển thị notification bằng phương thức notify(): Khi người dùng clicks trên notification, thì NotificationView activity sẽ được khởi chạy. Ở đây, bạn sẽ dismiss notification sử dụng cancel() method và truyền vào đó ID của notification ( được truyền vào thông qua Intent object). Tổng kết: Trong chương này chúng ta đã tìm hiểu về các activities và fragments hoạt động ra sao. Bạn cũng được tìm hiểu về cách hiển thị dialog window sử dụng activities. Phần thứ 2 của chương đã giải thích một định nghĩa rất quan trọng trong Android: Intent. Intent chính là ‘glue’ (chất kết dính, gắn kết), cho pheps cacs activities khác có thể tiếp tục. Thangit14.blogspot.com Thangit14@gmail.com 73
File đính kèm:
- Beginning Android for Application - Chapter 2 Activities, Fragments, Intents.pdf