Android學習筆記之廣播(2)

fmms 12年前發布 | 21K 次閱讀 Android Android開發 移動開發

BroadCastReceiver用于監聽被廣播的事件(Itent)

為了達到這個目的,我們就必須進行BroadCastReceiver注冊,注冊共兩種方法:

<1>在應用程序代碼中進行注冊

這種注冊方法比較靈活,我們想什么時候注冊就什么時候注冊,什么時候關閉就什么時候關閉。

注冊BroadCastReceiver:

registerReeiver(receiver,filter)

取消BroadCastReceiver:

unregisterReeiver(receiver)

如果一個BroadCastReciver用于更新UI,通常會使用這種方法進行注冊,Activity啟動時就注冊BroadCastReciver,Activity不可見時就取消注冊。

步驟:1 生成一個BroadCastReceiver對象

           2 生成一個Intentfilter對象

           3 為Intentfilter對象添加一個Action

class RegisterReceiverListener implements OnClickListener{

        public void onClick(View v) {
            //生成一個BroiadcastReceiver對象
            smsReceiver = new SMSReceiver();
            //生成一個IntentFilter對象
            IntentFilter filter = new IntentFilter();
            //為IntentFilter添加一個Action
            filter.addAction(SMS_ACTION);
            //將BroadcastReceiver對象注冊到系統當中
            TestBC2Activity.this.registerReceiver(smsReceiver, filter);
        }

    }

    class UnRegisterReceiverListener implements OnClickListener{

        public void onClick(View v) {
            //解除BroadcastReceiver對象的注冊
            TestBC2Activity.this.unregisterReceiver(smsReceiver);
        }

    }
SMSReceiver.java  
package mars.testbc2;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

public class SMSReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        System.out.println("receive message");

        //接受Intent對象當中的數據
        Bundle bundle = intent.getExtras();
        //在Bundle對象當中有一個屬性名為pdus,這個屬性的值是一個Object數組
        Object[] myOBJpdus = (Object[]) bundle.get("pdus"); 
        //創建一個SmsMessage類型的數組
        SmsMessage[] messages = new SmsMessage[myOBJpdus.length];  
        System.out.println(messages.length);
        for (int i = 0; i<myOBJpdus.length; i++) 
        {  
          //使用Object數組當中的對象創建SmsMessage對象
          messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);  
          //調用SmsMessage對象的getDisppalyMessageBody()方法,就可以得到消息的內容
          System.out.println(messages[i].getDisplayMessageBody());
        }
        try {
            Thread.sleep(30 * 1000);
            System.out.println("-------------------------------");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
<2>在AndroidManifest.xml當中進行注冊
<receiver android:name=".TestReceiver">
            <intent-filter>
                <action android:name="android.intent.action.EDIT" />
            </intent-filter>
        </receiver>

用這種方法注冊的有如下一種特點:

用這種方法注冊的應用程序的及時關閉了,BroadCastReceiver依然會接收到廣播出的一個對象,也就是說無論應用程序關與開,都處于一種活動狀態中,都接受到廣播事件。
有的應用程序就需要這種特點。

例如,開發一種應用程序,來檢測手機的耗電量。

我們不能總要求應用程序打開,我們希望應用程序及時關閉了,也能照樣檢測手機的耗電量。

但是,我們如果開發的應用程序來更新手機控件,采用這種方式就不太合適了。只有我們看到Activity,我們更新控件采用意義。

如果沒看到Activity還照樣更新,除了耗電,消耗內存外,一點好處也沒有。所以就需要第一種方法。

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!