Android廣播組件實踐——簡訊黑名單

來源:互聯網
上載者:User

標籤:

轉載請註明出處:http://blog.csdn.net/chengbao315/article/details/51011358

相關閱讀:

Android服務元件案例:http://blog.csdn.net/chengbao315/article/details/50997218


上回書我提到了想要編寫安卓四大組件案例的想法,那麼說到做到,這次我就來做一個Android廣播組件的案例。這次想要模仿手機360軟體的簡訊黑名單功能,可以實現號碼加入黑名單,後台運行程式,簡訊來到時進行攔截,並可以在軟體中查看資訊內容的準系統。比如這個手機360軟體的:


讀了郭神的《第一行代碼》,再加上之前幾篇部落格的總結,我對這個功能的實現胸有成竹,不過沒有思路的童鞋也不用急,請參考《第一行代碼》第5章、第8章內容。

下面來實現功能,在Eclipse中建立一個Android項目,開啟activity_main.xml檔案,編寫介面布局。這裡只簡單實現需求功能,所以布局起來比較簡單,只包含幾個TextView控制項、一個EditText控制項和一個Button控制項,設計代碼如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <LinearLayout        android:layout_width="match_parent"        android:layout_height="50dp"        android:orientation="horizontal" >        <TextView            android:id="@+id/textView1"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginLeft="10dp"            android:layout_marginTop="10dp"            android:text="@string/EnterNum" />        <EditText            android:id="@+id/editNumber"            android:layout_width="150dp"            android:layout_height="wrap_content"/>    </LinearLayout>    <Button        android:id="@+id/btnAddBlack"        android:layout_width="200dp"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:text="加入黑名單" />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="60dp" >        <TextView            android:id="@+id/senderText"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:padding="10dp"            android:layout_gravity="bottom"            android:text="黑名單號碼:" />        <TextView            android:id="@+id/sender"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="bottom" />    </LinearLayout>        <LinearLayout         android:layout_width="match_parent"        android:layout_height="match_parent">        <TextView            android:id="@+id/contentText"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:padding="10dp"            android:text="資訊內容:" />        <TextView            android:id="@+id/content"            android:layout_width="210dp"            android:layout_height="280dp" />    </LinearLayout></LinearLayout>

以上代碼實現的效果:


接下來實現接收資訊的功能。安卓手機在接收簡訊的時候,系統會發出一條值為android.provider.Telephony.SMS_RECEIVED的廣播,這條廣播裡攜帶著與簡訊相關的所有資料。通過對這條廣播的監聽,在接收到廣播時對資訊內容進行解析,根據發送號碼判斷決定是否截斷廣播,即可實現簡訊黑名單的功能。

開啟MainActivity.java 檔案,在onCreate()方法中添加動態註冊監聽簡訊廣播的代碼,同時擷取資訊號碼、資訊內容TextView和Button的執行個體,添加代碼如下:

public class MainActivity extends Activity implements OnClickListener {    private TextView sender;    private TextView content;    private IntentFilter receiveFilter;    private MessageReceiver messageReceiver;    private static String BlackNum = "";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sender = (TextView) findViewById(R.id.sender);        content = (TextView) findViewById(R.id.content);        Button btnAdd = (Button) findViewById(R.id.btnAddBlack);        btnAdd.setOnClickListener(this);        receiveFilter = new IntentFilter();        receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");        receiveFilter.setPriority(100);        messageReceiver = new MessageReceiver();        registerReceiver(messageReceiver, receiveFilter);    }    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(messageReceiver);    }
為了實現軟體先於手機內建資訊軟體收到資訊,通過調用 receiveFilter.setPriority(100);方法設定軟體的優先順序較高。接下來在MainActivity中建立MessageReceiver內部類,繼承BroadcastReceiver,實現接收廣播後的處理邏輯,代碼如下所示:

private class MessageReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.d("MessageReceiver", "Receive");Bundle bundle = intent.getExtras();Object[] pdus = (Object[]) bundle.get("pdus");SmsMessage[] message = new SmsMessage[pdus.length];for (int i = 0; i < message.length; i++) {message[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);}// 擷取手機號碼String Number = message[0].getOriginatingAddress();String fullMessage = "";for (SmsMessage m : message) {fullMessage += m.getMessageBody();// 擷取簡訊內容}Log.d("MessageReceiver[Number]", Number);Log.d("MessageReceiver[Message]", fullMessage);if (BlackNum.equals(Number)) {NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);Notification notification = new Notification(R.drawable.ic_launcher, "攔截黑名單資訊",System.currentTimeMillis());Intent notificationIntent = new Intent(context,MainActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);notification.setLatestEventInfo(context, "新資訊", "攔截黑名單資訊",pendingIntent);notification.defaults = Notification.DEFAULT_ALL;manager.notify(1, notification);sender.setText(Number);content.setText(fullMessage);abortBroadcast();}}}
在接收到廣播後,系統調用onReceive()方法,通過Bundle方式傳遞資訊資料,通過對Bundle的解析,將資訊內容儲存到一個SmsMessage數組中,進而完成資訊的接收。接下來對比來訊號碼與黑名單號碼是否相等,如果相等,給出一個通知(這裡不是需求的要求內容,以後再詳細講),在介面顯示資訊號碼和資訊內容,同時截斷廣播向手機的資訊軟體傳播。
最後別忘了在AndroidManifest.xml中的代碼中給程式聲明一個接收簡訊的許可權"android.permission.RECEIVE_SMS"(另一個許可權是手機通知的震動許可權),添加代碼如下:

    <uses-permission android:name="android.permission.RECEIVE_SMS"/>    <uses-permission android:name="android.permission.VIBRATE"/>
以上代碼實現了軟體接收資訊和攔截資訊的功能,但是設定黑名單的功能還沒有實現,繼續編輯MainActivity.java檔案,添加Button的監聽代碼,在代碼中擷取EditText的內容,儲存為黑名單號碼,添加代碼如下:
public class MainActivity extends Activity implements OnClickListener {......@Overridepublic void onClick(View view) {EditText text = (EditText) findViewById(R.id.editNumber);if (!text.getText().toString().isEmpty()) {BlackNum = text.getText().toString();Toast.makeText(this, "設定黑名單號碼為:" + BlackNum, Toast.LENGTH_LONG).show();Log.d("MainActivity[Number]", BlackNum);}}}
還有一個隱含的功能,就是後台運行,其實這段代碼完全可以不寫,通過按Home鍵代替,但是提到了還是實現以下吧。其實原理很簡單,就是捕捉Back點擊事件,然後設定為後台運行,在MainActivity中繼續添加代碼如下:
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {moveTaskToBack(true);return true;}return super.onKeyDown(keyCode, event);}
激動人心的時刻到了,最後的最後就是來進行測試了。在郭神的《第一行代碼》中,提供了DDMS模擬器的方法(可以參考8.2.1章節),但是我的電腦根本沒裝模擬器,又不想花資訊費,那怎麼辦?機智的我決定給10086發資訊吧,結果查了一下午的話費,估計10086也快瘋了。測試結果如下:

  


下載源碼,點擊這裡!

Android廣播組件實踐——簡訊黑名單

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.