Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android之BroadcastReceiver

Android之BroadcastReceiver

編輯:關於Android編程

簡介:

BroadcastReceiver本質上就是一種全局的監聽器,用於監聽系統全局的廣播消息,因此它可以非常方便地實現系統中不同組件之間的通信。

 

特點:

1.BroadcastReceiver用於接收程序所發出的Broadcast Intent,與應用程序啟動Activity、Service相同;

2.當應用程序發出一個Broadcast Intent之後,所有匹配該Intent的BroadcastReceiver都有可能被啟動;

 

用法:

網上流行的一張圖片可以很好的感受到broadcastreceiver的主要用法:

\

 

本次我們通過一個小的示例來一起學習BroadcastReceiver:

建立三個廣播類,前兩個在manifest裡面注冊,稱為靜態注冊,最後一個沒有在manifest裡面注冊而在代碼中注冊,稱為動態注冊,發送廣播的時候有顯示發送和隱式發送兩種區別。

首先我們來看一下三個廣播接收器類的定義以及manifest裡面的片段內容如下:

 

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver01 extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		
		String msg = intent.getExtras().getString(data);
		
		Toast.makeText(context, MyReceiver01收到消息: + msg, Toast.LENGTH_SHORT).show();
		
	}

}

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver02 extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String msg = intent.getExtras().getString(data);

		Toast.makeText(context, MyReceiver02收到消息: + msg, Toast.LENGTH_SHORT)
				.show();
	}

}

public class MyReceiver03 extends BroadcastReceiver {

	public final static String INTENT_ACTION_MYRECEIVER03 = com.bear.broadcastreceiver.intent.action.receiver03;

	@Override
	public void onReceive(Context context, Intent intent) {
		String msg = intent.getExtras().getString(data);

		Toast.makeText(context, MyReceiver03收到消息: + msg, Toast.LENGTH_SHORT)
				.show();
		
//		abortBroadcast(); 取消廣播,後續receiver將無法接收到消息
	}

}

 

主界面共有5個按鈕用來測試,主界面類的定義如下:

 

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

public class MainActivity extends Activity implements OnClickListener{

	private IntentFilter intentFilter;
	private MyReceiver03 receiver;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		setupViews();
		
		intentFilter = new IntentFilter(MyReceiver03.INTENT_ACTION_MYRECEIVER03);
		receiver = new MyReceiver03();
	}
	
	@Override
	public void onClick(View v) {
		
		
		switch (v.getId()) {
		case R.id.button1:
			//顯式發送廣播
			Intent intent = new Intent(MainActivity.this, MyReceiver01.class);
			intent.putExtra(data, bear);
			sendBroadcast(intent);
			break;
		case R.id.button2:
			//隱式發送廣播
			Intent intent02 = new Intent(com.bear.broadcastreceiver.intent.action.receiver02);
			intent02.putExtra(data, bear02);
			sendBroadcast(intent02);
			break;
		case R.id.button3:
			//動態注冊廣播
			registerReceiver(receiver, intentFilter);
			break;
		case R.id.button4:
			Intent intent03 = new Intent(MyReceiver03.INTENT_ACTION_MYRECEIVER03);
			intent03.putExtra(data, bear03);
			sendBroadcast(intent03);
//			sendOrderedBroadcast(intent03, receiverPermission); 按優先級發送廣播
			break;
		case R.id.button5:
			//注銷廣播
			unregisterReceiver(receiver);
			break;

		default:
			break;
		}
		
	}
	
	private void setupViews(){
		findViewById(R.id.button1).setOnClickListener(this);
		findViewById(R.id.button2).setOnClickListener(this);
		findViewById(R.id.button3).setOnClickListener(this);
		findViewById(R.id.button4).setOnClickListener(this);
		findViewById(R.id.button5).setOnClickListener(this);
		
	}

	
}

 

 

總結:

1. 每次系統廣播(Broadcast)事件發生後,系統就會創建對應的BroadcastReceiver實例,並自動觸發它的onReceive()方法,onReceive()方法執行完後,BroadcastReceiver的實例就會被銷毀;

 

2.如果BroadcastReceiver的onReceive()方法不能在10秒內執行完成,Android會認為該程序無響應。所以不要在廣播接收者的onReceive()方法裡執行一些耗時的操作,否則會彈出ANR(Application No Response)的對話框;

 

3.如果確實需要根據廣播來完成一項比較耗時的操作,則可以考慮通過Intent啟動一個Service來完成該操作。不應考慮使用新線程去完成耗時的操作,因為BroadcastReceiver本身的生命周期極短,可能出現的情況是子線程可能還沒有結束,BroadcastReceiver就已經退出了;

 

最後在這裡附上整個demo工程源碼:

Android BroadcastReceiver
 

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