Khái quát về Broadcast Intent
Các Broadcast Intent là các đối tượng (có chứa tên hành động - action - và dữ liệu) được lan truyền trong ứng dụng thông qua qua goi các phương thức của Activity
là: sendBroadcast()
, sendOrderedBroadcast()
. Khi đối tượng Broadcast Intent được tạo và gửi đi như vậy thì các ứng dụng trong hệ thống hoặc ở một phần khác của ứng dụng có thể nhận được đối tượng này nếu có đăng khi nhận bằng cách sử dụng Broadcast Receiver
(Xem phần sau).
Ví dụ sau, tạo ra một Broadcast Intent
sau đó gửi đi (lan truyền) trong ứng dụng:
String actionName = "my-first-broadcastintent"; Intent intent = new Intent(actionName); //Thiết lập tên để cho Receiver nhận được thì biết đó là loại Intent intent.setAction(actionName); //Dữ liệu gắn vào Intent thiết lập bằng putExtra với (tên, dữ liệu), dữ liệu là //các kiểu cơ bản Int, String ... hoặc các loại đối tượng lớp kế thừa từ Serializable intent.putExtra("dataname", "Hello, How are you?"); //Thực hiện lan truyền Intent trong hệ thống sendBroadcast(intent);
Gửi Broadcast Intent
Trong Activity
có các phương thức để lan truyền đối tượng Broadcast Intent, tuỳ mục đích mà sử dụng một phương thức phù hợp
Phương thức | Sử dụng |
---|---|
sendBroadcast(Intent intent) |
Gửi đi intent mà tất cả các BroadcastReceiver sẽ nhận được. Việc sử dụng phương thức này
sẽ thực hiện luồng bất đồng bộ, nó sẽ trả về ngay lập tức và logic code sau lời gọi tiếp tục chạy còn phía nhận (BroadcastReceiver) chạy một quá trình khác khi nhận được intent - chúng nhận được theo một thứ tự không xác định thường là cùng lúc, tất nhiên bạn sẽ không nhận được kết quả trả về nào từ BroadcastReceiver và BroadcastReceiver cũng không thể ngăn chặn quá trình lan truyền.
|
sendOrderedBroadcast |
sendOrderedBroadcast (Intent intent,
String receiverPermission) - việc lan truyền intent sẽ theo thứ tự, gửi đến từng BroadcastReceiver , thứ tự này có thể điều chỉnh qua thuộc tính android:priority tương tứng khi khai báo intent-filter , khi các BroadcastReceiver thi hành nó có thể truyền kết quả của của đến một BroadcastReceiver khác thậm chí ngắt luôn quá trình làn truyền intent để các BroadcastReceiver không nhận được intent.
|
sendBroadcast
của Activity
(Context) thì hãy dùng đến LocalBroadcastManager
ví dụ:
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
Khái quát Broadcast Receiver
Các Broadcast Receiver là các đối tượng đăng ký với ứng dụng của bạn, nó có chức năng lắng nghe - chờ các Broadcast Intent gửi đến (Intent từ ứng dụng, từ ứng dụng khác, từ hệ thống Android), khi nhận được Intent nó thi hành các chức năng do bạn xây dựng.
Để xây dựng một Receiver tạo ra đối tượng từ lớp BroadcastReceiver
hoặc từ các lớp tự xây dựng kế từ từ BroadcastReceiver
, sau đó đăng ký nó với hệ thống bằng phương thức registerReceiver
của Activity
Ví dụ sau tạo ra một lớp kế thừa từ BroadcastReceiver, bao giờ cũng phải triển khai phương thức onReceive
của lớp này.
class MyBroadcastReceiver extends BroadcastReceiver { public static final String ACTION_FIRST_ACTION = "my-first-broadcastintent"; MyBroadcastReceiver() { } //Code thi hành khi Receiver nhận được Intent @Override public void onReceive(Context context, Intent intent) { //Kiểm tra Action của Intent nhận được có tên irst-broadcastintent if (intent.getAction().equals(MyBroadcastReceiver.ACTION_FIRST_ACTION)) { //Đọc dữ liệu trong Intent String d = intent.getStringExtra("dataname"); Toast.makeText(context, d, Toast.LENGTH_SHORT).show(); } } }
Đăng ký BroadcastReceiver
Tạo ra đối tượng lớp MyBroadcastReceiver
và đăng ký nó với hệ thống:
MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); //Thiết lập các Action filter mà MyBroadcastReceiver sẽ nhận intentFilter.addAction(MyBroadcastReceiver.ACTION_FIRST_ACTION); registerReceiver(myBroadcastReceiver, intentFilter);
Huỷ Đăng ký BroadcastReceiver
Khi BroadcastReceiver không còn sử dụng nữa, cần thiết phải huỷ đăng ký nó khỏi hệ thống bằng phương thức unregisterReceiver
, thường làm điều này trong onDestroy
của Activity
@Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(myBroadcastReceiver); }
LocalBroadcastManager
ví dụ:
//ĐĂNG KÝ LocalBroadcastManager.getInstance(context).registerReceiver(receiver,intentfilter); //HUỶ LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver);
Ứng dụng ví dụ:
Xem đoạn code tại: MainActivity.java hoặc tải ví dụ mẫu tại: android-broadcastintent
Lắng nghe một số Intent của hệ thống Android
Có một số sự kiện hệ thống Android xảy ra như thay đổi kết nối mạng (mất mạng, có mạng), khởi động máy, tắt máy ..., nếu muốn bắt được các sự kiện đó hoàn toàn có thể dùng BroadcastReceiver như trên và đăng ký nhận Intent với Intent Filter có Action phù hợp, danh sách đầy đủ các Action xem tại: broadcast_actions và broadcast_actions
Một số Action quan trọng như:
android.intent.action.BATTERY_CHANGED
(Intent.ACTION_BATTERY_CHANGED) thay đổi trạng thái PINandroid.intent.action.BATTERY_LOW
(Intent.ACTION_BATTERY_LOW) PIN ở mức thấpandroid.intent.action.BATTERY_OKAY
(Intent.ACTION_BATTERY_OKAY) PIN vào trạng thái tốt (sạc lên mức cao)android.intent.action.BOOT_COMPLETED
(Intent.ACTION_BOOT_COMPLETED) Khởi động xong máyandroid.intent.action.CALL_BUTTON
(Intent.ACTION_CALL_BUTTON) bấm nút gọiandroid.intent.action.DATE_CHANGED
(Intent.ACTION_DATE_CHANGED) ngày thay đổiandroid.intent.action.REBOOT
(Intent.ACTION_REBOOT) khởi động máy
Ví dụ sau lắng nghe sự kiện khi PIN thay đổi (tăng, giảm):
MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); registerReceiver(myBroadcastReceiver, intentFilter);