什么是播送,简单点播送就是安卓体系本身宣布的声音,咱们能够经过安卓提供给咱们的一系列内容来接纳和宣布播送,以此来简单快捷地实现一些功能。

在实际开发中也常常用到,而是否熟悉使用,这成为面试官最常问的问题。

当面试官问你:

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零根底入门到通晓,高手进阶之路

敲代码不易,重视一下吧。ღ( ・ᴗ・` )