BroadCastReceiver(廣播接收者的靜態註冊)簡單使用例子

靜態註冊方式的特色:只要安裝了靜態註冊的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);  }  }  }  

相關文章
相關標籤/搜索