[AndroidAdvance] Bài 1: Broadcast Receiver trong Android, đăng ký bằng coding

Nối tiếp loạt bài về Intent bài này mình giới thiệu tới các bạn một thành phần cũng rất quan trọng trong Android là BroadcastReceiver nó là một trong những thành phần chính của Android.  BroadcastReceiver dùng để nhận các intent từ hệ thống hoặc trao đổi dữ liệu giữa hai hay nhiều ứng dụng. Nói là nhận các intent từ hệ thống mới nghe có vẻ khó hiểu do đó mình sẽ có một ví dụ cụ thể sau:

Chắc hẳn nhiều bạn mới học Android mà có tính tò mò thì sẽ tự hỏi “khi có một tin nhắn đến phần mềm làm sao có thể biết được tin nhắn đến” hay là làm sao để biết có cuộc gọi đến? đang sạc pin hay đã rút sạc,…. Android cung cấp riêng một thành phần BroadcastReceiver dùng để nhận biết các thông tin đó từ hệ điều hành.

Một ứng dụng muốn nhận được các thông tin từ hệ thống nó phải đăng ký sử dụng BroadcastReceiver, đăng ký có hai cách:

1. Đăng ký ngay trong coding: Cách này ít được dùng vì chỉ khi ứng dụng mở lên nó mới nhận các thông tin từ hệ thống, khi ứng dụng tắt đi thì nó cũng không nhận được nữa.

2. Đăng ký trong AndroidMaintifest.xml: Cách này được sử dụng rất nhiều, với cách đăng ký này ngay cả khi ứng dụng của bạn đang tắt nó vẫn có thể nhận được thông tin từ hệ thống, khi nhận được thông tin nó lập tức khởi động ứng dụng (Bạn thử liên tưởng tới phần mềm nhắn tin xem, khi có tin cái là nó tự mở luôn 🙂 ).

Bài hôm nay mình sẽ trình bày tới các bạn cách thứ nhất đăng ký trong coding với demo nhận biết trạng thái sạc pin/ không sạc pin.

 Screenshot_2014-07-12-13-49-00 Screenshot_2014-07-12-13-49-07

Đăng ký nhận thông tin từ hệ thống chúng ta phải tạo một đối tượng IntentFilter để lọc những thông tin cần thiết, ở đây chúng ta sẽ lọc hai sự kiện cắm sạc và rút sạc.

IntentFilter filter = new IntentFilter();
// Đăng ký lọc sự kiện cắm sạc và rút sạc cho intentfilter
filter.addAction("android.intent.action.ACTION_POWER_CONNECTED");
filter.addAction("android.intent.action.ACTION_POWER_DISCONNECTED");

Sau khi đăng ký lọc sự kiện ta phải đăng ký với hệ thống xử lý các sự kiện đó qua BroadcastReceiver

// Khởi tạo BroadcastReceiver
BroadcastReceiver receiver = new BroadcastReceiver() {

	// Phương thức này sẽ được hệ thống gọi khi nhận được sự kiện đang sạc pin
	@Override
	public void onReceive(Context context, Intent intent) {
		// nội dung công việc cần làm khi sự kiện đã đăng ký xảy ra
	}
}

// Đăng ký nhận và xử lý các sự kiện
registerReceiver(receiver, filter); // được viết trong Activity

Ta sẽ đi vào viết mã cho app với file giao diện trước, về giao diện thì chỉ có một TextView thôi 🙂

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

Đăng ký cho hệ thống biết chương trình sẽ nhận thông tin bộ sạc ActivityMain.java

package opin.onreceiversms;

import opin.onreceiversms_incodeding.R;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.TextView;

public class ActivityMain extends Activity {

	private BroadcastReceiver receiver = null;

	@Override
	public void onCreate(Bundle bundle){
		super.onCreate(bundle);
		setContentView(R.layout.main_activity);
		final TextView textView = (TextView) findViewById(R.id.textView1);

		IntentFilter filter = new IntentFilter();
		// Đăng ký lọc sự kiện cắm sạc và rút sạc cho intentfilter
		filter.addAction("android.intent.action.ACTION_POWER_CONNECTED");
		filter.addAction("android.intent.action.ACTION_POWER_DISCONNECTED");

		receiver = new BroadcastReceiver() {

			// Phương thức này sẽ được hệ thống gọi khi nhận được sự kiện đang sạc pin
			@Override
			public void onReceive(Context context, Intent intent) {

				// nếu sự kiện nhận được là kết nối sạc
				if(intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)){
					textView.setText(" Đang sạc pin");
				}
				// nếu sự kiện nhận đưọc là rút sạc
				if(intent.getAction().endsWith(Intent.ACTION_POWER_DISCONNECTED)){
					textView.setText(" Đã rút sạc");
				}
			}
		};

		// Đăng ký nhận thông tin với hệ thống
		registerReceiver(receiver, filter);

	}

	@Override
	public void onDestroy(){
		// hủy đăng ký
		if (receiver != null) {
			unregisterReceiver(receiver);
		}
		super.onDestroy();
	}
}

Ở trên các bạn thấy lệnh:
filter.addAction(“android.intent.action.ACTION_POWER_CONNECTED”);
Để biết được các hành động nào có thể đăng ký mình sẽ hướng dẫn ở bài sau. hoặc bạn có thể xem một số hành động ở đây:
http://developer.android.com/reference/android/content/Intent.html

Các khâu thủ tục như vậy là xong, các bạn có thể chạy sau đó thử cắm và rút sạc xem sao.

Các bạn có thể download code mẫu ở đây:

https://www.dropbox.com/sh/hj4y6te7tp2hy48/AAD2vqJtuVCJ0FeEs-PguODea

Share this:

Thích bài này:

Thích

Đang tải…