ݺߣ

ݺߣShare a Scribd company logo
1
ANDROID NÂNG CAOANDROID NÂNG CAO
Bài 5:
NotificationNotification
Multi-ResolutionMulti-Resolution
Multi-LanguageMulti-Language
2
Nội dung bài học
● Notification.
● Muilti-Resolution.
● Multi-Language.
3
Nội dung bài học
● Notification.
● Muilti-Resolution.
● Multi-Language.
4
Notification
● Giới thiệu về Notification.
● Hiện thực Notification.
● Notification Queue.
● Cập nhật Notification.
● Xoá Notification.
● Rung điện thoại khi notify .
● Chớp đèn khi notify.
● Phát âm thanh khi notify.
● Customize notification.
● Best practices.
5
Giới thiệu về Notification
● Notification là một cơ chế cho phép tại một thời điểm nhất định
trình bày một thông tin trên thanh trạng thái (status bar) ở phía
trên màn hình.
● Mỗi khi thanh trạng thái được mở ra thì một danh sách
những notification được hiển thị, khi người dùng click vào
một notification thì có thể một Activity được kích hoạt.
6
Giới thiệu về Notification
● Một Nofication thông thường gồm các thành phần sau đây:
(1) Một icon (xuất hiện trên status bar và ở nội dung chi tiết
của notification)
(2) Ticker text (xuất hiện trên status bar).
(3) Notification title text (xuất hiện ở nội dung chi tiết).
(4) Notification body text (xuất hiện ở nội dung chi tiết).
(5) Một intent (launch Activity khi user click vào nội dung
chi tiết).
(1)
(2)
(3)(4)
7
Hiện thực Notification
1.Get NotificationManager
2.Tạo đối tượng Notification.
3.Tạo PendingIntent.
4.Thêm thông tin về Notification event.
5.Trình bày notification.
8
Hiện thực Notification
1.Get NotificationManager:
Tất cả các Notification được tạo ra nhờ lớp
NotificationManager (package android.app). Để
có được đối tượng NotificationManager ta thực
hiện như sau:
9
Hiện thực Notification
2.Tạo đối tượng Notification:
● Cách cũ: Sử dụng constructor của lớp Notification,
resource id của icon, ticker text, thời gian (ms).
● Cách mới: Sử dụng Notification.Builder
Notification notification = new Notification.Builder(mContext)
.setTicker("Ticker Text”)
.setSmallIcon(R.drawable.icon)
.setWhen(System.currentTimeMilis())
.build();
10
Hiện thực Notification
3.Tạo PendingIntent: Khi người dùng click vào
nội dung chi tiết của notification trong danh sách
thì intent này được xử lý
● PendingIntent.getActivity có 4 tham số:
● Tham số 1: Context.
● Tham số 2: Request code, không dùng và thường là 0.
● Tham số 3: Intent cần xử lý.
● Tham số 4: Intent flag (Xem thêm ở PendingIntent), nếu
không dùng thì truyền 0.
11
Hiện thực Notification
4.Thêm thông tin về Notification event:
Cách cũ:
● Sử dụng phương thức Notification#setLatestEventInfo để
thêm các thông tin về notification event.
● Phương thức có 4 tham số:
● Tham số 1: Context.
● Tham số 2: Notification title text.
● Tham số 3: Notification body text.
● Tham số 4: PendingIntent.
12
Hiện thực Notification
4.Thêm thông tin về Notification event:
Cách mới:
● Sử dụng phương thức Notification.Builder để build
Notification ở bước 2 và set các tham số cần thiết. Tức là
bước 2 và bước 4 gộp lại thành 1 bước và thực hiện sau
bước 3.
Notification notification = new Notification.Builder(mContext)
.setTicker("Ticker Text”)
.setContentTitle(“Title text)
.setContentText(“Body text”)
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.icon)
.setWhen(System.currentTimeMillis())
.build();
13
Hiện thực Notification
5.Trình bày notification:
● Sử dụng phương thức NotificationManager#notify để
trình bày notification.
● Phương thức có 2 tham số:
● Tham số 1: The notification id.
● Tham số 2: Notification object.
14
Notification Queue
● Khi chúng ta gọi phương thức
NotificationManager#notify thì hệ thống sẽ tìm
trong queue xem có notification nào có cùng id
hay không.
● Nếu có thì notification cũ được cập nhật.
● Nếu không thì notification mới được tạo ra.
● Notification id chỉ cần duy nhất trong 1 ứng
dụng.
15
Cập nhật Notification
● Sử dụng phương thức
NotificationManager#notify với id cùng với id
của notification mà chúng ta muốn cập nhật.
● Việc cập nhật notification giúp cho danh sách
notification không chứa quá nhiều notification,
khó quản lý.
16
Xoá Notification
● Sau khi pending intent được kích hoạt, thường
chúng ta cần xoá notification khỏi danh sách. Sử
dụng phương thức NotificationManager#cancel
với tham số là notification id.
● Nếu chúng ta muốn hệ thống tự động xoá
notification khỏi notification queue khi pending
intent được kích hoạt, sử dụng notification flag
Notification.FLAG_AUTO_CANCEL
notification |= Notification.FLAG_AUTO_CANCEL
17
Rung điện thoại khi notify
● Để gây chú ý cho người dùng khi ở môi trường
ồn ào mà không thể dùng âm thanh để cảnh báo
thì rung điện thoại là phương pháp phù hợp nhất.
● Để rung điện thoại khi notify:
● Set quyền trong AndroidManifest.xml:
<uses-permission android:name="android.permission.VIBRATE" />
● Set vibrate pattern:
notification.vibrate = new long[] {0, 200, 200, 600, 600};
● Set notification flag để giữ lại cho đến khi nào
người dùng click vào thông tin chi tiết của
notification:
notification.flags |= Notification.FLAG_INSISTENT;
18
Chớp đèn khi notify
● Chớp đèn khi notify là cách gây chú ý cho người
dùng một cách yên lặng nhất.
● Để chớp đèn khi notify:
● Set notification flag:
notification.flags |= Notification.FLAG_SHOW_LIGHTS;
● Set màu của đèn, thời gian (ms) đèn sáng và thời
gian (ms) đèn tắt:
notification.ledARGB = Color.GREEN;
notification.ledOnMS = 1000;
notification.ledOffMS = 1000;
● Màu đèn là màu bất kỳ tuy nhiên tuỳ theo phần
cứng mà màu thực tế đôi khi không giống màu
mong đợi
19
Chớp đèn khi notify
● Đèn sẽ chớp đến khi nào người dùng xoá notification
khỏi notification queue. Do đó
Notification.FLAG_INSISTENT là không cần thiết ở
đây.
20
Phát âm thanh khi notify
● Không có gì có thể thu hút sự chú ý của người dùng
bằng phương pháp phát đoạn nhạc hay âm thanh.
● Để phát âm thanh khi notify chúng ta thực hiện như
sau:
● Cấu hình audio stream type:
notification.audioStreamType =
AudioManager.STREAM_NOTIFICATION;
● Chỉ ra tập tin âm thanh cần phát:
notification.sound =
Uri.parse("android.resource://com.example.samplenotificatio
n/" +R.raw.samplesound);
● Âm thanh chỉ phát một lần, muốn lặp lại thì cần bật cờ:
notification.flags |=Notification.FLAG_INSISTENT
21
Customize Notification
● Customize Notification thông qua RemoteViews
● Bước này đã thay setLatestEventInfo, để set
PendingIntent cho notification chúng ta dùng:
notification.contentIntent = pendingIntent;
22
Best Practices
● Sử dụng notification khi chương trình không ở
foreground ngược lại nên dùng Toast, Dialog.
● Cho phép người dùng chọn lựa loại notification (văn
bản, âm thanh, chớp đèn, rung), tần suất notification,
sự kiện kích hoạt notification.
● Nếu được nên sử dụng notification đã có thay vì tạo
mới.
● Xoá notification khi có thể.
● Khi không xác định được nên sử dụng polite
notification.
● Notification chứa thông tin hữu ích trong ticker text,
title text, body text.
23
Bài tập 08
Viết lại bài tập 07 không dùng Toast để thông
báo mà sử dụng Notification.
24
Multi-Resolution
● Density& Screen Size
● DIP
● Scaling
● Tips
25
Density & Screen Size
● Các thiết bị Android được phân loại dựa vào density và screen
size (kích thước màn hình, tính bằng inch)
● Density được đo bằng đơn vị DPI (dot per inch, số lượng điểm
ảnh trên 1 inch chiều dài). Dựa vào density người ta chia thiết bị
Android thành 4 loại như bảng bên dưới.
● Ứng với mỗi loại density thì Android cung cấp một thư mục để
tải ảnh phù hợp với density đó.
● Thư mục res/drawable-nodpi dùng để lưu các ảnh không phụ
thuộc vào density, nó được dùng cho tất cả các loại density
Loại DPI DPI chuẩn Thư mục hình ảnh
Low Density (ldpi) 100-140 120 res/drawable-ldpi
Medium Density (mdpi) 140-180 160 res/drawable-mdpi
High Density (hdpi) 190-250 240 res/drawable-hdpi
Extra High Desnsity (xhdpi) > 250 320 res/drawable-xhdpi
(1.33mdpi) 180-190 res/drawable-tvdpi
26
Density & Screen Size
● Dựa vào kích thước màn hình người ta cũng chia thiết bị
Android thành 4 loại
● Đối với mỗi loại kích thước màn hình Android cung cấp một thư
mục chứa các layout tương ứng cho loại màn hình đó.
● Thư mục res/drawable-nodpi dùng để lưu các ảnh không phụ
thuộc vào density, nó được dùng cho tất cả các loại density
Loại Kích thước Thư mục layout
Small Screen < 3'' res/layout-small
Normal Screen 3'' – 4'' res/layout
Large Screen 4'' – 7'' res/layout-large
Extra Large Screen 7'' – 10'' res/drawable-xlarge
27
DIP
● Thông thường khi đo kích thước người ta dùng đơn vị
px(pixel,điểm ảnh). Tuy nhiên đơn vị này lại phụ thuộc vào
density.
● Để khắc phục điểm này, Android đưa ra khái niệm DIP (density
independent pixel). Đơn vị của DIP là dip hay dp.
● Công thức quy đổi: pixels = dips *density/160.
● Scale-independent pixel (sp) là một khái niệm tương tự như DIP
nhưng bên cạnh không phụ thuộc vào density thì nó còn không
phụ thuộc vào font size của người dùng. 1sp = 1dp.
● Lưu ý vì Java không có hai khái niệm này do đó khi dùng Java
trong chương trình Anhdroid cần chuyển đổi 2 đơn vị này như
công thức trên.
28
Một số size qualifier mới
Cấu hình Qualifier Layout directory
smallestWidth sw<N>dp res/layout-sw<N>dp
Available screen width w<N>dp res/layout-w<N>dp
Available screen height h<N>dp res/layout-h<N>dp
● Hỗ trợ từ Android 3.2+
● Xem thêm các cấu hình sau:
● android:requiresSmallestWidthDp
● android:compatibleWidthLimitDp
● android:largestWidthLimitDp
29
Scaling
● Nếu hình ảnh trong thư mục tương ứng với loại density không
tìm thấy mà tìm thấy trong thư mục res/drawable. Thì hình ảnh
này sẽ bị scaling theo tỉ lệ như sau:
● Low density = 0.75
● Medium density = 1
● High density = 1.5
● Extra high density = 2.0
xhdpi(2.0x)
hdpi(1.5x)
mdpi(baseline)
ldpi(0.75x)
30
Tips
● Sử dụng “wrap-content”, “fill-parent” (or “match-parent” từ Android
2.2+) để chỉ định kích thước của layout. Trong trường hợp cần đưa
con số cụ thể dùng đơn vị “dp” cho độ dài và “sp” cho font size.
● Chuẩn bị ảnh phù hợp cho các loại density.
● Chuẩn bị layout phù hợp cho các loại screen size.
● Không dùng AbsoluteLayout → RelativeLayout.
● Chuyển đổi dp, sp sang px dùng công thức chứ không hardcode trong
Java.
● Test sử dụng emulator sử dụng bảng bên dưới
31
Multi-Languge
● Sử dụng cấu hình ngôn ngữ của thiết bị, resource files
đặt trong thư mục tương ứng res/values-[mã ngôn
ngữ] hoặc res/values-[mã ngôn ngữ]-r[mã vùng]
● Nếu các thư mục trên không tồn tại thì thư mục
res/values được sử dụng.
32
Bài tập 09
Tìm hiểu và viết chương trình demo cho “force
language” (thay đổi ngôn ngữ chương trình từ
chọn lựa ngôn ngữ của người dùng mà không
phụ thuộc vào cấu hình của thiết bị).
Nguyen Huu Phuoc, MEng.
●  Blog:http://folami.nghelong.com
●  Website http://phuocnh.nghelong.com
Ad

Recommended

Android Nâng cao-Bài 3: Broadcast Receiver
Android Nâng cao-Bài 3: Broadcast Receiver
Phuoc Nguyen
Android Nâng cao-Bài 6-Multi theme-adb tool-jUnit
Android Nâng cao-Bài 6-Multi theme-adb tool-jUnit
Phuoc Nguyen
IT120-5. Broadcast Receiver
IT120-5. Broadcast Receiver
MultiUni
Android location sensor programming
Android location sensor programming
Phuoc Nguyen
Android Nâng cao-Bài 4: Content Provider
Android Nâng cao-Bài 4: Content Provider
Phuoc Nguyen
Auto it (upload_by_nguyentin2703)
Auto it (upload_by_nguyentin2703)
Trường Sơn Trần
5. broadcast receiver
5. broadcast receiver
Justin Hoang
Android chapter22-services
Android chapter22-services
manhvokiem
Android Nâng cao-Bài 8-JSON & XML Parsing
Android Nâng cao-Bài 8-JSON & XML Parsing
Phuoc Nguyen
Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development
Phuoc Nguyen
Android ios wp7
Android ios wp7
TechMaster Vietnam
Android chapter03-life-cycle
Android chapter03-life-cycle
Love Ga Nhok Mitom
Android presentation
Android presentation
Nguyen Duong
Google Android Security (Basic2Advanced)
Google Android Security (Basic2Advanced)
Giap Le Van
IT120-1. Giới thiệu về Android SDK
IT120-1. Giới thiệu về Android SDK
MultiUni
Android chapter03-life-cycle
Android chapter03-life-cycle
Vu Dang
Basic Sqlite in Android
Basic Sqlite in Android
yuchi_1k91 Pit
ݺߣ hội thảo Google Android BKHN 26-10
ݺߣ hội thảo Google Android BKHN 26-10
Giap Le Van
Android OS
Android OS
Phanxico Lê Công Viên
Cách tối ưu hóa môi trường lập trình ứng dụng cho Android - Tăng tốc máy ảo A...
Cách tối ưu hóa môi trường lập trình ứng dụng cho Android - Tăng tốc máy ảo A...
Ngo Trung
Lap trinh android – kiem tien ngay trong khi hoc
Lap trinh android – kiem tien ngay trong khi hoc
Học viện đào tạo CNTT NIIT iNET
Tìm hiểu về hệ điều hành android
Tìm hiểu về hệ điều hành android
TÓc Đỏ XuÂn
Bài 1: Giới thiệu Android
Bài 1: Giới thiệu Android
hoccungdoanhnghiep
56123159 android
56123159 android
Hieu Pham
Holes and goals
Holes and goals
cmchaddy1212
Storyboard
Storyboard
Thomas DePeal
ESN GIOVANI VALDARNO
ESN GIOVANI VALDARNO
Irecoop Toscana
Hướng Dẫn Lập Trình Android: 7. Xu ly bat dong bo
Hướng Dẫn Lập Trình Android: 7. Xu ly bat dong bo
Wendy587439
7. xu ly bat dong bo
7. xu ly bat dong bo
Justin Hoang

More Related Content

Viewers also liked (20)

Android Nâng cao-Bài 8-JSON & XML Parsing
Android Nâng cao-Bài 8-JSON & XML Parsing
Phuoc Nguyen
Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development
Phuoc Nguyen
Android ios wp7
Android ios wp7
TechMaster Vietnam
Android chapter03-life-cycle
Android chapter03-life-cycle
Love Ga Nhok Mitom
Android presentation
Android presentation
Nguyen Duong
Google Android Security (Basic2Advanced)
Google Android Security (Basic2Advanced)
Giap Le Van
IT120-1. Giới thiệu về Android SDK
IT120-1. Giới thiệu về Android SDK
MultiUni
Android chapter03-life-cycle
Android chapter03-life-cycle
Vu Dang
Basic Sqlite in Android
Basic Sqlite in Android
yuchi_1k91 Pit
ݺߣ hội thảo Google Android BKHN 26-10
ݺߣ hội thảo Google Android BKHN 26-10
Giap Le Van
Android OS
Android OS
Phanxico Lê Công Viên
Cách tối ưu hóa môi trường lập trình ứng dụng cho Android - Tăng tốc máy ảo A...
Cách tối ưu hóa môi trường lập trình ứng dụng cho Android - Tăng tốc máy ảo A...
Ngo Trung
Lap trinh android – kiem tien ngay trong khi hoc
Lap trinh android – kiem tien ngay trong khi hoc
Học viện đào tạo CNTT NIIT iNET
Tìm hiểu về hệ điều hành android
Tìm hiểu về hệ điều hành android
TÓc Đỏ XuÂn
Bài 1: Giới thiệu Android
Bài 1: Giới thiệu Android
hoccungdoanhnghiep
56123159 android
56123159 android
Hieu Pham
Holes and goals
Holes and goals
cmchaddy1212
Storyboard
Storyboard
Thomas DePeal
ESN GIOVANI VALDARNO
ESN GIOVANI VALDARNO
Irecoop Toscana
Android Nâng cao-Bài 8-JSON & XML Parsing
Android Nâng cao-Bài 8-JSON & XML Parsing
Phuoc Nguyen
Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development
Phuoc Nguyen
Google Android Security (Basic2Advanced)
Google Android Security (Basic2Advanced)
Giap Le Van
IT120-1. Giới thiệu về Android SDK
IT120-1. Giới thiệu về Android SDK
MultiUni
Android chapter03-life-cycle
Android chapter03-life-cycle
Vu Dang
ݺߣ hội thảo Google Android BKHN 26-10
ݺߣ hội thảo Google Android BKHN 26-10
Giap Le Van
Cách tối ưu hóa môi trường lập trình ứng dụng cho Android - Tăng tốc máy ảo A...
Cách tối ưu hóa môi trường lập trình ứng dụng cho Android - Tăng tốc máy ảo A...
Ngo Trung
Tìm hiểu về hệ điều hành android
Tìm hiểu về hệ điều hành android
TÓc Đỏ XuÂn

Similar to Android Nâng cao-Bài 5:Notification Multiresolution Multilanguage (20)

Hướng Dẫn Lập Trình Android: 7. Xu ly bat dong bo
Hướng Dẫn Lập Trình Android: 7. Xu ly bat dong bo
Wendy587439
7. xu ly bat dong bo
7. xu ly bat dong bo
Justin Hoang
Giới thiệu Android- Bài 2
Giới thiệu Android- Bài 2
hoccungdoanhnghiep
Introduction Android For Begineer
Introduction Android For Begineer
Cờ Đỏ Nguyễn Văn
Cấu trúc android
Cấu trúc android
dhinh_190192
Mobile programming
Mobile programming
Thinh Huynh
Bao cao-lap-trinh-android-final
Bao cao-lap-trinh-android-final
le dan
LT Ch2 Android skeleton và hoạt động P1.pptx
LT Ch2 Android skeleton và hoạt động P1.pptx
DuyNguyn816111
IT120-3. Thiết kế giao diện trên Android
IT120-3. Thiết kế giao diện trên Android
MultiUni
ݺߣ bài giảng lập trình Android DTU - Phần 2 (Bắt đầu với Helloworld)
ݺߣ bài giảng lập trình Android DTU - Phần 2 (Bắt đầu với Helloworld)
Techacademy Software
User Interface ݺߣs - Silicon Straits Saigon / SHIELD
User Interface ݺߣs - Silicon Straits Saigon / SHIELD
shield_vn
Life cycle của Android
Life cycle của Android
Nguyễn Anh
Thiết Kế Giao Diện Người dùng
Thiết Kế Giao Diện Người dùng
Phương Minh
Phonegap cho người mới học
Phonegap cho người mới học
Ngo Trung
Hướng Dẫn Lập Trình Android: 3. Thiet ke giao dien tren Android
Hướng Dẫn Lập Trình Android: 3. Thiet ke giao dien tren Android
Wendy587439
3.thiet ke giao dien tren android
3.thiet ke giao dien tren android
Justin Hoang
Báo cáo linux NoteForYou
Báo cáo linux NoteForYou
ducbka02
Bài 7: Toast – Dialog, ListView & Binding
Bài 7: Toast – Dialog, ListView & Binding
hoccungdoanhnghiep
ݺߣ CDCS-chuyen_de_co_so_HVKTMM123.pptx
ݺߣ CDCS-chuyen_de_co_so_HVKTMM123.pptx
nameisno12233
Bài_02_Phát triển ứng dụng trên Android.pptx
Bài_02_Phát triển ứng dụng trên Android.pptx
NamNguyen810545
Hướng Dẫn Lập Trình Android: 7. Xu ly bat dong bo
Hướng Dẫn Lập Trình Android: 7. Xu ly bat dong bo
Wendy587439
Bao cao-lap-trinh-android-final
Bao cao-lap-trinh-android-final
le dan
LT Ch2 Android skeleton và hoạt động P1.pptx
LT Ch2 Android skeleton và hoạt động P1.pptx
DuyNguyn816111
IT120-3. Thiết kế giao diện trên Android
IT120-3. Thiết kế giao diện trên Android
MultiUni
ݺߣ bài giảng lập trình Android DTU - Phần 2 (Bắt đầu với Helloworld)
ݺߣ bài giảng lập trình Android DTU - Phần 2 (Bắt đầu với Helloworld)
Techacademy Software
User Interface ݺߣs - Silicon Straits Saigon / SHIELD
User Interface ݺߣs - Silicon Straits Saigon / SHIELD
shield_vn
Life cycle của Android
Life cycle của Android
Nguyễn Anh
Thiết Kế Giao Diện Người dùng
Thiết Kế Giao Diện Người dùng
Phương Minh
Phonegap cho người mới học
Phonegap cho người mới học
Ngo Trung
Hướng Dẫn Lập Trình Android: 3. Thiet ke giao dien tren Android
Hướng Dẫn Lập Trình Android: 3. Thiet ke giao dien tren Android
Wendy587439
3.thiet ke giao dien tren android
3.thiet ke giao dien tren android
Justin Hoang
Báo cáo linux NoteForYou
Báo cáo linux NoteForYou
ducbka02
Bài 7: Toast – Dialog, ListView & Binding
Bài 7: Toast – Dialog, ListView & Binding
hoccungdoanhnghiep
ݺߣ CDCS-chuyen_de_co_so_HVKTMM123.pptx
ݺߣ CDCS-chuyen_de_co_so_HVKTMM123.pptx
nameisno12233
Bài_02_Phát triển ứng dụng trên Android.pptx
Bài_02_Phát triển ứng dụng trên Android.pptx
NamNguyen810545
Ad

More from Phuoc Nguyen (7)

Lanh dao va TPP
Lanh dao va TPP
Phuoc Nguyen
Hiberbate Framework
Hiberbate Framework
Phuoc Nguyen
Introduction to Hibernate Framework
Introduction to Hibernate Framework
Phuoc Nguyen
Webservice performance testing with SoapUI
Webservice performance testing with SoapUI
Phuoc Nguyen
Web application security test tools
Web application security test tools
Phuoc Nguyen
A successful project sharing
A successful project sharing
Phuoc Nguyen
Buồn vui nghề IT (Pros & cons of IT Career)
Buồn vui nghề IT (Pros & cons of IT Career)
Phuoc Nguyen
Introduction to Hibernate Framework
Introduction to Hibernate Framework
Phuoc Nguyen
Webservice performance testing with SoapUI
Webservice performance testing with SoapUI
Phuoc Nguyen
Web application security test tools
Web application security test tools
Phuoc Nguyen
A successful project sharing
A successful project sharing
Phuoc Nguyen
Buồn vui nghề IT (Pros & cons of IT Career)
Buồn vui nghề IT (Pros & cons of IT Career)
Phuoc Nguyen
Ad

Android Nâng cao-Bài 5:Notification Multiresolution Multilanguage

  • 1. 1 ANDROID NÂNG CAOANDROID NÂNG CAO Bài 5: NotificationNotification Multi-ResolutionMulti-Resolution Multi-LanguageMulti-Language
  • 2. 2 Nội dung bài học ● Notification. ● Muilti-Resolution. ● Multi-Language.
  • 3. 3 Nội dung bài học ● Notification. ● Muilti-Resolution. ● Multi-Language.
  • 4. 4 Notification ● Giới thiệu về Notification. ● Hiện thực Notification. ● Notification Queue. ● Cập nhật Notification. ● Xoá Notification. ● Rung điện thoại khi notify . ● Chớp đèn khi notify. ● Phát âm thanh khi notify. ● Customize notification. ● Best practices.
  • 5. 5 Giới thiệu về Notification ● Notification là một cơ chế cho phép tại một thời điểm nhất định trình bày một thông tin trên thanh trạng thái (status bar) ở phía trên màn hình. ● Mỗi khi thanh trạng thái được mở ra thì một danh sách những notification được hiển thị, khi người dùng click vào một notification thì có thể một Activity được kích hoạt.
  • 6. 6 Giới thiệu về Notification ● Một Nofication thông thường gồm các thành phần sau đây: (1) Một icon (xuất hiện trên status bar và ở nội dung chi tiết của notification) (2) Ticker text (xuất hiện trên status bar). (3) Notification title text (xuất hiện ở nội dung chi tiết). (4) Notification body text (xuất hiện ở nội dung chi tiết). (5) Một intent (launch Activity khi user click vào nội dung chi tiết). (1) (2) (3)(4)
  • 7. 7 Hiện thực Notification 1.Get NotificationManager 2.Tạo đối tượng Notification. 3.Tạo PendingIntent. 4.Thêm thông tin về Notification event. 5.Trình bày notification.
  • 8. 8 Hiện thực Notification 1.Get NotificationManager: Tất cả các Notification được tạo ra nhờ lớp NotificationManager (package android.app). Để có được đối tượng NotificationManager ta thực hiện như sau:
  • 9. 9 Hiện thực Notification 2.Tạo đối tượng Notification: ● Cách cũ: Sử dụng constructor của lớp Notification, resource id của icon, ticker text, thời gian (ms). ● Cách mới: Sử dụng Notification.Builder Notification notification = new Notification.Builder(mContext) .setTicker("Ticker Text”) .setSmallIcon(R.drawable.icon) .setWhen(System.currentTimeMilis()) .build();
  • 10. 10 Hiện thực Notification 3.Tạo PendingIntent: Khi người dùng click vào nội dung chi tiết của notification trong danh sách thì intent này được xử lý ● PendingIntent.getActivity có 4 tham số: ● Tham số 1: Context. ● Tham số 2: Request code, không dùng và thường là 0. ● Tham số 3: Intent cần xử lý. ● Tham số 4: Intent flag (Xem thêm ở PendingIntent), nếu không dùng thì truyền 0.
  • 11. 11 Hiện thực Notification 4.Thêm thông tin về Notification event: Cách cũ: ● Sử dụng phương thức Notification#setLatestEventInfo để thêm các thông tin về notification event. ● Phương thức có 4 tham số: ● Tham số 1: Context. ● Tham số 2: Notification title text. ● Tham số 3: Notification body text. ● Tham số 4: PendingIntent.
  • 12. 12 Hiện thực Notification 4.Thêm thông tin về Notification event: Cách mới: ● Sử dụng phương thức Notification.Builder để build Notification ở bước 2 và set các tham số cần thiết. Tức là bước 2 và bước 4 gộp lại thành 1 bước và thực hiện sau bước 3. Notification notification = new Notification.Builder(mContext) .setTicker("Ticker Text”) .setContentTitle(“Title text) .setContentText(“Body text”) .setContentIntent(pendingIntent) .setSmallIcon(R.drawable.icon) .setWhen(System.currentTimeMillis()) .build();
  • 13. 13 Hiện thực Notification 5.Trình bày notification: ● Sử dụng phương thức NotificationManager#notify để trình bày notification. ● Phương thức có 2 tham số: ● Tham số 1: The notification id. ● Tham số 2: Notification object.
  • 14. 14 Notification Queue ● Khi chúng ta gọi phương thức NotificationManager#notify thì hệ thống sẽ tìm trong queue xem có notification nào có cùng id hay không. ● Nếu có thì notification cũ được cập nhật. ● Nếu không thì notification mới được tạo ra. ● Notification id chỉ cần duy nhất trong 1 ứng dụng.
  • 15. 15 Cập nhật Notification ● Sử dụng phương thức NotificationManager#notify với id cùng với id của notification mà chúng ta muốn cập nhật. ● Việc cập nhật notification giúp cho danh sách notification không chứa quá nhiều notification, khó quản lý.
  • 16. 16 Xoá Notification ● Sau khi pending intent được kích hoạt, thường chúng ta cần xoá notification khỏi danh sách. Sử dụng phương thức NotificationManager#cancel với tham số là notification id. ● Nếu chúng ta muốn hệ thống tự động xoá notification khỏi notification queue khi pending intent được kích hoạt, sử dụng notification flag Notification.FLAG_AUTO_CANCEL notification |= Notification.FLAG_AUTO_CANCEL
  • 17. 17 Rung điện thoại khi notify ● Để gây chú ý cho người dùng khi ở môi trường ồn ào mà không thể dùng âm thanh để cảnh báo thì rung điện thoại là phương pháp phù hợp nhất. ● Để rung điện thoại khi notify: ● Set quyền trong AndroidManifest.xml: <uses-permission android:name="android.permission.VIBRATE" /> ● Set vibrate pattern: notification.vibrate = new long[] {0, 200, 200, 600, 600}; ● Set notification flag để giữ lại cho đến khi nào người dùng click vào thông tin chi tiết của notification: notification.flags |= Notification.FLAG_INSISTENT;
  • 18. 18 Chớp đèn khi notify ● Chớp đèn khi notify là cách gây chú ý cho người dùng một cách yên lặng nhất. ● Để chớp đèn khi notify: ● Set notification flag: notification.flags |= Notification.FLAG_SHOW_LIGHTS; ● Set màu của đèn, thời gian (ms) đèn sáng và thời gian (ms) đèn tắt: notification.ledARGB = Color.GREEN; notification.ledOnMS = 1000; notification.ledOffMS = 1000; ● Màu đèn là màu bất kỳ tuy nhiên tuỳ theo phần cứng mà màu thực tế đôi khi không giống màu mong đợi
  • 19. 19 Chớp đèn khi notify ● Đèn sẽ chớp đến khi nào người dùng xoá notification khỏi notification queue. Do đó Notification.FLAG_INSISTENT là không cần thiết ở đây.
  • 20. 20 Phát âm thanh khi notify ● Không có gì có thể thu hút sự chú ý của người dùng bằng phương pháp phát đoạn nhạc hay âm thanh. ● Để phát âm thanh khi notify chúng ta thực hiện như sau: ● Cấu hình audio stream type: notification.audioStreamType = AudioManager.STREAM_NOTIFICATION; ● Chỉ ra tập tin âm thanh cần phát: notification.sound = Uri.parse("android.resource://com.example.samplenotificatio n/" +R.raw.samplesound); ● Âm thanh chỉ phát một lần, muốn lặp lại thì cần bật cờ: notification.flags |=Notification.FLAG_INSISTENT
  • 21. 21 Customize Notification ● Customize Notification thông qua RemoteViews ● Bước này đã thay setLatestEventInfo, để set PendingIntent cho notification chúng ta dùng: notification.contentIntent = pendingIntent;
  • 22. 22 Best Practices ● Sử dụng notification khi chương trình không ở foreground ngược lại nên dùng Toast, Dialog. ● Cho phép người dùng chọn lựa loại notification (văn bản, âm thanh, chớp đèn, rung), tần suất notification, sự kiện kích hoạt notification. ● Nếu được nên sử dụng notification đã có thay vì tạo mới. ● Xoá notification khi có thể. ● Khi không xác định được nên sử dụng polite notification. ● Notification chứa thông tin hữu ích trong ticker text, title text, body text.
  • 23. 23 Bài tập 08 Viết lại bài tập 07 không dùng Toast để thông báo mà sử dụng Notification.
  • 24. 24 Multi-Resolution ● Density& Screen Size ● DIP ● Scaling ● Tips
  • 25. 25 Density & Screen Size ● Các thiết bị Android được phân loại dựa vào density và screen size (kích thước màn hình, tính bằng inch) ● Density được đo bằng đơn vị DPI (dot per inch, số lượng điểm ảnh trên 1 inch chiều dài). Dựa vào density người ta chia thiết bị Android thành 4 loại như bảng bên dưới. ● Ứng với mỗi loại density thì Android cung cấp một thư mục để tải ảnh phù hợp với density đó. ● Thư mục res/drawable-nodpi dùng để lưu các ảnh không phụ thuộc vào density, nó được dùng cho tất cả các loại density Loại DPI DPI chuẩn Thư mục hình ảnh Low Density (ldpi) 100-140 120 res/drawable-ldpi Medium Density (mdpi) 140-180 160 res/drawable-mdpi High Density (hdpi) 190-250 240 res/drawable-hdpi Extra High Desnsity (xhdpi) > 250 320 res/drawable-xhdpi (1.33mdpi) 180-190 res/drawable-tvdpi
  • 26. 26 Density & Screen Size ● Dựa vào kích thước màn hình người ta cũng chia thiết bị Android thành 4 loại ● Đối với mỗi loại kích thước màn hình Android cung cấp một thư mục chứa các layout tương ứng cho loại màn hình đó. ● Thư mục res/drawable-nodpi dùng để lưu các ảnh không phụ thuộc vào density, nó được dùng cho tất cả các loại density Loại Kích thước Thư mục layout Small Screen < 3'' res/layout-small Normal Screen 3'' – 4'' res/layout Large Screen 4'' – 7'' res/layout-large Extra Large Screen 7'' – 10'' res/drawable-xlarge
  • 27. 27 DIP ● Thông thường khi đo kích thước người ta dùng đơn vị px(pixel,điểm ảnh). Tuy nhiên đơn vị này lại phụ thuộc vào density. ● Để khắc phục điểm này, Android đưa ra khái niệm DIP (density independent pixel). Đơn vị của DIP là dip hay dp. ● Công thức quy đổi: pixels = dips *density/160. ● Scale-independent pixel (sp) là một khái niệm tương tự như DIP nhưng bên cạnh không phụ thuộc vào density thì nó còn không phụ thuộc vào font size của người dùng. 1sp = 1dp. ● Lưu ý vì Java không có hai khái niệm này do đó khi dùng Java trong chương trình Anhdroid cần chuyển đổi 2 đơn vị này như công thức trên.
  • 28. 28 Một số size qualifier mới Cấu hình Qualifier Layout directory smallestWidth sw<N>dp res/layout-sw<N>dp Available screen width w<N>dp res/layout-w<N>dp Available screen height h<N>dp res/layout-h<N>dp ● Hỗ trợ từ Android 3.2+ ● Xem thêm các cấu hình sau: ● android:requiresSmallestWidthDp ● android:compatibleWidthLimitDp ● android:largestWidthLimitDp
  • 29. 29 Scaling ● Nếu hình ảnh trong thư mục tương ứng với loại density không tìm thấy mà tìm thấy trong thư mục res/drawable. Thì hình ảnh này sẽ bị scaling theo tỉ lệ như sau: ● Low density = 0.75 ● Medium density = 1 ● High density = 1.5 ● Extra high density = 2.0 xhdpi(2.0x) hdpi(1.5x) mdpi(baseline) ldpi(0.75x)
  • 30. 30 Tips ● Sử dụng “wrap-content”, “fill-parent” (or “match-parent” từ Android 2.2+) để chỉ định kích thước của layout. Trong trường hợp cần đưa con số cụ thể dùng đơn vị “dp” cho độ dài và “sp” cho font size. ● Chuẩn bị ảnh phù hợp cho các loại density. ● Chuẩn bị layout phù hợp cho các loại screen size. ● Không dùng AbsoluteLayout → RelativeLayout. ● Chuyển đổi dp, sp sang px dùng công thức chứ không hardcode trong Java. ● Test sử dụng emulator sử dụng bảng bên dưới
  • 31. 31 Multi-Languge ● Sử dụng cấu hình ngôn ngữ của thiết bị, resource files đặt trong thư mục tương ứng res/values-[mã ngôn ngữ] hoặc res/values-[mã ngôn ngữ]-r[mã vùng] ● Nếu các thư mục trên không tồn tại thì thư mục res/values được sử dụng.
  • 32. 32 Bài tập 09 Tìm hiểu và viết chương trình demo cho “force language” (thay đổi ngôn ngữ chương trình từ chọn lựa ngôn ngữ của người dùng mà không phụ thuộc vào cấu hình của thiết bị).
  • 33. Nguyen Huu Phuoc, MEng. ●  Blog:http://folami.nghelong.com ●  Website http://phuocnh.nghelong.com