You are on page 1of 31

Intent, Intent Filters và

Broadcast Receivers
Mục lục

● Intent và Intent Filters


● Broadcast Receivers
● Nhận System Broadcast
Khái niệm Intents

● 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

● Sử dụng DownloadService để download tệp tin

// Executed in an Activity, so 'this' is the Context

// The fileUrl is a string URL, such as "http://www.example.com/image.png"

Intent downloadIntent = new Intent(this, DownloadService.class);

downloadIntent.setData(Uri.parse(fileUrl));

startService(downloadIntent);
Ví dụ Implicit Intent

● Intent chia sẻ thông điệp qua một ứng dụng

// Create the text message with a string

Intent sendIntent = new Intent();

sendIntent.setAction(Intent.ACTION_SEND);

sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);

sendIntent.setType("text/plain");

// Verify that the intent will resolve to an activity

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 1 Activity A tạo một Intent và truyền vào startActivity()

Bước 2 Hệ thống tìm kiếm intent filter phù hợp với Intent đó

Hệ thống mở Activity phù hợp bằng phương


Bước 3 thức onCreate() và truyền vào
Xây dựng một 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

● Tên thành phần cần khởi động


● Quy định intent là explicit intent, nếu không có component name, hệ thống
quyết định thành phần nhận intent dựa trên thông tin khác
● Đối tượng ComponentName chứa tên class thành phần đích, bao gồm cả
tên package của app (vd: com.example.ExampleActivity)

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

● Một URI tham chiếu đến dữ liệu


● Thường cung cấp thêm kiểu của dữ liệu (MIME type)
● Một số phương thức thiết lập:
○ setData(): thiết lập URI của dữ liệu
○ setType(): thiết lập MIME type
○ setDataAndType(): thiết lập cả hai thuộc tính trên

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

● Một chuỗi ký tự mô tả kiểu thành phần nên xử lý Intent


● Một số category thông thường:
○ CATEGORY_BROWSABLE
○ CATEGORY_LAUNCHER
● Sử dụng phương thức addCategory() để chỉ định category
Thông tin chứa trong Intent - Extras

● 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

VD: static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";


Thông tin chứa trong Intent - Flags

● Được định nghĩa trong lớp Intent


● Đóng vai trò như metadata của Intent
● Chỉ dẫn hệ thống cách thức mở một Activity và các hành động sau khi khởi
động
● Sử dụng phương thức setFlags()
Sử dụng Intent Filter

● Cho biết ứng dụng có thể nhận những Intents nào


● Với mỗi thành phần ứng dụng, khai báo trong một thẻ <intent-filter> trong
manifest, nằm trong một thành phần ứng dụng (vd: một Activity)
● Trong đó có thể khai báo các thuộc tính sau: <action>, <data>, <category>
● Ví dụ: Một activity với intent filter để nhận ACTION_SEND intent

<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

● Intent và Intent Filters


● Broadcast Receivers
● Nhận System Broadcast
Sử dụng Intent để broadcast Events

● 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ụ

Intent intent = new Intent(LifeformDetectedReceiver.NEW_LIFEFORM);


intent.putExtra(LifeformDetectedReceiver.EXTRA_LIFEFORM_NAME,
detectedLifeform);
intent.putExtra(LifeformDetectedReceiver.EXTRA_LONGITUDE,
currentLongitude);
intent.putExtra(LifeformDetectedReceiver.EXTRA_LATITUDE,
currentLatitude);
sendBroadcast(intent);
Broadcast Receiver

● Lắng nghe Broadcast Intents


● Phải được đăng ký
● Sử dụng Intent filter để chỉ rõ Intent nào receiver đang lắng nghe
● Kế thừa lớp BroadcastReceiver và ghi đè phương thức onReceive()

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

● Lắng nghe thay đổi trạng thái pin


IntentFilter batIntentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent battery = context.registerReceiver(null, batIntentFilter);
int status = battery.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging =
status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
Theo dõi thay đổi trạng thái sử dụng Broadcast Receiver

● Lắng nghe thay đổi các kết nối


String svcName = Context.CONNECTIVITY_SERVICE;
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(svcName);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork.isConnectedOrConnecting();
boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE;
Filters in dynamic Broadcast Receivers

● 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

● Intent và Intent Filters


● Broadcast Receivers
● Nhận System Broadcast
Broadcast action, category and data

● Các thông tin có trong broadcast


○ Action: tên của action cần phục vụ, chuỗi ký tự duy nhất
○ Category: mô tả ngữ cảnh
■ ALTERNATIVE
■ SELECTED_ALTERNATIVE
■ BROWSABLE
■ DEFAULT
■ HOME
■ LAUNCHER
○ Data: mô tả kiểu dữ liệu tác động lên
Đăng ký Broadcast Receiver trong mã nguồn

● Đố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

● Sử dụng cặp tag <receiver></receiver>


● Chỉ rõ tên lớp của Broadcast Receiver cần đăng ký
● Dùng <intent-filter></intent-filter> để chỉ rõ action của Intent đang lắng
nghe
<receiver android:name=”.LifeformDetectedReceiver”>
<intent-filter>
<action android:name=”com.paad.alien.action.NEW_LIFEFORM”/>
</intent-filter>
</receiver>

● Active ngay cả khi ứng dụng chưa được mở hoặc đã bị kill

You might also like