靜態註冊方式的特色:只要安裝了靜態註冊的BroadCastReceiver應用,無論退不退出應用
廣播接收者都在監聽
//簡單實現監聽電話狀態例子
靜態註冊方式的特色:只要安裝了靜態註冊的BroadCastReceiver應用,無論退不退出應用
廣播接收者都在監聽
效果圖示例:
java
結果:android
一、靜態註冊在配置清單裏實現數組
代碼app
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiver"
android:versionCode="1"
android:versionName="1.0" >ide
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<!--監聽電話狀態須要添加的權限-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>spa
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />日誌
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 電話狀態監聽靜態註冊 receiver的 name:是.包名 + 類名(這裏在同一個包下直接.類名)
該類繼承BroadCastReceiver(廣播接收者)類 也就是要註冊的BroadCastReceiver(廣播接收者)-->
<receiver android:name=".MyPhoneStateReceiver">
<!--intent-filter(意圖過濾器)-->
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
</application>xml
</manifest>繼承
===================utf-8
二、MyPhoneStateReceiver類
代碼
public class MyPhoneStateReceiver extends BroadcastReceiver {
/**
* onReceive方法是繼承BroadcastReceiver類必須重寫的
*/
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.i("data", "電話狀態改變了");
Bundle bundle = intent.getExtras();
//獲取來電的號碼
String number = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
//獲取管理器
TelephonyManager manager = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
//經過管理器獲取電話狀態
int state = manager.getCallState();
switch(state){
case TelephonyManager.CALL_STATE_IDLE://掛斷
Log.i("data", "電話掛斷了");
break;
case TelephonyManager.CALL_STATE_OFFHOOK://接聽
Log.i("data", "電話接聽");
break;
case TelephonyManager.CALL_STATE_RINGING://鈴響
Log.i("data", number + "來電");
break;
}
}
}
===================================================
BroadCastReceiver(廣播接收者的靜態註冊)簡單使用例子2
靜態註冊方式的特色:只要安裝了靜態註冊的BroadCastReceiver應用,無論退不退出應用
廣播接收者都在監聽
//簡單實現監聽短信消息例子
一、靜態註冊在配置清單裏實現
代碼
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiver"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<!--監聽電話狀態須要添加的權限-->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 短信監聽靜態註冊 receiver的 name:是.包名 + 類名(這裏在同一個包下直接.類名)
該類繼承BroadCastReceiver(廣播接收者)類 也就是要註冊的BroadCastReceiver(廣播接收者)-->
<receiver android:name=".MySmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
</manifest>
=====================
二、MySmsReceiver.java類
代碼
public class MySmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle bundle = intent.getExtras(); // Protocol Data Unit 協議數據單元 Object[] pdus = (Object[]) bundle.get("pdus");//獲取發送過來的短信(裏面裝有發送過來全部短信數據) //進一步封裝發送過來的短信數據的數組 SmsMessage[] smsMessage = new SmsMessage[pdus.length]; for(int i = 0;i<smsMessage.length;i++){ //進一步把短信數據封裝到數組SmsMessage //爲了方便操做發送過來的短信數據(用該數組裏的方法來操做) smsMessage[i] = SmsMessage.createFromPdu((byte[])pdus[i]); } //獲取發送短信的電話號碼 //從0位置獲取就行 要是短信內容夠長其餘位置獲取也行 //可是爲了保證數組不越界問題 從0位置獲取比較穩妥 String smsNumber = smsMessage[0].getDisplayOriginatingAddress(); //獲取發送過來的短信內容(把短信內容拼接起來) StringBuffer sb = new StringBuffer(); for(int i = 0;i<smsMessage.length;i++){ sb.append(smsMessage[i].getDisplayMessageBody()); } String content = sb.toString();//短信內容 Log.i("data", smsNumber + "::" + content);//在日誌貓裏輸出 //把短信信息發送給其餘接收者 if("110".equals(smsNumber)){ abortBroadcast();//中斷廣播 //從新把攔截的廣播發送給其餘接收者 SmsManager smsManager = SmsManager.getDefault();//獲取管理器 //使用管理器裏的sendTextMessage方法把攔截的廣播發送給其餘接收者 /** * sendTextMessage(String destinationAddress, * String scAddress, String text, PendingIntent sentIntent, * PendingIntent deliveryIntent) * //第一個參數:要發送給其餘接收者的地址 * //第三個參數:要發送的內容 */ smsManager.sendTextMessage("5556", null, smsNumber + "::" + content, null, null); } } }