You are on page 1of 48

CH2: ANDROID SKELETON Ths.

Vũ Tuấn Anh
VÀ HOẠT ĐỘNG P3
MỤC LỤC
2.1 Giới thiệu các thành phần của ứng dụng (Activities, Service, Intent,
Content Providers) và các loại khác của các ứng dụng : standalone,
widget, background ...
2.2 Lifecycle của ứng dụng Android
2.3 Sử dụng các tài nguyên bên trong và bên ngoài
2.4 Tạo mới Activities, kết nối các Activity bằng cách dùng Intent
2.5 Giới thiệu Fragments
2.6 Làm việc với Notifications
2.7 Trạng thái chuyển tiếp hoạt động và lifecycle : stack, queue, kiểm
soát thay đổi state và lifetime
2.5 GIỚI THIỆU FRAGMENTS

Một số khái niệm cơ bản


Trong các ứng dụng android, tại một thời điểm, chỉ có một Activity được hiển thị
duy nhất trên màn hình. Chúng ta muốn chia màn hình ra nhiều phần để dễ sử dụng
thì fragment đáp ứng điều đó
Fragment là một thành phần android độc lập, được sử dụng bởi một activity, giống
như một sub-activity. Fragment có vòng đời và UI riêng. Các Fragment thường có
một file java đi kèm với file giao diện xml. Các fragment không có file giao diện
xml thường được gọi là headless fragments.
Fragment sử dụng method getActivity() để lấy ra Activity bố
Fragment được định nghĩa trong file xml của activity (static definition) hoặc có thể
sửa đổi fragment khi đang chạy (dynamic definition)
2.5 GIỚI THIỆU FRAGMENTS
2.5 GIỚI THIỆU FRAGMENTS

onAttach(): hàm này thực hiện tạo tham chiếu từ một fragment đến activity đã khởi
tạo nó, và thực hiện một số bước trong quá trình khởi tạo
onCreate(): thực hiện khởi tạo fragment
onCreateView(): thực hiện tạo giao diện(view), trả về view là giao diện file xml
tương ứng fragment. ko nên tương tác với activity trong hàm này bởi vì activity chưa
được khởi tạo đầy đủ. Không cần thực hiện hàm này với các fragment không có
header
onActivityCreated(): thực hiện hoàn thành nốt việc khởi tạo activity và fragment.
Trong bước này chúng ta có thể gọi findViewById()
2.5 GIỚI THIỆU FRAGMENTS

onStart(): thực hiện việc hiển thị fragment lên màn hình
onResume(): fragment chính thức hoạt động hoàn toàn
onPause(): fragment bị tạm dừng hoạt động, nó vẫn có thể được nhìn thấy
onStop(): fragment bị ẩn
onDestroyView(): giao diện(view) của fragment bị hủy. Nếu nó được gọi quay lại,
nó sẽ quay trở lại thực hiện hàm onCreateView()
onDestroy(): bị hủy
onDetach(): bị hủy hoàn toàn
2.5 GIỚI THIỆU FRAGMENTS

Static Fragment Static Fragment là kiểu fragment được khai báo (định nghĩa) trực
tiếp trong file activity_main.xml Ví dụ ta có 2 static fragment
là Fragment1.java(fragment1.xml) và Fragment2.java(fragment2.xml) Trong
file activity_main.xml khai báo tĩnh:
2.5 GIỚI THIỆU FRAGMENTS

Chú ý: Bắt buộc phải có thuộc tính android:id. Nếu không sẽ gây lỗi. Hai
class Fragment1.java và Fragment2.java phải extends Fragment Và phải ghi đè
phương thức onCreateView():
2.5 GIỚI THIỆU FRAGMENTS

Làm Bài Tập 2 về Fragment:


https://www.youtube.com/watch?v=ErAj4YTxNgQ
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Tổng quan về Notification


Một notification là một thông điệp mà Android hiển thị bên ngoài giao diện ứng
dụng của bạn để cung cấp cho người dùng lời nhắc, tin nhắn, hay bất kỳ thông tin gì
từ ứng dụng của bạn. Người dùng có thể nhấn vào notification để mở ứng dụng,
hoặc thực hiện một hành động trực tiếp trên notification như gửi tin nhắn.
Bài viết này sẽ hướng dẫn bạn tạo một notification với với nhiều đặc tính khác nhau
cho Android 4.0 (API level 14) hoặc cao hơn.
Chú ý là code trong bài viết này mình sử dụng NotificationCompat APIs từ thư viện
hỗ trợ của Android. APIs này cho phép bạn thêm các đặc tính mới thích hợp chỉ hỗ
trợ trong các phiên bản mới của Android nhưng vẫn cung cấp các tinh năng phù hợp
cho Android 4.0 (API level 24).
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Thêm thư viện hỗ trợ


Mặc dù hầu hết các project tạo với Android Studio đã có đầy đủ các depencies cần
thiết để sử dụng NotificationCompat, bạn lên kiểm tra lại build.gradle có bao gồm
dependency dưới đây không:

Chú ý: Các thư viện trong nhóm com.android.support cũng bao gồm support-
compat. Nên nếu bạn đã sử dụng thư viện hỗ trợ APIs khác, bạn có thể đã có quyền
truy cập tới NotificationCompat mà không cần thêm dependency như ở trên.
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Tạo một Notification đơn giản


Một notification ở dạng đơn giản (còn gọi là biểu mẫu thu gọn) hiển thị một icon,
một tiêu đề, và một phần nhỏ nội dung. Trong phần này mình sẽ nói về cách để tạo
một notification mà người dùng có thể ấn vào để mở ra một activity ở ứng dụng của
bạn.
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Gán nội dung cho notification


Để bắt đầu, bạn cần gán nội dung và chanel cho notification sử dụng đối
tượng NotificationCompat.Builder. Ví dụ dưới đây sẽ chỉ ra cách bạn gán nội dung
cho
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Notification:
Small icon: Nó là cần thiết và được gắn qua setSmallIcon().
App name: Nó được cung cấp bởi hệ thống.
Timestam: Nó được cung cấp bởi hệ thống, nhưng bạn có thể override với setWhen() hoặc
không hiển thị với setShowWhen(false).
Large icon: Nó không bắt buộc phải có (nó thường được sử dụng các hình ảnh liên lạc,
không sử dụng nó cho icon ứng dụng của bạn) và gán nó qua setLargeIcon().
Title: Nó là không bắt buộc và gán nó qua setContentTitle().
Text: Nó không bắt buộc bạn có thể gán nó qua setContentText(). Để gán quyền ưu tiên cho
một notification bạn gán qua setPriority(). Giá trị priority xác định mức độ được hiển thị
trong các tình huống khác nhau trong Android 7.1 hoặc thấp hơn. (Với Android 8.0 hoặc cao
hơn, bạn phải gán giá trị chanel importance - sẽ được trình bày ở phần dưới đây.)
2.6 LÀM VIỆC VỚI NOTIFICATIONS
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Chú ý rằng hàm khởi tạo của Notification.Builder yêu cầu bạn truyền vào một
chanel ID. Nó được yêu cầu để tương thích với Android 8.0(API level 26) hoặc cao
hơn, nhưng nó sẽ bị lờ đi ở các phiên bản cũ hơn (nếu bạn không truyền vào chanel
ID các thiết bị Android 8.0 hoặc hơn sẽ không hiển thị notification).
Mặc định, nội dung của notification bị cắt bỏ một phần để vừa vào một dòng. Nếu
bạn muốn notification của bạn nhiều nội dung hơn, bạn có thể sử dụng setStyle(). Ví
dụ:
2.6 LÀM VIỆC VỚI NOTIFICATIONS
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Tạo một chanel và gán giá trị importance


Trước khi bạn có thể một tạo ra một notification ở Android 8.0 và cao hơn, bạn phải
đăng ký notification channel với hệ thống qua một instance
của NotificationChannel để createNotificationChannel(). Bạn hãy xem ví dụ dưới
đây để hiểu hơn:
2.6 LÀM VIỆC VỚI NOTIFICATIONS
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Bạn nên thực hiện đoạn code trên ngay khi ứng dụng của bạn bắt đầu và bạn có thể
thực hiện đoạn code trên lặp lại nhiều lần mà không gây lỗi gì.
Chú ý rằng hàm khởi tạo của NotificationChanel yêu cầu một giá trị importance,
giá trị importance này bạn có thể lấy một hằng số từ NotificationManager. Giá trị
này xác định notification được hiển thị không trong các trường hợp khác nhau, bạn
vẫn lên gán cả priority cho Android 7.1 hoặc thấp hơn. Mặc dù bạn phải gán giá trị
importance/prioty, nhưng hệ thống không đảm bảo việc hiện thị notification của bạn.
Trong một số trường hợp hệ thống có thể thay đổi giá trị importance dựa vào các yếu
tố khác, và người dùng luôn luôn có thể định nghĩa lại importance cho mối chanel.
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Xử lí sự kiện khi người dùng chạm vào notification


Tất cả các notification lên phản hồi lại hành động chạm vào notification, thường sẽ
mở lên một activity trong ứng dụng của bạn. Bạn cần tạo một context intent định
nghĩa với một pendingIntent và truyền vào setContentIntent().
Bạn xem ví dụ dưới đây:
2.6 LÀM VIỆC VỚI NOTIFICATIONS
2.6 LÀM VIỆC VỚI NOTIFICATIONS
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Chú ý code phía trên gọi đến setAutoCancel(), nó sẽ tự động xóa notification khi
người dùng chạm vào nó.
Phương thức setFlags() sẽ giúp trải nghiệm của người dùng tốt hơn kho mở ứng
dụng của bạn qua notification. Nhưng việc đó tùy thuộc vào kiểu activity mà bạn
muốn chạy, có thể là một trong các điều sau:
Một activity tồn tại dành riêng cho các phản hồi từ notification. Người dùng không
hay điều hướng đến activity nay. Thông thường các activity này được khởi tạo trong
một task mới. Một activity tồn tại trong luồng ứng dụng thông thường trong app của
bạn, trong trường hợp này lên quay lại activity bằng back stack.
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Hiển thị notification


Để hiển thị notification, bạn cần gọi NotificationManagerCompat.notify(), truyền
vào một ID duy nhất cho notification và NotificationCompat.Builder.build(). Ví
dụ:
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Nhớ rằng bạn lên lưu lại notification ID bởi vì bạn sẽ cần nó sau này cho việc chỉnh
sửa hoặc xóa notification.
Chú ý: Bắt đầu từ Android 8.1 (API level 27), ứng dụng của bạn không thể phát âm
thanh nhiều lần cho các notification trong một giây. Nếu ứng dụng của bạn tạo ra
nhiều notification trong một giây, thì tất cả các notification sẽ xuất hiện, nhưng chỉ
notification đầu tiền tại mỗi giây phát ra âm thanh.
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Thêm action buttons


Một notification có thể cung cấp tối đa ba action button cho phép người dùng phản hồi
nhanh, chẳng hạn như báo lại lời nhắc, hoặc thậm chí trả lời tin nhắn văn bản.

Để thêm một button, truyền một PendingIntent vào phương thức addAction(). Thay vì mở
một activity, bạn có thể bắt đầu một BroadcastReceiver để thực hiện một việc dưới
background mà không làm gián đoạn ứng dụng đang chay của bạn. Ví dụ:
2.6 LÀM VIỆC VỚI NOTIFICATIONS
2.6 LÀM VIỆC VỚI NOTIFICATIONS
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Thêm một hành động trả lời trực tiếp


Việc phản hồi trực tiếp trên notification, được giới thiệu từ Android 7.0 (API level
24), nó gửi nội dung này đến ứng dụng của bạn mà không cần mở một activity. Ví
dụ, bạn có thể để người dùng trả lời tin nhắn trực tiếp trên notification.
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Thêm một button phản hồi


Tạo một instance của RemoteInput.Builder để thêm một button. Hàm khởi tạo của
phương thức này yêu cầu một biến string được hệ thống sử dụng như một khóa cho
dữ liệu nhâp vào. Ví dụ:
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Tạo một PendingIntent cho button phản hồi.


2.6 LÀM VIỆC VỚI NOTIFICATIONS

Chú ý: Nếu bạn sử dụng lại PendingIntent, người dùng có thể phản hồi cuộc trò
chuyện với nội dung khác như người dùng nhập. Bạn phải cung cấp các request code
khác nhau cho mỗi cuộc trò chuyện hoặc cung cấp một intent không trả về true khi
người dùng gọi equal() trong intent phản hồi của bất cứ cuộc trò chuyện nào khác.
Conversation ID thường được thêm bundle của intent.
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Gán đối tượng RemoteInput vào addRemoteInput().


2.6 LÀM VIỆC VỚI NOTIFICATIONS

Đưa ra thông báo:


2.6 LÀM VIỆC VỚI NOTIFICATIONS

Lấy thông tin phản hồi từ người dùng


Để lấy thông tin mà người dùng nhập từ notification,
gọi RemoteInput.getRsultsFromIntent(), thông qua Intent nhận
từ BroadcastReceiver:
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Sau khi bạn xử lí dữ liệu, bạn phải cập nhật lại notification bằng cách
gọi NotificationManagerCompat.notify() với cùng một ID hoặc tag(nếu sử dụng).
Việc này cần thiết để che đi giao diện phản hồi và xác nhận với người dùng là phản
hồi của họ đã được gửi đi.
2.6 LÀM VIỆC VỚI NOTIFICATIONS
2.6 LÀM VIỆC VỚI NOTIFICATIONS
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Hiển thị notification khi khóa màn hình


Để kiểm soát mức độ hiển thị của của notification từ màn hình khóa, bạn
gọi setVisibility() và có các giá trị cụ thể sau:
VISIBILITY_PUBLIC hiển thị đầy đủ nội dung của notification.
VISIBILITY_SECRET không hiển thị notification ở màn hình khóa.
VISIBILITY_PRIVATE hiển thị các thông tin notification cơ bản, như icon, tiêu
đề, nhưng che đi nội dung.
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Notification sẽ hiển thị cho đến khi một tròn các hành động sau sảy ra:
Người dùng loại bỏ thông báo.
Người dùng chọn vào notification, và bạn gọi vào setAutoCancel() khi bạn tạo
notification.
Bạn gọi cancel() cho một notification ID cụ thể. Phương thức này xóa notification
ngay cả khi nó đang diễn ra.
Bạn có thể gọi cancelAll(), nó sẽ xóa hết tất cả các notification bạn đa tạo ra trước
đó.
Nếu bạn gán một giá trị timeout khi tạo một notification sử dụng setTimeoutAfter(),
hệ thống sẽ hủy notification sau một thời gian cụ thể.
2.6 LÀM VIỆC VỚI NOTIFICATIONS

Làm bài tập 3 về notification:


https://www.youtube.com/watch?v=KUNXaftGuM8
2.7 TRẠNG THÁI CHUYỂN TIẾP HOẠT ĐỘNG VÀ
LIFECYCLE : STACK, QUEUE, KIỂM SOÁT THAY
ĐỔI STATE VÀ LIFETIME

Lưu và phục hồi trạng thái của Activity trong Android


Tìm hiểu và thực hành cách thức lưu và phục hồi trang thái với các phương
thức onSaveInstanceState, onRestoreInstanceState cũng như đề cập lớp
Bundle
Phần này tạo một ứng dụng đơn giản tên là SaveAndRestoreState để tìm hiểu
việc lưu lại trạng thái của Activity và phục hồi trạng thái của Activity trong
vòng đời hoạt động của nó.
Thực hành Bài tập 4:
https://www.youtube.com/watch?v=3-TP5MD0kE8
2.7 TRẠNG THÁI CHUYỂN TIẾP HOẠT ĐỘNG VÀ
LIFECYCLE : STACK, QUEUE, KIỂM SOÁT THAY
ĐỔI STATE VÀ LIFETIME

Tạo Project - SaveAndRestoreState


Mở Android Studio chọn tạo Project mới, nhập tên ứng dụng
là SaveAndRestoreState
2.7 TRẠNG THÁI CHUYỂN TIẾP HOẠT ĐỘNG VÀ
LIFECYCLE : STACK, QUEUE, KIỂM SOÁT THAY
ĐỔI STATE VÀ LIFETIME

You might also like