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。


	
		
	

​ 创建内部类的过程则是新建一个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优先级。


	
		
	

因此在发送广播时,由于接收了同一个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){		

		}
	}
}

广播的内容大致分为以上几种,在实际开发中,通常动态注册使用的比较多,通常利用广播的动态注册来动态监听某一个状态的变化,因此灵活使用动态监听至关重要。

你可能感兴趣的:(android知识总结,android)