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

[polldaddy poll=9764234]

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:

[code language=”xml”]

<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>

[/code]

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:

[code language=”xml”]

<?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>

[/code]

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:

[code language=”java”]

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);
}
}

[/code]

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.

15 thoughts on “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”

  1. thanks thầy nhiều 🙂 … em cũng từng làm về bắt cuộc gọi và tin nhắn với cái này. Nhưng em cũng chưa hiểu lắm 🙂 … hống bài thầy down về ngâm lại 🙂 …

  2. Thưa thầy!
    Làm sao sử dụng Broadcast Receiver để truyền dữ liệu giữa 2 apps?
    Nhập chuỗi ở app 1 rồi phát đi 1 sự kiện tự định nghĩa kèm theo chuỗi đó. Sau đó apps 2 nhận sự kiện đó và hiển thị Toast với chuỗi đó thì làm thế nào ạ?
    Mong thầy hướng dẫn cụ thể cho em. Em xin cảm ơn!

  3. Em có vấn đề nầy mong thầy giúp đỡ. khi e viết ứng dụng gửi tin nhăn nếu gửi ít thi không sao, nhưng nếu trong 1 phút gửi nhiều tn nhắn thì điện thoại cảnh báo “có ứng dung đang gửi rất nhiều tin nhắn bạn có cho phép không?” chọn không và cho phép e ko muôn điều này xảy ra, mong thầy giúp đỡ. e xin cam ơn.

  4. Thầy ơi ! sao e lấy source của thầy bỏ vào eclip nó chạy lên giao diện mà khi em nhắn tin (bằng điện thoại thật) thì nó không nhận đc tin nhắn và ghi lên textview vậy thầy

Leave a Reply