2. Nội dung bài học
●
Send broadcast một Intent.
●
System broadcast.
●
Hiện thực Broadcast Receiver.
●
Vòng đời của Broadcast Receiver.
●
Hạn chế của Broadcast Receiver.
●
Đăng ký broadcast receiver bằng code.
●
Disable receiver đã đăng ký trong manifest.
●
Sticky Broadcast Intent
3. Send broadcast một Intent
●
Send trong cùng một process.
●
Send cho toàn hệ thống.
4. Send broadcast một Intent
●
Send trong cùng một process:
●
Sử dụng các phương thức sau đây để send broadcast một
Intent trong một process:
–
–
LocalBroadcastManager#sendBroadcast →
asynchronous
LocalBroadcastManager#sendBroadcastSync → nếu
có receiver cho Intent thì phương thức này sẽ block và
ngay lập tức gọi receiver thực thi.
5. Send broadcast một Intent
●
Send cho toàn bộ hệ thống:
●
Sử dụng các phương thức sau đây để send broadcast
một Intent cho toàn bộ hệ thống:
–
–
Context#sendBroadcast → asynchronous, unordered
Context#sendOrderedBroadcast:
●
●
●
●
One receiver at a time.
The order is configured by android:priority. If the priorities are
same, the order is undetermined.
The result of the first receiver is passed to the next one.
We can abort the broadcast to stop the result propogate.
6. System Broadcast
●
●
Trong Android nhiều system event được hệ
thống gửi đến toàn bộ các ứng dụng trong hệ
thống dưới dạng các broadcast intent. Các intent
này có các action đị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 như TelephonyManager.
Một số event quan trọng:
●
Intent.ACTION_BOOT_COMPLETED
●
Intent.ACTION_BATTERY_LOW
●
Intent.ACTION_BATTERY_OKAY
7. Hiện thực Broadcast Receiver
●
Kế thừa lớp BroadcastReceiver.
●
Hiện thực phương thức onReceiver.
●
Đăng ký receiver vào AndroidManifest.xml
8. Hiện thực Broadcast Receiver
●
Kế thừa lớp BroadcastReceiver.
●
Hiện thực phương thức onReceiver.
●
Đăng ký receiver vào AndroidManifest.xml
9. Hiện thực Broadcast Receiver
public class SampleReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Nếu cần chúng ta cần kiểm tra action của intent chúng ta nhận
// đúng là action mà chúng ta mong đợi rồi mới thực hiện
// phần nghiệp vụ
Intent service = new Intent(context, SampleService.class);
context.startService(service);
}
}
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
<receiver android:name="SampleReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
...
10. Hiện thực Broadcast Receiver
●
Lưu ý:
●
●
●
Nếu chương trình cài đặt ở SD Card (thuộc tính location) thì
chương trình không nhận được sự kiện
ACTION_BOOT_COMPLETED vì sự kiện này xảy ra trước
khi chương trình thực thi. Trong tình huống này chúng ta
dùng sự kiện:
ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
Trên các điện thoại HTC, sự kiện này cũng không nhận được
khi chạy dưới chế độ “Fast Boot”.
Từ Android 3.0, người dùng cần start ứng dụng ít nhất 1 lần
thì ứng dụng mới nhận sự kiện này.
11. Vòng đời của Broadcast Receiver
●
●
BroadcastReciver chỉ có giá trị trong khi onReciver được gọi.
Khi phương thức này kết thúc thì receiver kết thúc và không còn
ở trạng thái active nữa.
Lưu ý:
●
●
●
Không thể gọi hàm bất đồng bộ bên trong onReceive vì hàm
này sẽ không có điểm quay về khi receiver không còn tồn tại.
Không nên show dialog mà nên dùng Notification bên trong
onReceive.
Không nên bind service mà nên dùng startService bên trong
onReceive.
12. Hạn chế của Broadcast Receiver
●
●
BroadcastReciver phải kết thúc việc thực thi trong 10 giây nếu
không thì nó sẽ trigger ANR exception.
Từ Android 3.1, mặc định hệ thống sẽ loại bỏ tất cả các receiver
từ các 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).
13. Đăng ký Broadcast Receiver bằng code
●
Ngoài phương pháp đăng ký receiver trong
AndroidManifest.xml file chúng ta có thể đăng ký receiver bằng
code:
●
●
Trong onResume của Activity, chúng ta sử dụng
Contex#registerReceiver
(LocalBroadcastManager#registerReceiver).
Trong onPause của Activity, chúng ta sử dụng:
Context#unregisterReceiver
(LocalBroadcastManager#unregisterReceiver).
14. Disable receiver
●
Để disable một receiver đã đăng ký trong manifest file chúng ta
sử dụng PackageManger:
ComponentName mReceiver = new ComponentName(context, SampleReceiver.class);
PackageManager mManager = context.getPackageManager();
mManager.setComponentEnabledSetting(mReceiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
15. Sticky Broadcast Intent
●
●
●
Broadcast intent thông thường thì 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 nó 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#registerReciver(BroadcastReceiver,
IntentFilter), trong đó nếu BroadcastReceiver = null thì phương
thức vẫn hoạt động.
Ví dụ Intent.ACTION_BATTERY_CHANGED là một sticky
broadcast intent. Chúng ta có thể truy xuất đến nó bất cứ lúc nào
sau khi nó được gửi.
16. Bài tập 06
●
Hiện thực chương trình mô tả như trong hình:
Nhập vào số giây
Nhấn nút “Start”
Xem thêm các class sau:
● PendingIntent
● AlarmManager
● Vibrator
10 giây sau, điện thoại rung
và 1 toast hiện ra thông điệp