Broadcast Receivers trong Android

Broadcast Receivers chỉ đơn giản là xử lý và phát các thông điệp từ các ứng dụng khác hoặc từ hệ thống. Ví dụ: các ứng dụng có thể bắt đầu phát thông điệp đến các ứng dụng khác để cho biết rằng một số dữ liệu đã được tải thành công xuống thiết bị và sẵn sàng cho việc sử dụng, Broadcast Receivers sẽ đảm nhận việc thông báo vào đưa ra những hành động thích hợp.

Có hai bước quan trọng để cho Broadcast Receivers làm việc:

  1. Tạo Broadcast Receiver.

  2. Đăng ký Broadcast Receiver.

Có thêm một bước nữa trong trường hợp bạn implement các intents tùy chỉnh của bạn thì bạn sẽ phải tạo và Broadcast các intents đó.

Tạo Broadcast Receiver:

Một Broadcast Receiver được tạo phải kế thừa từ class BroadcastReceiver và phải Override phương thức onReceive().

public class MyReceiver extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }

}

Đăng ký Broadcast Receiver:

Một ứng dụng sẽ lắng nghe các Boadcast intents cụ thể bằng cách đăng ký Broadcast Receiver trong file AndroidManifest.xml. VD: chúng ta sẽ đăng ký MyReceiver cho hệ thống với sự kiện ACTION_BOOT_COMPLETED để gửi ra thông điệp khi hệ thống Android hoàn thành quá trình khởi động.

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >

   <receiver android:name="MyReceiver">
      <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED">
      </action>
      </intent-filter>
   </receiver>

</application>

Bây giờ bất cứ khi nào thiết bị Android của bạn được khởi động. Nó sẽ bị chặn bởi bởi Broadcast Receiver MyReceiver, và khi đó code bên trong phương thức onReceive() sẽ được thực thi.

Có một vài sự kiện hệ thống khác được định nghĩa:

  1. android.intent.action.BATTERY_CHANGED

    : Broadcast về các trạng thái của pin như: sạc, mức độ,…

  2. android.intent.action.BATTERY_LOW

    : Cho biết tình trạng pin yếu trên thiết bị.

  3. android.intent.action.BATTERY_OKAY

    : Cho biết pin đang ở tình trạng tốt sau khi ở tình trạng pin yếu.

  4. android.intent.action.BOOT_COMPLETED

    : Boadcast chỉ thực hiện một lần, sau khi hệ thống hoàn thành việc khỏi động.

  5. android.intent.action.BUG_REPORT

    : Hiển thị 1 activity để báo lỗi.

  6. android.intent.action.CALL

    : Thực hiện cuộc gọi.

  7. android.intent.action.CALL_BUTTON

    : Người dùng nhấn vào button call để đi đến trình quay số.

  8. android.intent.action.DATE_CHANGED

    : Ngày đã được thay đổi.

  9. android.intent.action.REBOOT

    : Khởi động lại thiết bị.

Broacast các intents tùy chỉnh

Nếu bạn muốn ứng dụng của bạn tự nó sẽ phát ra và gửi các intents tùy chỉnh thì bạn sẽ tạo và gửi các intents này bằng cách sử dụng phương thức sendBroadcast() của class activity. Nếu bạn sử dụng phương thức sendStickyBroadcast(Intent), Intent này là Sticky nghĩa là Intent mà bạn đang gửi sẽ còn tồn tại sau khi Broadcast hoàn tất.

public void broadcastIntent(View view)
{
   Intent intent = new Intent();
   intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
   sendBroadcast(intent);
}

Khi đó Intent com.laptrinhtuduy.CUSTOM_INTENT cũng phải được đăng ký một cách tương tự giống như đăng ký các Intent của hệ thống.

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >

   <receiver android:name="MyReceiver">
      <intent-filter>
         <action android:name="com.tutorialspoint.CUSTOM_INTENT">
      </action>
      </intent-filter>
   </receiver>

</application>

Ví dụ: Ví dụ này sẽ giải thích cho bạn làm thế nào để tạo một BroadcastReceiver để bắt một Intent tùy chỉnh.

Tạo Project với tên: BroadcastReceiverExample
File: res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">BroadcastReceiverExample</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <string name="broadcast_intent">Broad Intent</string>
    
</resources>

File: res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <Button android:id="@+id/btnStartService"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/broadcast_intent"
        android:onClick="broadcastIntent"/>
    
</LinearLayout>

File:src/com.example.broadcastreceiverexample/MyReceiver.java

package com.example.broadcastreceiverexample;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
		
	}

}

File: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcastreceiverexample"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.broadcastreceiverexample.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <receiver android:name="MyReceiver">
            <intent-filter >
                <action android:name="com.laptrinhtuduy.CUSTOM_INTENT"/>
            </intent-filter>
        </receiver>
        
    </application>

</manifest>

File:src/com.example.broadcastreceiverexample/MainActivity.java

package com.example.broadcastreceiverexample;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	public void broadcastIntent(View view){
		Intent intent = new Intent();
		intent.setAction("com.laptrinhtuduy.CUSTOM_INTENT");
		sendBroadcast(intent);
	}
}

Kết quả:

DOWNLOAD: SOURCE CODE

 

 

Dựa trên: tutorialspoint

Share this:

Like this:

Like

Loading…