Broadcast Receiver trong Android
Trong Android, Broadcast Receiver là một component cho phép hệ thống hoặc các ứng dụng khác phân phối các sự kiện đến ứng dụng như: Gửi tin nhắn pin yếu hoặc màn hình tắt tin nhắn đến ứng dụng. Các ứng dụng cũng có thể bắt đầu khởi tạo tín hiệu broadcast để cho các ứng dụng khác biết rằng dữ liệu cần thiết có sẵn trong thiết bị để sử dụng nó.
Nói chung, chúng ta sử dụng Intent gửi các sự kiện broadcast cho các ứng dụng khác và Broadcast Receivers sử dụng thông báo trên thanh trạng thái để cho phép người dùng biết rằng sự kiện xảy ra.
Trong Android, Broadcast Receiver được kế thừa như một lớp con của BroadcastReceiver và mỗi tín hiệu (broadcast) được truyền dưới dạng đối tượng Intent .
Chúng ta có thể đăng ký ứng dụng chỉ để nhận được một vài tin nhắn broadcast. Khi một broadcast được nhận, hệ thống sẽ kiểm tra broadcast được chỉ định đã đăng ký hay chưa dựa trên việc nó sẽ định tuyến các broadcast đến các ứng dụng.
Bài viết này được đăng tại [free tuts .net]
I. Nhận Broadcast
Trong Android có thể nhận được các broadcast bằng việc đăng ký theo hai cách.
Cách thứ nhất là broadcast bằng file manifest Android ( AndroidManifest.xml ). Chúng ta cần dùng phần tử <receive> trong file như dưới đây.
<receiver android:name=".SampleBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
Code trên sẽ kích hoạt sự kiện hệ thống broadcast trong code bất cứ khi nào quá trình khởi động hoàn thành.
Một cách khác là đăng ký một phương thức nhận tự động thông qua phương thức Context.registerReceiver () . Để đăng ký phương thức broadcast receiver, chúng ta cần kế thừa lớp bằng BroadcastReceiver và cần triển khai phương thức onReceive(Context, Intent) như được hiển thị bên dưới.
public class MainActivity extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, log, Toast.LENGTH_LONG).show(); } }
Giả sử nếu chúng ta đăng ký sự kiện ACTION_BOOT_COMPLETED , bất cứ khi nào quá trình khởi động được hoàn thành, phương thức onReceive() sẽ được gọi.
II. Gửi Broadcast
Trong Android có thể gửi một broadcast trong ứng dụng bằng ba cách khác nhau
Phương thức | Mô tả |
---|---|
sendOrderedBroadcast(Intent, String) | Được sử dụng để gửi broadcast đến một nơi nhận tại một thời điểm. |
sendBroadcast(Intent) | Được sử dụng để gửi broadcast đến tất cả các nơi nhận theo thứ tự không xác định. |
LoadBroadcastManager.sendBroadcast | Được sử dụng để gửi broadcast đến các nơi nhận trong cùng ứng dụng với nơi gửi |
III. Tùy chỉnh Broadcast theo Intent
Trong Android, chúng ta có thể tạo các broadcast tùy chỉnh bằng cách sử dụng intent. Sau đây là đoạn code đơn giản để gửi broadcast bằng cách tạo một Intent bằng phương thức sendBroadcast(Intent)
Intent sintent = new Intent(); intent.setAction("com.tutlane.broadcast.MY_NOTIFICATION"); intent.putExtra("data","Welcome to Tutlane"); sendBroadcast(intent);
Với đoạn code trên, chúng ta tạo một Intent tùy chỉnh "sintent". Chúng ta cần đăng ký intent này trong file Androidmanifest như dưới đây
<receiver android:name=".SampleBroadcastReceiver"> <intent-filter> <action android:name=" com.tutlane.broadcast.MY_NOTIFICATION"/> </intent-filter> </receiver>
Đây là cách tạo ra broadcast tùy chỉnh trong ứng dụng bằng cách sử dụng Intent.
IV. Hệ thống Broadcasts
Trong Android, một số sự kiện hệ thống được định nghĩa là các trường final static trong lớp Intent. Sau đây là một số sự kiện có sẵn trong các ứng dụng Android.
Sự kiện | Mô tả |
---|---|
android.intent.action.BOOT_COMPLETED | Đưa ra một sự kiện khi việc khởi động hoàn thành. |
android.intent.action.POWER_CONNECTED | Được sử dụng để kích hoạt một sự kiện khi nguồn điện được kết nối với thiết bị. |
android.intent.action.POWER_DISCONNECTED | Được sử dụng để kích hoạt một sự kiện khi nguồn bị ngắt khỏi thiết bị. |
android.intent.action.BATTERY_LOW | Được sử dụng để gọi một sự kiện khi thiết bị pin yếu. |
android.intent.action.BATTERY_OKAY | Được sử dụng để gọi một sự kiện khi pin lại OKAY. |
android.intent.action.REBOOT | Gọi một sự kiện khi thiết bị khởi động lại một lần nữa. |
Tương tự, có nhiều sự kiện hệ thống có sẵn trong ứng dụng Android.
V. Ví dụ về BroadcastReceiver trong Android
Để thiết lập BroadcastReceiver trong ứng dụng Android, chúng ta cần thực hiện các thao tác sau.
- Tạo BroadcastReceiver
- Đăng ký BroadcastReceiver
Tạo một ứng dụng Android mới bằng android studio và đặt tên là BroadcastReceiver .
Bây giờ chúng ta cần tạo file nội dung broadcast tên là MyBroadcastReceiver.java trong đường dẫn \ src \ main \ java \ com.tutlane.broadcastreceiver
để xác định provider thực tế và các phương thức liên quan bằng cách nhấp chuột phải vào folder ứng dụng của bạn -> New -> chọn Java Class và đặt tên là MyBroadcastReceiver.java.
Khi tạo file MyBroadcastReceiver.java xong, nhập mã như dưới đây
MyBroadcastReceiver.java
package com.tutlane.broadcastreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; /** * Created by Tutlane on 01-08-2017. */ public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ CharSequence iData = intent.getCharSequenceExtra("msg"); Toast.makeText(context,"Tutlane Received Message: "+iData,Toast.LENGTH_LONG).show(); } }
Bây giờ mở file Activity_main.xml từ đường dẫn \ src \ main \ res \ layout
và viết đoạn mã sau.
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/txtMsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="100dp" android:layout_marginTop="180dp" android:ems="10"/> <Button android:id="@+id/btnShow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClickShowBroadcast" android:layout_marginLeft="130dp" android:text="Show Broadcast"/> </LinearLayout>
Bây giờ mở file MainActivity.java từ đường dẫn \ java \ com.tutlane.broadcastreceiver
và viết mã để tùy chỉnh broadcast bằng intent.
MainActivity.java
package com.tutlane.broadcastreceiver; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClickShowBroadcast(View view){ EditText st = (EditText)findViewById(R.id.txtMsg); Intent intent = new Intent(); intent.putExtra("msg",(CharSequence)st.getText().toString()); intent.setAction("com.tutlane.CUSTOM_INTENT"); sendBroadcast(intent); } }
Bây giờ chúng ta cần đăng ký broadcast receiver trong file manifest Android ( AndroidManifest.xml ) bằng cách sử dụng thuộc tính <receive> như hiển thị bên dưới.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tutlane.broadcastreceiver"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="MyBroadcastReceiver"> <intent-filter> <action android:name="com.tutlane.CUSTOM_INTENT"> </action> </intent-filter> </receiver> </application> </manifest>
IV. Kết quả của ví dụ về BroadcastReceiver
Khi chạy ví dụ trên trong trình giả lập Android thì sẽ nhận được kết quả như hiển thị bên dưới
Đây là cách sử dụng broadcast receiver trong các ứng dụng Android để gửi tin nhắn broadcast đến các ứng dụng.