1. 程式人生 > >Android:BroadcastReceiver:採用廣播接收者攔截外拔電話、傳送廣播、其他常用廣播、特性

Android:BroadcastReceiver:採用廣播接收者攔截外拔電話、傳送廣播、其他常用廣播、特性

public class PhoneBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String number = getResultData();
        if("5556".equals(number)){
            setResultData(null);//清除電話號碼,不能撥打電話
        }else{
            number = "12593"+ number;
            setResultData(number);//修改電話
        }
    }

}


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cn.itcast.smslistener"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <receiver android:name=".SMSBroadcastReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".PhoneBroadcastReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>


            </intent-filter>
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="8" />

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

</manifest>

可以指定明確的接受者,這樣終止這個命令就不好使了

EditText有一個屬性:android:inputType設定只能輸入什麼東西,比如

phoneemail

除了簡訊到來廣播Intent,Android還有很多廣播Intent,如:開機啟動、電池電量變化、時間已經改變等廣播Intent

l 接收電池電量變化廣播Intent ,在AndroidManifest.xml檔案中的<application>節點裡訂閱此Intent:

<receiver android:name=".IncomingSMSReceiver">

<intent-filter>

<action android:name="android.intent.action.BATTERY_CHANGED"/>

</intent-filter>

</receiver>

l 接收開機啟動廣播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)被活動管理器(ActivityManager)和視窗管理器(Window Manager)這兩個系統服務所監視。當BroadcastReceiver10秒內沒有執行完畢,Android會認為該程式無響應。所以在BroadcastReceiver裡不能做一些比較耗時的操作,否側會彈出ANRApplication No Response)的對話方塊。如果需要完成一項比較耗時的工作,應該通過傳送IntentService,由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()方法。