LẬP TRÌNH ANDROID NÂNG CAOBài 2: Broadcast Receiver – Tài liệu text

LẬP TRÌNH ANDROID NÂNG CAOBài 2: Broadcast Receiver

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (663.59 KB, 24 trang )

LẬP TRÌNH ANDROID NÂNG CAO
Bài 2: Broadcast Receiver

Nội dung bài học
 Tổng quan về Broadcast Receiver
 Phân loại Broadcast Receiver
 Miêu tả Broadcast Receiver
 Vòng đời Broadcast Receiver
 Hạn chế của Broadcast Receiver

2

Broadcast Receiver
 Là một trong 4 thành phần của ứng dụng Android
 Chức năng dùng để nhận các sự kiện mà các ứng dụng hoặc
hệ thống phát đi

Broadcast Receiver

Broadcast Receiver
 Có 2 cách phát-nhận:
 Không có thứ tự: receiver nào đủ điều kiện thì nhận,
không phân biệt và tách rời nhau
 Có thứ tự: receiver nào đăng ký ưu tiên hơn thì nhận
trước, và có thể truyền thêm thông tin xử lý cho các
receiver sau

Vòng đời của Broadcast Receiver
 Vòng đời của Broadcast Receiver gồm duy nhất một phương
thức onReceive()
 Khi có sự kiện mà Broadcast Receiver đã đăng ký nhận
được phát đi, thì phương thức onReceiver() của
BroadcastReceiver đó sẽ được gọi
 Sau khi thực hiện xong phương thức này, vòng đời của
Broadcast Receiver kết thúc

Vòng đời của Broadcast Receiver
 Ngay khi onReceive() kết thúc, hệ thống có thể kill process
chứa receiver bất kỳ lúc nào
 Bạn nên tránh xử lý tốn nhiều thời gian trong Broadcast
Receiver
 Không nên có xử lý bất đồng bộ, chờ đợi callback… Trong
Receiver (ví dụ như hiển thị Dialog, kết nối với service)

Vòng đời của Broadcast Receiver

Broadcast hệ thống
 Trong Android nhiều sự kiện hệ thống được hệ thống gửi
đến toàn bộ ứng dụng trong hệ thống dưới dạng broadcast
intent. Các intent này có các action được định nghĩa dưới
dạng các biến final static trong lớp Intent cũng như các lớp
khác (ví dụ TelephonyManager)
 Một số sự kiện quan trọng:

 Intent.ACTION_BOOT_COMPLETED
 Intent.ACTION_BATTERY_LOW
 Intent.ACTION_BATTERY_OKAY

Một số Broadcast phổ biến
 Báo hệ thống khởi động xong
 Bán pin có sự thay đổi
 Báo tắt máy
 Báo cắm sạc, rút sạc
 Báo có package mới được cài vào hay
xóa đi

Một số Broadcast phổ biến
 Thông báo tin nhắn tới
 Thông báo cuộc gọi đến
 Bạn có thể định nghĩa broadcast của
riêng mình (mục tiêu chính là bạn có thể
liên lạc giữa các ứng dụng bạn viết hoặc
đưa ra thông báo một sự kiện quan
trọng đến ứng dụng khác của bạn với
các ứng dụng khác)

onReceive()
 Phương thức này được gọi đến khi có sự kiện tương ứng
được phát đi
 Trong phương thức này, bạn sẽ truyền vào context và intent

O

DEM

Sử dụng phương thức onReceive

Hạn chế của Broadcast Receiver
 Broadcast Receiver phải kết thúc việc thực thi trong 10 giây
nếu không sẽ có ANR exception
 Từ Android 3.1, mặc định hệ thống sẽ loại bỏ tất cả receiver
từ intent nếu như ứng dụng tương ứng với các receiver này
chưa được start bởi người dùng bao giờ hoặc các ứng dụng
này bị stop một cách tường minh bởi người dùng thông qua
menu (Manage Application)

Đăng ký Broadcast Receiver qua
AndroidManifest.xml
I

O

DEM

Xây dựng ứng dụng sử dụng Broadcast
Receiver

Đăng ký Broadcast Receiver qua code
 Bạn có thể đăng ký Broadcast Receiver bằng code sử dụng
phương thức Context.registerReceiver() trong onResume
của Activity
 Trong onPause của Activity, gọi phương thức
Context.unregisterReceiver()

Disable receiver
 Để disable receiver đã đăng ký trong AndroidManifest.xml,
chúng ta sử dụng PackageManager

Bảo mật trong Broadcast Receiver
 Nếu bạn không muốn gửi broadcast trong các ứng dụng
khác, cân nhắc sử dụng LocalBroadcastManager
 Lớp LocalBroadcastManager giúp cho bạn không phải lo
về các vấn đề bảo mật liên quan đến việc ứng dụng khác có
gửi và nhận broadcast của bạn

Bảo mật trong Broadcast Receiver
 Intent namespace là global do đó bạn phải đảm bảo rằng
tên của intent action và các xâu khác được viết theo đặc
trưng riêng của bạn để đảm bảo tránh xung đột với các ứng
dụng khác
 Khi bạn sử dụng registerReceiver(BroadcastReceiver,
IntentFilter), bất kỳ ứng dụng nào có thể gửi broadcast tới
receiver đã được đăng ký

 Khi bạn publish một receiver trong AndroidManifest.xml và
xác định intent filter cho receiver, bất kỳ ứng dụng nào cũng
có thể gửi broadcast đến cho dù intent filter có nội dung
như thế nào

Bảo mật trong Broadcast Receiver
 Để ngăn cản ứng dụng khác gửi yêu cầu, sử dụng
android:exported=“false”
 Bắt đầu từ ICE_CREAM_SANDWICH, bạn có thể hạn chế
broadcast tới một ứng dụng cụ thể sử dụng
Intent.setPackage

Sticky Broadcast Intent
 Broadcast intent thông thường sẽ bị mất sau khi hệ thống
xử lý xong
 Nếu chúng ta sử dụng Context.sendStickyBroadcastIntent
để gửi broadcast intent thì intent này sẽ không mất đi sau
khi hệ thống xử lý
 Chúng ta có thể truy xuất đến intent này bằng phương thức
Context.registerReceiver(BroadcastReceiver, IntentFilter)
 Ví dụ Intent.ACTION_BATTERY_CHANGED là một sticky
broadcast intent. Chúng ta có thể truy xuất đến nó bất kỳ
lúc nào sau khi nó được gửi

O

DEM

Sử dụng sticky broadcast intent

Tổng kết nội dung bài học
 Tổng quan về Broadcast Receiver
 Phân loại Broadcast Receiver
 Miêu tả Broadcast Receiver
 Vòng đời Broadcast Receiver
 Hạn chế của Broadcast Receiver

Vòng đời của Broadcast Receiver Vòng đời của Broadcast Receiver gồm duy nhất một phươngthức onReceive() Khi có sự kiện mà Broadcast Receiver đã đăng ký nhậnđược phát đi, thì phương thức onReceiver() củaBroadcastReceiver đó sẽ được gọi Sau khi thực hiện xong phương thức này, vòng đời củaBroadcast Receiver kết thúcVòng đời của Broadcast Receiver Ngay khi onReceive() kết thúc, hệ thống có thể kill processchứa receiver bất kỳ lúc nào Bạn nên tránh xử lý tốn nhiều thời gian trong BroadcastReceiver Không nên có xử lý bất đồng bộ, chờ đợi callback… TrongReceiver (ví dụ như hiển thị Dialog, kết nối với service)Vòng đời của Broadcast ReceiverBroadcast hệ thống Trong Android nhiều sự kiện hệ thống được hệ thống gửiđến toàn bộ ứng dụng trong hệ thống dưới dạng broadcastintent. Các intent này có các action được định nghĩa dướidạng các biến final static trong lớp Intent cũng như các lớpkhác (ví dụ TelephonyManager) Một số sự kiện quan trọng: Intent.ACTION_BOOT_COMPLETED Intent.ACTION_BATTERY_LOW Intent.ACTION_BATTERY_OKAYMột số Broadcast phổ biến Báo hệ thống khởi động xong Bán pin có sự thay đổi Báo tắt máy Báo cắm sạc, rút sạc Báo có package mới được cài vào hayxóa điMột số Broadcast phổ biến Thông báo tin nhắn tới Thông báo cuộc gọi đến Bạn có thể định nghĩa broadcast củariêng mình (mục tiêu chính là bạn có thểliên lạc giữa các ứng dụng bạn viết hoặcđưa ra thông báo một sự kiện quantrọng đến ứng dụng khác của bạn vớicác ứng dụng khác)onReceive() Phương thức này được gọi đến khi có sự kiện tương ứngđược phát đi Trong phương thức này, bạn sẽ truyền vào context và intentDEMSử dụng phương thức onReceiveHạn chế của Broadcast Receiver Broadcast Receiver phải kết thúc việc thực thi trong 10 giâynếu không sẽ có ANR exception Từ Android 3.1, mặc định hệ thống sẽ loại bỏ tất cả receivertừ intent nếu như ứng dụng tương ứng với các receiver nàychưa được start bởi người dùng bao giờ hoặc các ứng dụngnày bị stop một cách tường minh bởi người dùng thông quamenu (Manage Application)Đăng ký Broadcast Receiver quaAndroidManifest.xmlDEMXây dựng ứng dụng sử dụng BroadcastReceiverĐăng ký Broadcast Receiver qua code Bạn có thể đăng ký Broadcast Receiver bằng code sử dụngphương thức Context.registerReceiver() trong onResumecủa Activity Trong onPause của Activity, gọi phương thứcContext.unregisterReceiver()Disable receiver Để disable receiver đã đăng ký trong AndroidManifest.xml,chúng ta sử dụng PackageManagerBảo mật trong Broadcast Receiver Nếu bạn không muốn gửi broadcast trong các ứng dụngkhác, cân nhắc sử dụng LocalBroadcastManager Lớp LocalBroadcastManager giúp cho bạn không phải lovề các vấn đề bảo mật liên quan đến việc ứng dụng khác cógửi và nhận broadcast của bạnBảo mật trong Broadcast Receiver Intent namespace là global do đó bạn phải đảm bảo rằngtên của intent action và các xâu khác được viết theo đặctrưng riêng của bạn để đảm bảo tránh xung đột với các ứngdụng khác Khi bạn sử dụng registerReceiver(BroadcastReceiver,IntentFilter), bất kỳ ứng dụng nào có thể gửi broadcast tớireceiver đã được đăng ký Khi bạn publish một receiver trong AndroidManifest.xml vàxác định intent filter cho receiver, bất kỳ ứng dụng nào cũngcó thể gửi broadcast đến cho dù intent filter có nội dungnhư thế nàoBảo mật trong Broadcast Receiver Để ngăn cản ứng dụng khác gửi yêu cầu, sử dụngandroid:exported=“false” Bắt đầu từ ICE_CREAM_SANDWICH, bạn có thể hạn chếbroadcast tới một ứng dụng cụ thể sử dụngIntent.setPackageSticky Broadcast Intent Broadcast intent thông thường sẽ bị mất sau khi hệ thốngxử lý xong Nếu chúng ta sử dụng Context.sendStickyBroadcastIntentđể gửi broadcast intent thì intent này sẽ không mất đi saukhi hệ thống xử lý Chúng ta có thể truy xuất đến intent này bằng phương thứcContext.registerReceiver(BroadcastReceiver, IntentFilter) Ví dụ Intent.ACTION_BATTERY_CHANGED là một stickybroadcast intent. Chúng ta có thể truy xuất đến nó bất kỳlúc nào sau khi nó được gửiDEMSử dụng sticky broadcast intentTổng kết nội dung bài học Tổng quan về Broadcast Receiver Phân loại Broadcast Receiver Miêu tả Broadcast Receiver Vòng đời Broadcast Receiver Hạn chế của Broadcast Receiver