CoordinatorLayout 2 (Bài trước)
(Bài tiếp) Theme Android (1)

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.
Nếu muốn lan truyền (gửi) Broadcast Intent trong nội bộ ứng dụng (cùng process - để tối ưu và an ) thì thay vì sử dụng 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);
}
Nếu muốn đăng ký, huỷ đăng ký BroadcastReceiver hoạt động trong nội bộ ứng dụng thì dùng đến LocalBroadcastManager ví dụ:
//ĐĂNG KÝ
LocalBroadcastManager.getInstance(context).registerReceiver(receiver,intentfilter);

//HUỶ
LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver);
        

Ứng dụng ví dụ:

Intent Android

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_actionsbroadcast_actions

Một số Action quan trọng như:

  • android.intent.action.BATTERY_CHANGED (Intent.ACTION_BATTERY_CHANGED) thay đổi trạng thái PIN
  • android.intent.action.BATTERY_LOW (Intent.ACTION_BATTERY_LOW) PIN ở mức thấp
  • android.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áy
  • android.intent.action.CALL_BUTTON (Intent.ACTION_CALL_BUTTON) bấm nút gọi
  • android.intent.action.DATE_CHANGED (Intent.ACTION_DATE_CHANGED) ngày thay đổi
  • android.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);

Đăng ký nhận bài viết mới
CoordinatorLayout 2 (Bài trước)
(Bài tiếp) Theme Android (1)