ºÝºÝߣ

ºÝºÝߣShare a Scribd company logo
BroadcastReceiver
Intent myIntent = new
Intent("android.intent.action.MUSIC_PLAYE
R");
startActivity(myIntent);
Tổng quan
• BroadcastReceiver (có thể gá»i là Receiver là
một trong bốn loại thành phần trong ứng dụng
Android. Chức năng dùng để nhận các sự kiện
mà các ứng dụng hoặc hệ thống phát đi.
• Có 2 cách phát-nhận đó là:
– Không có thứ tá»±: receiver nào đủ Ä‘iá»u kiện thì
nhận hết, không phân biệt và cÅ©ng tách rá»i nhau.
– Có thứ tự: receiver nào đăng ký ưu tiên hơn thì
nhận trÆ°á»›c, và có thể truyá»n thêm thông tin xá»­ lý
cho các receiver sau.
Lifecycle
• Thực ra lifecycle của BroadcastReceiver chỉ
có duy nhất một phương thức onReceive().
– Khi có sự kiện mà BroadcastReceiver đã đăng ký
nhận được phát đi, thì phương thức onReceive()
của BroadcastReceiver đó sẽ được gá»i.
– Sau khi thực thi xong phương thức này, lifercycle
của Receiver kết thúc.
Lưu ý khi sử dụng
• Ngay khi onReceive() kết thúc, hệ thống coi
như receiver đã không còn hoạt động và có thể
kill process chứa receiver này bất cứ lúc nào.
Tránh xử lý các code quá lâu trong onReceive().
 Không có xử lý bất đồng bộ, chỠcallback… trong
Receiver (cụ thể như hiển thị Dialog, kết nối
service…)
Một số broadcast thông dụng
• Báo hệ thống khởi động xong
• Báo pin có sự thay đổi
• Báo có package mới cài vào hoặc xóa đi
• Báo tắt máy
• Báo cắm sạc, rút sạc…
Xem thêm tại đây, mục Standard Broadcast
Actions
Một số broadcast khác
• Thông báo tin nhắn tới
• Thông báo cắm, rút thẻ nhớ
• Thông báo có cuá»™c gá»i Ä‘i
• Và các bạn có thể định nghĩa broadcast cho
riêng mình (mục tiêu chính của việc này giúp
bạn có thể liên lạc giữa các ứng dụng bạn viết
hoặc thông báo một sự kiện liên quan đến ứng
dụng của bạn với các ứng dụng khác)
onReceive()
• PhÆ°Æ¡ng thức này được gá»i khi có sá»± kiện
tương ứng được phát đi. Ở trong phương thức
này, ta thấy truyá»n vào context và intent.
– Vì Receiver không kế thừa từ Context nên cần
truyá»n context mà receiver này Ä‘ang chạy vào.
Thứ nhất, để có thể xử lý các phương thức yêu cầu
truyá»n thêm Context, thứ 2, để sá»­ dụng các
phương thức của lớp Context. (còn nữa hay không thì các
bạn giúp mình luôn nhé)
onReceive()
– Intent được truyá»n vào sẽ có đầy đủ thông tin nhÆ°
sự kiện nào mà receiver này đăng ký đã xảy ra dẫn
đến onReceive() được gá»i. Có gá»­i kèm thông tin gì
hoặc dữ liệu gì hay không. Xem các api:
Intent.getAction()
Intent.get…Extra(String dataName)
onReceive()
• Sau khi phÆ°Æ¡ng thức này được gá»i thì vòng
Ä‘á»i của Broadcast Receiver kết thúc tại đây
• Ngay sau khi kết thúc phương thức
onReceive() hệ thống coi như là Broadcast
Receiver đã kết thúc
• Một số Actions tiêu chuẩn hiện hành mà Intent
định nghĩa cho chương trình
ACTION_TIME_TICK
• ACTION_TIME_CHANGED
• ACTION_TIMEZONE_CHANGED
• ACTION_BOOT_COMPLETED
• ACTION_PACKAGE_ADDED
• ACTION_PACKAGE_CHANGED
• ACTION_PACKAGE_REMOVED
• ACTION_PACKAGE_RESTARTED
• ACTION_PACKAGE_DATA_CLEARED
• ACTION_UID_REMOVED
• ACTION_BATTERY_CHANGED
• ACTION_POWER_CONNECTED
• ACTION_POWER_DISCONNECTED
• ACTION_SHUTDOWN
Ví dụ BootReceiver
• Các bạn có thể đăng ký nhận sự kiện hệ thống
vừa khởi động xong để có thể làm việc gì đó
ngay, hoặc vận hành song song với hệ thống…
• Ta sẽ đăng ký nhận sự kiện BOOT_COMPLETED,
sau đó sẽ gá»i má»™t dialog lên hiển thi lá»i chào.
• Khi hệ thống khởi động xong sẽ xuất một
dialog chào user ïŠ
Ví dụ BootReceiver
• Trong manifest, cần đăng ký permission được
nhận sự kiện này
<uses-permission
android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
• Khai báo receiver bên trong thẻ application
<receiver android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Ví dụ BootReceiver
• Ở đây ta khai báo trong manifest là ứng dụng
có một receiver tên là BootReceiver (slide kế
sẽ thấy).
• BootReceiver này đăng ký nhận sự kiện “hệ
thổng khởi Ä‘á»™ng hoàn tấtâ€.
• Dĩ nhiên, muốn nhận sựu kiện dạng này thì
cần phải đăng kí trước để với hệ thống qua
permission để user được biết.
Ví dụ BootReceiver
• Tạo một class mới trong source, tên là
BootReceiver kế thừa BroadcastReceiver.
• Implement lại phương thức onReceive() với
code nhÆ° sau:
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
Intent helloIntent = new Intent(context, HelloBootActivity.class);
helloIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(helloIntent);
}
Ví dụ BootReceiver
• Giải thích một chút: vì Receiver không kế thừa
context nên khi tạo intent má»›i không truyá»n
this vô được, thay vào đó truyá»n cái context đã
được gửi kèm.
• Vì không ở trong 1 activity mà đang ở trong 1
receiver, và một số vấn đỠliên quan tới task
trong Android nên bạn phải thêm cá»
Intent.FLAG_ACTIVITY_NEW_TASK (bạn chỉ có
thể ko dùng cá» này khi bạn gá»i startActivity()
từ một activity)
Ví dụ BootReceiver
• Äá»c tá»›i đây chắc các bạn hiểu ngay là ứng dụng
có một activity tên là HelloBootActivity, activity
này sẽ chỉ hiển thị dạng dialog, và sẽ không được
start bằng cách bấm vào icon trên màn hình. Vì
thế, khai báo trong manifest như sau:
<activity android:name=".HelloBootActivity"
android:theme="@android:style/Theme.Dialog">
</activity>
• Còn activity chỉ hiển thị một cái TextView là
“Chào bạn, mới khởi động xong†và một cái
Button để bấm vào đó thì đóng activity, các bạn
hoàn tất nhé.
Phát sự kiện
• Các bạn có thể phát một sự kiện cho các
receiver khác nhận dạng như sau:
Intent intent = new
Intent("org.multiuni.android.BROADCAST_DEMO");
sendBroadcast(intent);
• Hoặc:
sendOrderedBroadcast(intent, "permission tùy ý hoặc null");
• Ngoài ra còn có một số các gửi broadcast
khác, các bạn tham khảo thêm trong class
ContextWrapper nhé
Bài tập yêu cầu
1. Code vá» chặn cuá»™c gá»i.
2. Viết 2 ứng dụng, ứng dụng A nhập vào một
chuỗi rồi phát đi một sự kiện tự định nghĩa,
kèm theo chuỗi đó. Ứng dụng B nhận sự kiện
đó và hiển thị một Toast có nội dung là chuỗi
nhận được.
public void onReceive(Context context, Intent active) {
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CALL_BUTTON);
Bundle receiver = active.getExtras();
String state = receiver.getString(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
Toast.makeText(context, "there is new calling", Toast.LENGTH_LONG).show();
}
}
AndroidManifest.xml :
uses-permission android:name="android.permission.READ_PHONE_STATE"
action android:name="android.intent.action.PHONE_STATE"

More Related Content

ºÝºÝߣ bài giảng lập trình Android DTU - Phần 5 (Broadcastreceiver)

  • 1. BroadcastReceiver Intent myIntent = new Intent("android.intent.action.MUSIC_PLAYE R"); startActivity(myIntent);
  • 2. Tổng quan • BroadcastReceiver (có thể gá»i là Receiver là má»™t trong bốn loại thành phần trong ứng dụng Android. Chức năng dùng để nhận các sá»± kiện mà các ứng dụng hoặc hệ thống phát Ä‘i. • Có 2 cách phát-nhận đó là: – Không có thứ tá»±: receiver nào đủ Ä‘iá»u kiện thì nhận hết, không phân biệt và cÅ©ng tách rá»i nhau. – Có thứ tá»±: receiver nào đăng ký Æ°u tiên hÆ¡n thì nhận trÆ°á»›c, và có thể truyá»n thêm thông tin xá»­ lý cho các receiver sau.
  • 3. Lifecycle • Thá»±c ra lifecycle của BroadcastReceiver chỉ có duy nhất má»™t phÆ°Æ¡ng thức onReceive(). – Khi có sá»± kiện mà BroadcastReceiver đã đăng ký nhận được phát Ä‘i, thì phÆ°Æ¡ng thức onReceive() của BroadcastReceiver đó sẽ được gá»i. – Sau khi thá»±c thi xong phÆ°Æ¡ng thức này, lifercycle của Receiver kết thúc.
  • 4. LÆ°u ý khi sá»­ dụng • Ngay khi onReceive() kết thúc, hệ thống coi nhÆ° receiver đã không còn hoạt Ä‘á»™ng và có thể kill process chứa receiver này bất cứ lúc nào. Tránh xá»­ lý các code quá lâu trong onReceive().  Không có xá»­ lý bất đồng bá»™, chá» callback… trong Receiver (cụ thể nhÆ° hiển thị Dialog, kết nối service…)
  • 5. Má»™t số broadcast thông dụng • Báo hệ thống khởi Ä‘á»™ng xong • Báo pin có sá»± thay đổi • Báo có package má»›i cài vào hoặc xóa Ä‘i • Báo tắt máy • Báo cắm sạc, rút sạc… Xem thêm tại đây, mục Standard Broadcast Actions
  • 6. Má»™t số broadcast khác • Thông báo tin nhắn tá»›i • Thông báo cắm, rút thẻ nhá»› • Thông báo có cuá»™c gá»i Ä‘i • Và các bạn có thể định nghÄ©a broadcast cho riêng mình (mục tiêu chính của việc này giúp bạn có thể liên lạc giữa các ứng dụng bạn viết hoặc thông báo má»™t sá»± kiện liên quan đến ứng dụng của bạn vá»›i các ứng dụng khác)
  • 7. onReceive() • PhÆ°Æ¡ng thức này được gá»i khi có sá»± kiện tÆ°Æ¡ng ứng được phát Ä‘i. Ở trong phÆ°Æ¡ng thức này, ta thấy truyá»n vào context và intent. – Vì Receiver không kế thừa từ Context nên cần truyá»n context mà receiver này Ä‘ang chạy vào. Thứ nhất, để có thể xá»­ lý các phÆ°Æ¡ng thức yêu cầu truyá»n thêm Context, thứ 2, để sá»­ dụng các phÆ°Æ¡ng thức của lá»›p Context. (còn nữa hay không thì các bạn giúp mình luôn nhé)
  • 8. onReceive() – Intent được truyá»n vào sẽ có đầy đủ thông tin nhÆ° sá»± kiện nào mà receiver này đăng ký đã xảy ra dẫn đến onReceive() được gá»i. Có gá»­i kèm thông tin gì hoặc dữ liệu gì hay không. Xem các api: Intent.getAction() Intent.get…Extra(String dataName)
  • 9. onReceive() • Sau khi phÆ°Æ¡ng thức này được gá»i thì vòng Ä‘á»i của Broadcast Receiver kết thúc tại đây • Ngay sau khi kết thúc phÆ°Æ¡ng thức onReceive() hệ thống coi nhÆ° là Broadcast Receiver đã kết thúc
  • 10. • Má»™t số Actions tiêu chuẩn hiện hành mà Intent định nghÄ©a cho chÆ°Æ¡ng trình ACTION_TIME_TICK • ACTION_TIME_CHANGED • ACTION_TIMEZONE_CHANGED • ACTION_BOOT_COMPLETED • ACTION_PACKAGE_ADDED • ACTION_PACKAGE_CHANGED • ACTION_PACKAGE_REMOVED • ACTION_PACKAGE_RESTARTED • ACTION_PACKAGE_DATA_CLEARED • ACTION_UID_REMOVED • ACTION_BATTERY_CHANGED • ACTION_POWER_CONNECTED • ACTION_POWER_DISCONNECTED • ACTION_SHUTDOWN
  • 11. Ví dụ BootReceiver • Các bạn có thể đăng ký nhận sá»± kiện hệ thống vừa khởi Ä‘á»™ng xong để có thể làm việc gì đó ngay, hoặc vận hành song song vá»›i hệ thống… • Ta sẽ đăng ký nhận sá»± kiện BOOT_COMPLETED, sau đó sẽ gá»i má»™t dialog lên hiển thi lá»i chào. • Khi hệ thống khởi Ä‘á»™ng xong sẽ xuất má»™t dialog chào user ïŠ
  • 12. Ví dụ BootReceiver • Trong manifest, cần đăng ký permission được nhận sá»± kiện này <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> • Khai báo receiver bên trong thẻ application <receiver android:name=".BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
  • 13. Ví dụ BootReceiver • Ở đây ta khai báo trong manifest là ứng dụng có má»™t receiver tên là BootReceiver (slide kế sẽ thấy). • BootReceiver này đăng ký nhận sá»± kiện “hệ thổng khởi Ä‘á»™ng hoàn tấtâ€. • DÄ© nhiên, muốn nhận sá»±u kiện dạng này thì cần phải đăng kí trÆ°á»›c để vá»›i hệ thống qua permission để user được biết.
  • 14. Ví dụ BootReceiver • Tạo má»™t class má»›i trong source, tên là BootReceiver kế thừa BroadcastReceiver. • Implement lại phÆ°Æ¡ng thức onReceive() vá»›i code nhÆ° sau: if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent helloIntent = new Intent(context, HelloBootActivity.class); helloIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(helloIntent); }
  • 15. Ví dụ BootReceiver • Giải thích má»™t chút: vì Receiver không kế thừa context nên khi tạo intent má»›i không truyá»n this vô được, thay vào đó truyá»n cái context đã được gá»­i kèm. • Vì không ở trong 1 activity mà Ä‘ang ở trong 1 receiver, và má»™t số vấn Ä‘á» liên quan tá»›i task trong Android nên bạn phải thêm cá» Intent.FLAG_ACTIVITY_NEW_TASK (bạn chỉ có thể ko dùng cá» này khi bạn gá»i startActivity() từ má»™t activity)
  • 16. Ví dụ BootReceiver • Äá»c tá»›i đây chắc các bạn hiểu ngay là ứng dụng có má»™t activity tên là HelloBootActivity, activity này sẽ chỉ hiển thị dạng dialog, và sẽ không được start bằng cách bấm vào icon trên màn hình. Vì thế, khai báo trong manifest nhÆ° sau: <activity android:name=".HelloBootActivity" android:theme="@android:style/Theme.Dialog"> </activity> • Còn activity chỉ hiển thị má»™t cái TextView là “Chào bạn, má»›i khởi Ä‘á»™ng xong†và má»™t cái Button để bấm vào đó thì đóng activity, các bạn hoàn tất nhé.
  • 17. Phát sá»± kiện • Các bạn có thể phát má»™t sá»± kiện cho các receiver khác nhận dạng nhÆ° sau: Intent intent = new Intent("org.multiuni.android.BROADCAST_DEMO"); sendBroadcast(intent); • Hoặc: sendOrderedBroadcast(intent, "permission tùy ý hoặc null"); • Ngoài ra còn có má»™t số các gá»­i broadcast khác, các bạn tham khảo thêm trong class ContextWrapper nhé
  • 18. Bài tập yêu cầu 1. Code vá» chặn cuá»™c gá»i. 2. Viết 2 ứng dụng, ứng dụng A nhập vào má»™t chuá»—i rồi phát Ä‘i má»™t sá»± kiện tá»± định nghÄ©a, kèm theo chuá»—i đó. Ứng dụng B nhận sá»± kiện đó và hiển thị má»™t Toast có ná»™i dung là chuá»—i nhận được.
  • 19. public void onReceive(Context context, Intent active) { IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CALL_BUTTON); Bundle receiver = active.getExtras(); String state = receiver.getString(TelephonyManager.EXTRA_STATE); if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { Toast.makeText(context, "there is new calling", Toast.LENGTH_LONG).show(); } } AndroidManifest.xml : uses-permission android:name="android.permission.READ_PHONE_STATE" action android:name="android.intent.action.PHONE_STATE"