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.

15 responses

  1. Thật vui mừng vì những chuỗi bài tiếp theo của thầy mấy hôm nay, thật cám ơn thầy nhiều lắm :Đ

  2. Cám ơn tác giả bài viết rất nhiều, mong rằng có thêm nhiều bài hay nữa

  3. 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 🙂 …

  4. đọc bài của thầy rất dễ hiểu,k có mấy chỗ dườm dà khác =))

  5. […] Học Phần Bằng SMS cho các Trường Đại Học) Tui đã cung cấp hàng loạt các bài 40, 41, 44, 45, 46, 47 các bạn cần đọc kỹ lại những bài tập này trước khi bắt […]

  6. 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!

  7. […] Bài 40: Tìm hiểu Broadcast Receiver, ứng dụng viết phần mềm xử lý tin nhắn rácIn “7. Broadcast Receiver” […]

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

  9. Dương Thủy | Reply

    thanks Author so much! I hope you have a lot of post more.

  10. […] Phần Bằng SMS cho các Trường Đại Học) Tui đã cung cấp hàng loạt các bài 40, 41, 44, 45, 46, 47 các bạn cần đọc kỹ lại những bài tập này trước khi […]

  11. Cám ơn thầy nhiều lắm, mong thầy sẽ có thêm nhiều bài viết hay như vậy nữa để chúng em học tập.

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

  13. Bài viết của thầy rất hay,rất dễ hiểu ạ

  14. Bài của thấy rất bổ ít mong thầy sẽ có nhiều bài hướng dẫn hơn.

  15. Asking questions are genuinely good thing if you are not understanding something totally, except this article provides nice understanding even.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s