Android廣播基礎詳解-看完對廣播有一個深入的理解

一、 廣播註冊

  • 動態註冊 代碼中註冊。
  • 靜態註冊 AndroidManifest.XML文件中註冊。

​ 區別:

​ 動態註冊在活動中添加一個內部類繼承自BroadcaseReceiver。

​ 靜態註冊新建一個類繼承自BroadcastReceiver並且在AndroidManifest.XML文件中添加標籤。

1.1 動態註冊

動態監聽網絡變化

public class MainActivity extends AppCompatActivity{
	private TestReceiver mTestReceiver;
	
	@Override
	protected void onCreate(Bundle savedInstaceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//創建一個過濾器來獲取需要監聽的內容
		IntentFilter filter = new IntentFilter();
		filter.addAction("");
		//action不一定非要系統定義的aciton,也可以自己創建
		
		//在onCreate內部有了一個內部類必須通過new 才能獲取,而由於TestReceiver繼承自BroadcastReceiver,父類有一個默認的無參構造來爲其創建
		mTestReceiver = new TestReceiver();
		regiseter(mTestReceiver, filter);
	}
	
	@Override
	protected void onDestroy(){
		unregister(mTestReceiver);
		super.onDestroy();
	}
	
	//監聽網絡變化
	class TestReceiver extends BroadCastReceiver{
	
		@Override
		public void onReceived(Context context, Intent intent){		
			//網絡變化需要由系統服務監聽,因此需要有一個系統服務類ConnectivityManager,專門用於管理網絡連接
			//通過網絡變化管理器來獲取網絡信息,網絡變化的監聽需要獲取權限
			//在對網絡信息進行處理
			ConnectivityManager connectivity = getSystemService(Context.CONNECTIVITY_SERVICE);
			Network networkInfo = connectivityManager.getActiveNetwork();
            	if (networkInfo != null) {
					//
            	} else {
					//
            	}
		}
	}
}

1.2靜態註冊

​ 與動態註冊的區別:可以發現在動態監聽過程中,

​ 1、需要通過IntentFilter 來獲取需要監聽的內容,在通過register註冊廣播,

​ 2、在Acitivity內部創建內部類從而實現動態監聽。

而靜態註冊,則是將這個過程轉換:

​ IntentFilter放在於AndroidManifest.XML文件中的標籤中獲取,爲了安全起見,一般exported是設爲false。

<receiver
	android:name=".TestReceiver"
	//enabled表示是否啓用這個這個廣播接收器
	android:enabled="true"
	//exported表示是否允許這個廣播接收器接受本程序之外的廣播
	android:exported="true">
	<Intent-filter>
		<action android:name=""/>
	</Intent-filter>
</reveiver>

​ 創建內部類的過程則是新建一個java類並繼承BroadcastReciver,並重寫onReceive從而實現靜態註冊。

通過AS快捷方式創建一個BroadcastReceive。

public class TestReceiver extends BroadCastReceiver{
	//監聽網絡變化
	@Override
	public void onReceived(Context context, Intent intent){		
		//網絡變化需要由系統服務監聽,因此需要有一個系統服務類ConnectivityManager,專門用於管理網絡連接
		//通過網絡變化管理器來獲取網絡信息,網絡變化的監聽需要獲取權限
		//在對網絡信息進行處理
		ConnectivityManager connectivity = getSystemService(Context.CONNECTIVITY_SERVICE);
		Network networkInfo = connectivityManager.getActiveNetwork();
           	if (networkInfo != null) {
				//
           	} else {
				//
           	}
	}
}

在你需要調用廣播的活動中,你需要

public class MainActivity extends AppCompatActivity{
	private Button mBtnSendBroadcast;
	
	@Override
	protected void onCreate(Bundle savedInstaceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//若需要手動點擊發送廣播
		mBtnSendBroadcast = findViewById(R.id.button);
		mBtnSendBroadcast.setOnclickListener(new View.OnclickListener){
			@Override
			public void onClick(View v){
				Intent intent = new Intent("");
				sendBroadcast(intent);
			}
		}
	}
}

並且使用靜態註冊還可以實現開機啓動,監聽系統開機廣播也是需要權限android.permission.RECEIVE_BOOT_COMPLETED。

注意:

不要在onReceive()方法中添加過多的邏輯或者任何耗時操作,因爲廣播接收器是不允許開啓線程。廣播接收器更多的是扮演一種 打開程序其他組件的角色,比如創建以條狀態欄通知,或者啓動一個服務等。

二、 自定義廣播

自定義廣播其實在前文已經有講過了,在動態註冊是我們通常會通過IntentFilter 來獲取我們需要的action,從而實現動態註冊,事實上,actionn並不一定非要是系統定義的action(使用系統定義的則是相應行爲發生改變時,獲取系統的行爲並監聽),當然,我們也可以自定義(如com.test.receiver),除了這個改變之外,其實自定義廣播和標準廣播的動態註冊過程無任何差異。

三、有序廣播

有序廣播的發送則是在自定義廣播的基礎上發送方式發生了改變,即sendBroadcast(intent)改爲了sendOrderedBroadcast(intent,null),其中這個函數中第二個參數則是於權限相關的字符串。並且設置了priority優先級。

<receiver
	android:name=".TestReceiver"
	android:enabled="true"
	android:exported="true">
	<Intent-filter android:prioirty="100">
		<action android:name=""/>
	</Intent-filter>
</reveiver>

因此在發送廣播時,由於接收了同一個action,但是由於設置了不同的優先級,所以會出現有序的狀態。從而得到了有序廣播。

四、本地廣播

​ 前面發送的均是系統全局廣播,即發出的廣播可以背其他任何應用程序接收到,並且可以接收來自於其他任何應用的廣播,這樣很容易引起安全問題,如當發送一些攜帶關鍵性數據的廣播可能會被其他應用程序截取,或者其他應用程序向我們發送垃圾廣播。

​ 而本地廣播值能夠在應用程序內部進行傳遞,並且廣播只能接收來自本應用程序發出的廣播,這樣就解決了安全問題。

​ 本地廣播使用了一個LocalBroadcastManager來對廣播進行管理,並提供了廣播註冊與發送的方法。

public class MainActivity extends AppCompatActivity{
	private TestReceiver mTestReceiver;
	private TestReceiver mTestReceiver;
	private LocalBroadcastManager localBroadcastManager;
	
	@Override
	protected void onCreate(Bundle savedInstaceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		mBtnSendBroadcast = findViewById(R.id.button);
		mTestReceiver = new TestReceiver();
		//LocalBroadcastManager的getInstance獲取一個實例
		localBroadcastManager = LocalBroadcastManager.getInstance(this);
		mBtnSendBroadcast.setOnclickListener(new View.OnclickListener){
			@Override
			public void onClick(View v){
				Intent intent = new Intent("");
				localBroadcastManager.sendBroadcast(intent);
			}
		}
		IntentFilter filter = new IntentFilter();
		filter.addAction("");
		mTestReceiver = new TestReceiver();
		localBroadcastManager.regiseter(mTestReceiver, filter);
	}
	
	@Override
	protected void onDestroy(){
		localBroadcastManager.unregister(mTestReceiver);
		super.onDestroy();
	}
	
	class TestReceiver extends BroadCastReceiver{
		@Override
		public void onReceived(Context context, Intent intent){		

		}
	}
}

廣播的內容大致分爲以上幾種,在實際開發中,通常動態註冊使用的比較多,通常利用廣播的動態註冊來動態監聽某一個狀態的變化,因此靈活使用動態監聽至關重要。

發佈了2 篇原創文章 · 獲贊 2 · 訪問量 3921
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章