zoukankan      html  css  js  c++  java
  • 使用广播-BroadcastReceiver最详细解析

    标题图

    • 女孩:BroadcastReceiver是什么呀?
    • 男孩:Broadcast是广播的意思,在Android中应用程序之间的传输信息的机制,BroadcastReceiver是接收广播通知的组件,广播和广播接收器是Android中需要了解的,那么怎么样去了解呢~

    广播,大家应该可以理解,我们在学校做眼保健操时,就有个广播,告诉我们要做眼保健操了。广播传递信息告诉我们要做什么,通知信息或传递数据等。广播接收器是用来接收来自系统和应用的广播。

    在Android中提供了两种主要的类型广播:标准广播和有序广播。

    什么是广播呢?在手机的消息提示框,对话框或通知的形式告诉我们,如我们手机没电了,会弹出提示,接收短信弹出提示等。而Broadcast Receiver为广播接收器,是接收广播的组件。

    • 女孩:那么哥,什么是普通广播和有序广播?
    • 男孩:额,在这里你要了解一下普通广播和有序广播,主要讲一下。~

    普通广播:

    Normal broadcasts,是一种完全异步执行的广播,当广播发出后,几乎所有广播接收器都会在同一时间收到这条广播。如下图:

    图片

    这相当于有人在广播室里,播放做眼保健操的信息,一同发出到每个教室一样,没有先后顺序之分,对于普通广播是无法终止广播的传播,一旦发送,无法截断其中一条,几乎被所有接受者收到,而我们做眼保健操的就是接受者了。对于普通广播,在Android中使用Context.sendBroadcast()方法来发送。

    有序广播:

    有序广播,Ordered broadcasts,是一种同步执行的广播,广播发出后,只会有一个广播接收器能接收到广播消息,当这个广播接收器接收到后,广播才会继承传递,对于有序广播有了先后顺序,在Android中提供了优先级的属性(priority)来控制先后,有序广播中可以截断广播,不被下一个广播接收器接收,这是有序广播的特点。

    图片

    在这里你了解了普通广播和有序广播的原理,这两种其实就是广播的接收的不同表现形式而已。

    BroadcastReceiver的实现:

    到头来还是要了解BroadcastReceiver的实现,接下来我列出主要的内容目录,对于广播接收器是我们要掌握的,是Android中重要的四大组件之一。

    BroadcastReceiver.png

    接收系统广播

    你或许会问一下什么又是系统广播,对于掌握手机概念的,应用懂得系统,如:电池电量低,发送系统广播消息;安装新应用,广播安装信息等。

    广播注册分动态和静态两种:

    动态注册,需要继承BroadcastReceiver的,并重写onCreate()方法,和onReceive()方法,在onReceive()方法中,要实例接收器和IntentFilter实例。接着继续重写onDestroy()方法,加入unregisterReceiver()方法来实现取消注册。

    在动态注册的广播接收器中最后一定要取消注册。

    简化:

    重写onCreate()
    重写onDestroy()
    extends BroadcastReceiver
    重写onReceive()

    静态注册,只要在配置文件中修改代码即可,在AndroidManifest.xml文件中:

    <receiver android:name=包名.类名>
    <intent-filter>
     <action android:name="发送的广播"
    </intent-filter>
    </receiver>

    这里补充说一个自定义的广播接受者

    步骤:同样

    1. 继承BroadcastReceiver基类
    2. 复写抽象方法onReceive()方法

    以上为发送普通广播的实现形式,那么你还记得一个有序广播吗?对于有序广播的形式很简单,也是和普通广播一样实现。只在发送有差异而已。

    有序广播和普通广播差异:只要修改普通广播中sendBroadcast()方法,改成sendOrderedBroadcast()方法即可,你会觉得难记吗?

    广播接收器(Broadcast Reveiver)
    标准广播(Normal broadcasts)
    有序广播(Ordered broadcasts)

    这里说一下,我把标准广播说错成标准广播了,其实这里标准和普通随意叫吧,不过为了显示技术牛逼,在外人前尽量说标准广播吧。ok?

    使用本地广播:

    什么又是本地广播呢?你会问道,本地广播是Android引入的一套机制,为本地广播机制,使用本地广播机制,有很多优点:

    1. 不用但系机密数据被泄漏;
    2. 不用担心安全漏洞的隐患;
    3. 更加高效。

    在介绍本地广播之前,前面讲的广播室一种全局的,属于系统全局广播,广播室一个全局的监听器,在Android中,我们要知道广播有两种说法:广播发送者和广播接收者。

    在本地广播重点说明:本地广播没有静态注册的方式,静态注册是为了程序在未启动前也能收到广播,而发送本地广播时,我们的程序是已开启了的。

    • 女孩:哥,讲的差不多了,已经掌握了,不过可以写一些代码例子吗?
    • 男孩:嗯,可以,掌握就牛逼了~

    代码示例:

    // 继承BroadcastReceivre基类
    public class MyBroadcastReceiver extends BroadcastReceiver {
    
     // 复写onReceive()方法
     @Override
     public void onReceive(Context context, Intent intent) {
      //写入接收广播后的操作
     }
    }

    示例动态注册:

     private IntentFilter intentFilter;
     private MyReceiver myReceiver;
    
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
    
      intentFilter = new IntentFilter();
      intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
      myReceiver = new MyReceiver();
      registerReceiver(myReceiver, intentFilter);
     }
    
     @Override
     protected void onDestroy() {
      super.onDestroy();
    
      unregisterReceiver(myReceiver);
    
     }

    示例静态注册:

    <receiver android:name=".包名" >
      <intent-filter>
         <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
      </intent-filter>
    </receiver>

    最后都要加权限:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    发送自定义广播:

    Intent intent = new Intent("com.example.dashu.MY_BROADCAST");
    //指明要发送的广播值
    sendBroadcast(intent);

    发送有序广播:

    //sendOrderedBroadcast()方法
    Intent intent = new Intent("com.example.dashu.MY_BROADCAST");
    //指明要发送的广播值
    sendOrderBroadcast(intent,null);
    <intent-filter android:priority="100">
    ...
    </intent-filter>
    //优先级
    
    abortBroadcast();
    //截断

    本地广播:

    localBroadcastManager = LocalBroadcastManager.getInstance(this);
    //获取实例
    
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("com.....");
    myReceriver = new MyReceriver();
    localBroadcastManager.registerReceiver(myReceriver, intentFilter);
    
    Intent intent = new Intent("com...");
    localBroadcastManager.sendBroadcast(intent);
    //发送本地广播
    
    localBroadcastManager.unregisterReceiver(myReceiver);

    总结

    有关内容就到这里了,本篇介绍了四大组件中的广播组件的知识点。

    送心

  • 相关阅读:
    发布 Rafy .NET Standard 版本 Nuget 包
    使用 MarkDown & DocFX 升级 Rafy 帮助文档
    apache2服务器支持cgi功能
    百兆网口与千兆网口速率协商不成功
    ubuntu etho0 up cron
    linux 后台进程
    MySQL的事务性
    linux下visual studio code配置c++调试环境实例
    linux下visual studio code中gdb调试文件launch.json解析
    Zookeeper安装后,编译C client时报错"syntax error near unexpected token `1.10.2"
  • 原文地址:https://www.cnblogs.com/dashucoding/p/11932577.html
Copyright © 2011-2022 走看看