Bài 40: Tìm hiểu Broadcast Receiver, ứng dụng viết phần mềm xử lý tin nhắn rác

Tui đã trình bày “Sương Sương” xong phần cơ bản loanh quanh của Android, từ bài tập 40 trở đi Tui muốn trình bày về các kiến thức chuyên sâu bên trong hệ điều hành Android. Bạn cần phải hiểu thật rõ những phần “Sương Sương” trước đó để áp dụng tốt cho những phần chuyên sâu về sau.

BroadCast Receiver rất phức tạp và rất hữu dụng, thông qua nó mà ta có thể viết các Services cho điện thoại, trước khi tìm hiểu BroadCast Receiver thì bạn cần hiểu sơ qua về Intent – Filter, Uri parse và một số kiến thức khác.

broadcast1

– Intent‐filter giống như bộ lọc, giúp ta chọn đúng tác vụ để thực thi, chi tiết bạn xem tại http://developer.android.com/reference/android/content/IntentFilter.html

broadcast2

– Ta có 2 cách đăng ký Broadcast Receiver:

1) Đăng ký trong coding: Lắng nghe mọi thứ trong Intent- filter (nếu tắt ứng dụng sẽ không lắng nghe)

2) Đăng ký trong Manifest: Nó trở thành dịch vụ, tự động lắng nghe mọi thứ trong Intent – filter (kể cả khi đã đóng ứng dụng)

Tui sẽ làm ví dụ về BroadCast Receiver trong trường hợp số 1 trước, trường hợp số 2 Tui sẽ lấy 1 bài tập mà Tui yêu cầu sinh viên của tui thực hiện, sinh viên này rất khá, các bạn có thể trao đổi học tập với bạn này.

Ở ví dụ này đơn giản chỉ là yêu cầu ứng dụng lắng nghe tin nhắn gửi tới, nếu như có bất kỳ tin nhắn nào đó gửi tới thì hiển thị lên TextView của ứng dụng.

Bạn tạo Project như sau:

broadcast3giao diện vô cùng đơn giản tới mức tầm thường như sau:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/LinearLayout1"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity" >

<TextView
 android:id="@+id/textView1"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="TextView" />

</LinearLayout>

Vì lắng nghe tin nhắn gửi tới nên bắt buộc trong Manifest ta phải cấp quyền cho ứng dụng như sau:


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

<uses-sdk
 android:minSdkVersion="14"
 android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.RECEIVE_SMS" />

<application
 android:allowBackup="true"
 android:icon="@drawable/ic_launcher"
 android:label="@string/app_name"
 android:theme="@style/AppTheme" >
 <activity
 android:name="tranduythanh.com.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>
 </application>

</manifest>

Bạn chú ý dòng lệnh 11, đó là cách đăng ký nhận tin nhắn. Chú ý là bạn có thể dùng giao diện để chọn cho tiện vì bạn không thể nhớ hết được (xem lại các bài trước Tui đã trình bày).

– Source code trong MainActivity để xử lý tin nhắn gửi tới:


package tranduythanh.com;

import tranduythanh.com.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.telephony.SmsMessage;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
 BroadcastReceiver receiver=null;
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 //tạo bộ lọc để lắng nghe tin nhắn gửi tới
 IntentFilter filter=new IntentFilter
 ("android.provider.Telephony.SMS_RECEIVED");
 //tạo bộ lắng nghe
 receiver=new BroadcastReceiver() {
 //hàm này sẽ tự động được kích hoạt khi có tin nhắn gửi tới
 public void onReceive(Context arg0, Intent arg1) {
 //Tui tách ra hàm riêng để xử lý
 //chú ý là dữ liệu trong tin nhắn được lưu trữ trong arg1
 processReceive(arg0, arg1);
 }
 };
 //đăng ký bộ lắng nghe vào hệ thống
 registerReceiver(receiver, filter);
 }
 protected void onDestroy() {
 super.onDestroy();
 //hủy bỏ đăng ký khi tắt ứng dụng
 unregisterReceiver(receiver);
 }
 public void processReceive(Context context, Intent intent)
 {
 Toast.makeText(context, "Hello .. có tin nhắn tới đó", Toast.LENGTH_LONG).show();
 TextView lbl=(TextView) findViewById(R.id.textView1);
 //pdus để lấy gói tin nhắn
 String sms_extra="pdus";
 Bundle bundle=intent.getExtras();
 //bundle trả về tập các tin nhắn gửi về cùng lúc
 Object []objArr= (Object[]) bundle.get(sms_extra);
 String sms="";
 //duyệt vòng lặp để đọc từng tin nhắn
 for(int i=0;i<objArr.length;i++)
 {
 //lệnh chuyển đổi về tin nhắn createFromPdu
 SmsMessage smsMsg=SmsMessage.
 createFromPdu((byte[]) objArr[i]);
 //lấy nội dung tin nhắn
 String body=smsMsg.getMessageBody();
 //lấy số điện thoại tin nhắn
 String address=smsMsg.getDisplayOriginatingAddress();
 sms+=address+":\n"+body+"\n";
 }
 //hiển thị lên giao diện
 lbl.setText(sms);
 }
}

broadcast4

– Bạn mở DDMS hoặc mở thêm 1 máy ảo nữa (xem bài tập số 2) để gửi tin nhắn vào đây. Bạn cũng có thể cài phần mềm vào Máy thật để Test, bạn sẽ có kể quả như trên.

– Bạn chú ý là thông số của Tin nhắn rất nhiều, bạn tìm hiểu thêm trên mạng, ở đây Tui chỉ lấy nội dung và số điện thoại ra mà thôi.

– Bạn có thể tải coding mẫu ở đây: http://www.mediafire.com/download/ri8kb7fec3my7x9/LearnBroadCastReceiver_sms_code.rar

– Tui tính viết phần mềm xử lý tin nhắn rác ở đây nhưng vì thấy dài quá nên Tui tách ra làm bài mới để các bạn tiện theo dõi.

– Chúc các bạn thành công.

Chia sẻ lên:

Like this:

Like

Loading…