Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android自學筆記-17-廣播接收者(BroadcastReceiver)

Android自學筆記-17-廣播接收者(BroadcastReceiver)

編輯:關於Android編程

廣播接收者是Android的四大組件之一,對於這個的定義也是很貼切,在Android系統中,當系統發生了一些狀態的改變,系統會向所有的程序廣播這個狀態的變化。但是這些廣播不是所有的我們都接收的,我們只會接收我們關注的廣播,這裡可以類比廣播台,許多個廣播台都在發送著不同的廣播,我們可以用收音機根據調頻接收我們想要聽的廣播,這裡廣播台發送的不同的廣播,就相當於Android中發送的不同廣播,這裡的收音機就相當於我們的程序,我們通過設置我們的程序,就能接收到對應的廣播。

對於廣播接收者,我們想要使用它需要按照如下步驟:

1 自定義一個類並且繼承BroadcastReceiver類,實現onReceive方法,這個方法會在接收到廣播的時候調用

1 在AndroidMainfest.xml注冊該BroadcastReceiver,並且配置相應的參數

下面定義一個廣播接收者用於接收短信到來的廣播,首先創建一個java類:

import java.text.SimpleDateFormat; 
import java.util.Date; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.SmsMessage; 
 
public class SmsReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
        Object[] pdus = (Object[]) intent.getExtras().get("pdus"); 
        for (Object pdu : pdus) { 
            //創建一個短信 
            SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu); 

            //獲取發送手機號 
            String address = sms.getOriginatingAddress(); 
             
            //獲取短信的內容 
            String body = sms.getMessageBody(); 

            //獲取短信的時間 
            String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(sms.getTimestampMillis())); 
            System.out.println(time); 
            System.out.println(address); 
            System.out.println(body); 
        } 
        //中斷手機接收操作 
        abortBroadcast(); 
    } 

} 

然後在AndroidMainfest.xml注冊該BroadcastReceiver,

  

             

                 

             

         
對於廣播分為兩種:有序廣播和無序廣播,

無序廣播所有的廣播接收者都可以接收到

有序廣播會按照接收者優先級的順序挨個的接收到,接收者可以使用abortBroadcast();方法隨時停止該廣播的繼續傳遞

既然有廣播的接收者,那麼一定也有廣播的發送者,在Android發送廣播也是需要使用Intent,首先使用Intent創建一個意圖,然後使用sendBroadcast(無序廣播)或者sendBroadcast(有序廣播)方法將廣播發送出去。

看下面例子代碼,創建了兩個廣播,並且按照兩種方式發送出去了。

package com.mxy;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    /**
     * 無序廣播所有的廣播接收者都可以接收到
     * 有序廣播會按照接收者優先級的順序挨個的接收到,接收者可以隨時停止該廣播的繼續傳遞
     * @param view
     */
    public void click(View view) {
    	Intent intent = new Intent();
    	intent.setAction("com.mxy.broadcastReceiver");
    	intent.putExtra("data", "測試數據");
    	this.sendBroadcast(intent);
    	
    	Intent intent1 = new Intent();
    	intent1.setAction("com.mxy.OrderedBroadcastReceiver");
    	intent1.putExtra("data", "測試數據");
    	this.sendOrderedBroadcast(intent1, null);
	}
    
}
下面看一下AndroidMainfest.xml中的相關配置:
 
            
                
            
        
        
        
            
                
            
        
        
            
                
            
        
由上面可以看出無序廣播由MyBroadcastReceiver接收,有序廣播由MyBroadcastReceiver1和MyBroadcastReceiver2接收,但是他們兩個的優先級不同,下面是這三個類的代碼:

MyBroadcastReceiver.java

package com.mxy;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String data = intent.getStringExtra("data");
		Log.i("mxy", "獲取到data=" + data );
	}

}

MyBroadcastReceiver1.java

package com.mxy;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyBroadcastReceiver1 extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String data = intent.getStringExtra("data");
		Log.i("mxy", "MyBroadcastRecevier1獲取到data=" + data );
		//停止廣播了
		abortBroadcast();

	}

}

MyBroadcastReceiver2.java

package com.mxy;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyBroadcastReceiver2 extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String data = intent.getStringExtra("data");
		Log.i("mxy", "MyBroadcastRecevier2獲取到data=" + data );

	}

}

對於有序廣播來說MyBroadcastReceiver2並不會接收到該廣播,因為MyBroadcastReceiver1的優先級比較高,所以廣播先呗MyBroadcastReceiver1接收到,並且MyBroadcastReceiver1在接收到後處理完調用了abortBroadcast方法,中斷了廣播的繼續傳播,所以優先級小MyBroadcastReceiver2並不能接收到該廣播。

例子代碼下載地址:http://download.csdn.net/detail/mengxiangyue/7278217

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved