什么是播送,简单点播送就是安卓体系本身宣布的声音,咱们能够经过安卓提供给咱们的一系列内容来接纳和宣布播送,以此来简单快捷地实现一些功能。
在实际开发中也常常用到,而是否熟悉使用,这成为面试官最常问的问题。
当面试官问你:
1.请问BroadcastReciver的静态注册与动态注册的区别?,你在开发中用过吗?
答:
其实播送分为两种基本类型:
在一个程序中,能够发送播送供当时程序的播送接纳器收到。首先咱们来看下两种办法的发送播送。 在Android体系中,主要有两种基本的播送类型: – 规范播送(Normal Broadcasts) – 有序播送(Ordered Broadcasts)
规范播送:
是一种彻底异步履行的播送,在播送宣布之后,所有的播送接纳器会在同一时刻接纳到这条播送,播送无法被中止。
发送播送的办法十分容易的,只需求实例化一个Intent目标,然后调用context的** sendBroadcast() **办法。这样就完成了播送的发送。
//intent中的参数为action
Intent intent=new Intent("com.example.dimple.BROADCAST_TEST");
sendBroadcast(intent);
有序播送:
是一种同步履行的播送,在播送宣布之后,优先级高的播送接纳器会先接纳到这条播送,并能够在优先级较低的播送接纳器之前终止发送这条播送。
//intent中的参数为action
Intent intent=new Intent("com.example.dimple.BROADCAST_TEST");
sendOrderBroadcast(intent,null);//第二个参数是与权限相关的字符串。
到此刻,假如你的程序中只要一个播送接纳器的话,是表现不出有序播送的特点的, 右击包名——New——Other——BroadcastReceiver多创立几个播送接纳器。
此刻你仍是会发现,所有的播送接纳器是一起接纳到播送消息的。留意上面介绍的时分说到优先级,这个时分咱们需求设置优先级,在AndroidManifest文件中的Receiver标签中设置播送接纳器的优先级。
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<!--留意此刻有一个Priority特点-->
<intent-filter android:priority="100">
<action android:name="android.intent.action.BROADCAST_TEST"></action>
</intent-filter>
</receiver>
优先级越高的播送接纳器优先收到播送,也能够在收到播送的时分调用abortBroadcast() 办法切断播送。优先级低的播送接纳器就无法接纳到播送了。
面试官,假定我有一个接纳者如下:
在Android的播送接纳机制中,假如接纳到播送,就需求创立播送接纳器。而创立播送接纳器的办法就是新建一个类(能够是独自新建类,也能够是内部类(public)) 继承自BroadcastReceiver
class myBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//接纳到播送的处理,留意不能有耗时操作,当此办法长时间未完毕,会报错。
//一起,播送接纳器中不能开线程。
}
}
面试官,接下来就是面对注册的问题了,有两种注册办法,一种是动态注册,一种是静态注册。
所谓动态注册是指在代码中注册。过程如下 :
- 实例化自定义的播送接纳器。
- 创立IntentFilter实例。
- 调用IntentFilter实例的addAction()办法增加监听的播送类型。
- 最终调用Context的registerReceiver(BroadcastReceiver,IntentFilter)动态的注册播送。
这个时分,已经为咱们自定义的播送接纳器关联了播送,当收到和绑定的播送一直的播送的时分,就会调用播送接纳器中的onReceiver办法。
MyBroadcastReceiver myBroadcastReceiver=new MyBroadcastReceiver();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.example.dimple.MY_BROADCAST");
registerReceiver(myBroadcastReceiver,intentFilter);
这儿需求留意的是,假如需求接纳体系的播送(比方电量改变,网络改变等等),别忘记在AndroidManifest配置文件中加上权限。另外,动态注册的播送在活动完毕的时分需求取消注册:
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myBroadcastReceiver);
}
静态注册:
在创立好的播送接纳器中增加一个Toast提示。代码如下:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"开机启动!",Toast.LENGTH_LONG).show();
}
}
然后在AndroidManifest文件中增加:
-
权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
-
Intent-filter
<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"> <!--增加以下3行--> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver>
此刻重启Android体系就能够收到开机提示了。
总结:
动态注册和静态注册的不同:
动态注册的播送接纳器能够自在的实现注册和取消,有很大的灵活性。可是只要在程序启动之后才干收到播送,此外,不知道你留意到了没,播送接纳器的刊出是在onDestroy()办法中的。所以播送接纳器的生命周期是和当时Activity的生命周期相同。
静态注册的播送不受程序是否启动的约束,当应用程序关闭之后,仍是能够接纳到播送。
规范播送和有序播送的接纳和发送都是全局性的,这样会使得其他程序有几率接纳到播送,会形成必定的安全问题。为了处理这个问题,Android体系中有一套本地播送的机制。这个机制是让所有的播送事情(接纳与发送)都在程序内部完成。主要是采用的一个localBroadcastReceiver对播送进行管理。
今日共享到此完毕,对你有协助的话,点个赞再走呗,下期更精彩~
重视公众号:Android老皮
解锁 《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版
内容如下:
1.Android车载应用开发体系学习指南(附项目实战)
2.Android Framework学习指南,助力成为体系级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到通晓,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构根底
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 功能优化实战+360全方面功能调优
10.Android零根底入门到通晓,高手进阶之路
敲代码不易,重视一下吧。ღ( ・ᴗ・` )