Android: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設定只能輸入什麼東西,比如
除了簡訊到來廣播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)這兩個系統服務所監視。當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()方法。