標籤:
轉載請註明出處: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廣播組件實踐——簡訊黑名單