Professional Documents
Culture Documents
08-Intent Filters Và Broadcast Receivers
08-Intent Filters Và Broadcast Receivers
Broadcast Receivers
Mục lục
● Intent là một đối tượng truyền tin được sử dụng để yêu cầu một hành động
cụ thể từ một thành phần khác của ứng dụng
● Một số trường hợp sử dụng Intents:
○ Mở Activity
○ Chạy service
○ Gửi thông điệp broadcast
Sử dụng Intents mở Activity
● Một Activity đại diện cho một màn hình trong ứng dụng
● Có thể khởi tạo một Activity bằng cách truyền một Intent vào phương thức
startActivity()
● Intent mô tả Activity cần mở và dữ liệu cần thiết
● Nếu cần nhận kết quả từ Activity khi kết thúc, sử dụng phương thức
startActivityForResult()
Sử dụng Intents để chạy service
● Một service là một thành phần thực thi một hành động trên background
mà không cần tới giao diện người dùng
● Có thể khởi động service sử dụng phương thức trong lớp Service (API <21)
● Khởi động loại service chỉ chạy một lần bằng cách truyền một Intent vào
phương thức startService()
● Hoặc có thể bind tới service bằng cách truyền một Intent vào phương thức
bindService()
Sử dụng Intents để gửi thông điệp broadcast
● Broadcast là một thông điệp mà bất cứ ứng dụng nào cũng có thể nhận
được
● Hệ thống gửi vô số thông điệp broadcasts cho những sự kiện hệ thống
● Gửi broadcasts tới ứng dụng bằng cách truyền Intent tới phương thức
sendBroadcast() hoặc sendOrderedBroadcast()
Các kiểu Intents
2 kiểu Intents
● Explicit intents
○ Chỉ định ứng dụng sẽ thỏa mãn intents
○ Cung cấp tên package của ứng dụng hoặc tên lớp của thành phần đích
○ Thông thường để mở các thành phần trong chính ứng dụng
○ VD: khởi động một service để download file trên background, ...
● Implicit intents
○ Không chỉ đích danh thành phần nào trong ứng dụng
○ Định nghĩa một hành động tổng quát, cho phép thành phần của ứng dụng khác
xử lý
○ VD: gửi intent yêu cầu một ứng dụng khác hiển thị một vị trí cụ thể trên bản đồ, ...
Ví dụ Explicit Intent
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);
Ví dụ Implicit Intent
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(sendIntent);
}
Quá trình sử dụng Intent để mở một Activity
Quá trình sử dụng Intent để mở một Activity
Bước 2 Hệ thống tìm kiếm intent filter phù hợp với Intent đó
● Intent chứa thông tin xác định thành phần cần mở và dữ liệu
● Các thông tin chính chứa trong Intent bao gồm:
○ Component name
○ Action
○ Data
○ Category
○ Extras
○ Flags
● Component name, action, data, category được dùng để xác định thành
phần cần mở
Thông tin chứa trong Intent - Component name
Chú ý: Khi khởi động Service, luôn luôn chỉ định component name để đảm bảo
chính xác Service được chạy
Thông tin chứa trong Intent - Action
● Một chuỗi ký tự quy định hành động thực hiện (ví dụ view hay pick)
● Một số hằng quy định action trong class Intent:
○ ACTION_VIEW: sử dụng khi cần hiển thị thông tin tới người dùng
○ ACTION_SEND: sử dụng khi cần chia sẻ dữ liệu thông qua ứng dụng khác
● Có thể sử dụng phương thức setAction() hoặc thông qua phương thức khởi
tạo Intent
Thông tin chứa trong Intent -Data
Chú ý: không sử dụng setData() và setType() để thiết lập 2 thuộc tính trên, do
mặc định mỗi hàm sẽ thiết lập giá trị còn lại là null => sử dụng setDataAndType()
Thông tin chứa trong Intent - Category
● Các cặp key-value mang thông tin bổ sung để hoàn thành action yêu cầu
● Sử dụng phương thức putExtra() với các tham số key-value hoặc tạo đối
tượng Bundle chứa toàn bộ thông dữ liệu Extras
● Lớp Intent định nghĩa một số hằng EXTRA_* cho các kiểu dữ liệu đã chuẩn
hóa
● Có thể tự định nghĩa
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
Intent matching
● Tìm thành phần đích để kích hoạt hoặc tập các thành phần có điểm chung
● Ví dụ: khi nhấn nút Home, các activity có intent với ACTION_MAIN và
CATEGORY_LAUNCHER sẽ match với intent filter
● Lớp PackageManager cung cấp các phương thức trả về các thành phần
chấp nhận một Intent cụ thể hoặc thành phần phù hợp nhất
Mục lục
● Tạo Intent bên trong ứng dụng và gọi sendBroadcast() để gửi đi thông điệp
● Thiết lập action, data và category của Intent
● Ví dụ
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//TODO: React to the Intent received.
}
}
Theo dõi thay đổi trạng thái sử dụng Broadcast Receiver
● Sử dụng Package Manager, có thể enable hoặc disable manifest bất cứ lúc
nào tại run time
● Disable các receivers không cần thiết nữa
● Phương thức setComponentEnabledSetting()
ComponentName myReceiverName = new ComponentName(this, MyReceiver.class);
PackageManager pm = getPackageManager();
// Enable a manifest receiver
pm.setComponentEnabledSetting(myReceiverName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
// Disable a manifest receiver
pm.setComponentEnabledSetting(myReceiverName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Mục lục
● Đối với các receiver ảnh hưởng tới UI của một Activity cụ thể
● Chỉ phản hồi với Broadcast Intents khi thành phần được đăng ký đang chạy
● Ghi đè phương thức trong lớp IntentFilter
@Override
public void onResume() {
super.onResume();
registerReceiver(receiver, filter); // Register the broadcast receiver
}
@Override
public void onPause() {
unregisterReceiver(receiver); // Unregister the receiver
super.onPause();
}
Đăng ký Broadcast Receiver trong Manifest