使用廣播接收者竊聽短信

如果你想竊聽別人接收到的短信,達到你不可告人的目的,那麼本節內容可以實現你的需求。

當系統收到短信時,會發出一個action名稱爲android.provider.Telephony.SMS_RECEIVED的廣播Intent,該Intent存放了接收到的短信內容,使用名稱“pdus”即可從Intent中獲取短信內容。

public class IncomingSMSReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@Override public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECEIVED)) {
SmsManager sms = SmsManager.getDefault();
Bundle bundle = intent.getExtras();
if (bundle != null) {

Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
for (SmsMessage message : messages){
String msg = message.getMessageBody();
String to = message.getOriginatingAddress();
sms.sendTextMessage(to, null, msg, null, null);
}}}}}

 在AndroidManifest.xml文件中的<application>節點裏對接收到短信的廣播Intent進行訂閱:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>
在AndroidManifest.xml文件中添加以下權限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信權限 -->
<uses-permission android:name="android.permission.SEND_SMS"/><!-- 發送短信權限 -->

除了短信到來廣播Intent,Android還有很多廣播Intent,如:開機啓動、電池電量變化、時間已經改變等廣播Intent。
接收電池電量變化廣播Intent ,在AndroidManifest.xml文件中的<application>節點裏訂閱此Intent:

<receiver android:name=".IncomingSMSReceiver">
    <intent-filter>
         <action android:name="android.intent.action.BATTERY_CHANGED"/>
    </intent-filter>
</receiver>

接收開機啓動廣播Intent,在AndroidManifest.xml文件中的<application>節點裏訂閱此Intent:
<receiver android:name=".IncomingSMSReceiver">
    <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

並且要進行權限聲明:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>


在Android中,程序的響應(Responsive)被活動管理器(Activity Manager)和窗口管理器(Window Manager)這兩個系統服務所監視。當BroadcastReceiver在10秒內沒有執行完畢,Android會認爲該程序無響應。所以在BroadcastReceiver裏不能做一些比較耗時的操作,否側會彈出ANR(Application No Response)的對話框。

如果需要完成一項比較耗時的工作,應該通過發送Intent給Service,由Service來完成。而不是使用子線程的方法來解決,因爲BroadcastReceiver的生命週期很短(在onReceive() 執行後BroadcastReceiver 的實例就會被銷燬),子線程可能還沒有結束它就先結束了。當然如果BroadcastReceiver結束了,它的宿主進程還在運行,子線程還會繼續執行。但宿主進程此時很容易在系統需要內存時被優先殺死,因爲它屬於空進程(沒有任何活動組件的進程)。

public class IncomingSMSReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
            //發送Intent啓動服務,由服務來完成比較耗時的操作
            Intent service = new Intent(context, XxxService.class);
            context.startService(service);
}
}

每次廣播消息到來時都會創建BroadcastReceiver實例並執行onReceive() 方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章