Android体系课--四大组件-广播

434 阅读4分钟

🔥 Hi,我是小余。

本文已收录到 GitHub · Androider-Planet 中。这里有 Android 进阶成长知识体系,关注公众号 [小余的自习室] ,在成功的路上不迷路!

BroadcastReceiver使用方式

注册方式:静态注册动态注册

  • 1.1:静态注册:
伪代码:
		1.创建一个BroadcastReceiver
		class TestReceiver extends BroadcastReceiver{
			field String userAction = "myaction";
			method onReceive(intent){
				if(userAction.equals(intent.getAction)){
					doSomething();
				}
			}
		}
		2.在manfest中注册
		<Receiver
			name = "TestReceiver">
			<intenFilter
				action = "myaction"
			/>
		>

1.2: 动态注册

伪代码:
		1.创建一个BroadcastReceiver
		class TestReceiver extends BroadcastReceiver{
			field String userAction = "myaction";
			method onReceive(intent){
				if(userAction.equals(intent.getAction)){
					doSomething();
				}
			}
		}
		2.在Activity中:
		rigister():
			IntentFilter filter  =  new IntentFilter();
			filter.addAction(myaction);
			registerReceiver(TestReceiver,filter);
		send():
			intent.setAction();设置action
			intent.putExtras();设置传输的数据
			sendBroadcast(intent); 发送广播

动态注册的过程说明:

1.广播接收者通过binder机制在AMS注册(注册)

2.广播发送者通过binder机制像AMS发送广播(发送)

3.AMS在注册的广播列表中寻找对应的广播接收者,寻找依据:IntentFilter和permission(寻找)

4.AMS将广播发送到合适的广播接收者对应的消息循环列表中(放入)

5.广播接收者通过消息循环,回调onReceive方法(处理)

广播原理图.png

广播分类

(1)Normalbroadcasts:默认广播
(2)orderedbroadcasts:有序广播
  • 1.默认广播

    发送一个默认广播使用Context.sendBroadcast()方法, 普通广播对于多个接收者来说是完全异步的, 通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。 对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作

  • 2.有序广播

    2.1: 发送一个有序广播使用Context.sendorderedBroadcast()方法, 有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里, 优先级高的接收者有能力终止这个广播。

    2.2: 通过设置IntentFilter中的android:priority属性,可以设置广播接受者的优先级 优先级越高最先接收到广播

    2.3: 使用setResultExtras方法将一个Bundle对象设置为结果集对象,传递到下一个接收者那里, 这样优先级低的接收者可以用getResuttExtras获取到最新的经过处理的信息集合

    2.4: 使用sendorderedBroadcast方法发送有序广播时,需要一个权限参数,接收者在manfest中声明

如果为null则表示不要求接收者声明指定的权限, 如果不为null则表示接收者若要接收此广播,需声明指定权限。 这样做是从安全角度考虑的,

例如系统的短信就是有序广播的形式,一个应用可能是具有拦截垃圾短信的功能,当短信到来时它可以先接受到短信广播,必要时终止广播传递,这样的软件就必须声明接收短信的权限

3.广播测试

3.1:使用普通无序广播,动态广播优先级比静态广播高,静态广播根据优先级调用
	在`8.0`以后屏蔽了隐式广播发送,如果需要使用要在发送广播时加上包名即可
3.2:使用有序广播时,广播按优先级有序发送
  • 总结:静态广播和动态广播的区别:

    1.静态广播常驻型广播,应用退出后如果有其他应用发送了符合该广播条件也会自动运行.

    2.动态广播随注册的Activity或其他组件的生命周期组件生命周期结束,广播生命周期也结束.

    两种发送方式的区别

    1.无序发送:

      不同类型的广播:无视优先级,动态优先于静态
      同类型的广播  : 优先级高先接收到,优先级相等,根据注册的顺序执行
    

    2.有序广播:

      不同类型的广播:根据优先级接收,优先级相等先执行动态广播
      同类型的广播:  根据优先级接收,优先级相等根据注册的先后顺序执行
    

    发送和接收权限声明:

      1.发送者需要接收者有权限:
      	1.1:sendOrderedBroadcast(intent, "com.android.permission.yourdiyname");
      	1.2:发送者创建权限:<permission android:name="com.android.permission.yourdiyname" />
      	1.3:接收者声明权限:<uses-permission android:name="com.android.permission.yourdiyname" />
      2.接收者需要发送者有权限:
      	1.1:接收者创建权限:
      		<permission android:name="com.android.permission.yourdiyname" />
      		<receiver android:name=".YourDiyReceiver" 
      			android:permission="com.android.permission.yourdiyname"> 
      			<intent-filter>
      				 <action android:name="com.android.YOUR_DIY_ACTION" /> 
      			</intent-filter>
      		</receiver>
      	1.2:发送者声明权限:
      		<uses-permission android:name="com.android.permission.yourdiyname" />
      	
    

注意:动态注册的广播一定要在组件退出的时候,解除注册信息,防止出现OOM