• Android之路-------传说中的大喇叭(广播接收器)


    前言

      没想到离上一篇博文的时间已经有一个多星期了,时间真的不等人啊,在这里LP告诉你们一个道理,如果现在有谁正在看管理时间的书,那么请你们把这些书放下吧,看了也没有用,因为时间我们根本管不了,我们只能管自己,如果真的想管时间,错了,应该是珍惜时间的话,那么请你们要和时间做朋友,介绍一本书给大家看《和时间做朋友》  作者是 李笑来。  不说废话了,广播开始了

    目录

    • 什么是广播
    • 广播的种类
    • 怎么去使用这些广播
    • 最安全的广播

    什么是广播?

      广播相信有上过学的人都知道,在学校里面都有那么一个大喇叭,通知大家起床做早操,通知大家去上课,通知大家够时间吃饭了等等一些,这种就是广播,其实Android中的广播原理就是这样,只是性质不一样而已。

    广播的种类

      1.标准广播

        它是一种完全异步执行的广播,一旦发出后,所有的接收器在同一时间内接收到这个广播,没有任何顺序可言

        这种广播效率比较高,在效率高的同时也意味着它是无法被截断的

    直接上图

       

      2.有序广播

        它是一种同步执行的广播,在广播发出之后,同一时间内只有一个广播接收器接收到,当这个广播接收器的逻辑执行完了才会继续传播,所以这种广播机制是有优先级的,优先级越高就可以最先接收到广播,同样的道理,优先级高,自然也可以截断广播不让广播继续传下去。

    直接上图

    怎么去使用这些广播

      要使用这些广播那么就必须要注册,说到注册广播,Android系统提供了两种注册机制。

      1.动态注册

        动态注册的话,直接调用registerReceiver()方法就可以注册了,但是在活动销毁的时候必须要调用unregisterReceiver()方法取消注册。

        虽说动态注册广播接收器,可以自由的控制,在灵活性方面有很大的优势,但是有一个缺点,就是必须要在程序启动之后才能接收到广播。

    代码如下:

     1 public class MainActivity extends Activity {
     2     private IntentFilter intentFilter;
     3     private NetworkChangeReceiver networkChangeReceiver;
     4 
     5     @Override
     6     protected void onCreate(Bundle savedInstanceState) {
     7         super.onCreate(savedInstanceState);
     8         setContentView(R.layout.activity_main);
     9         intentFilter = new IntentFilter();
    10         intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
    11         networkChangeReceiver = new NetworkChangeReceiver();
    12         registerReceiver(networkChangeReceiver, intentFilter);
    13     }
    14 
    15     @Override
    16     protected void onDestroy() {
    17         super.onDestroy();
    18         unregisterReceiver(networkChangeReceiver);
    19     }
    20 
    21     class NetworkChangeReceiver extends BroadcastReceiver {
    22         @Override
    23         public void onReceive(Context context, Intent intent) {
    24             Toast.makeText(context, "network changes", Toast.LENGTH_SHORT)
    25                     .show();
    26         }
    27     }
    28 }

    2.静态注册

        上面介绍了动态注册广播接收器,相信你们自然会注意到,动态注册只能在程序启动后才能接受广播,那么你们肯定会有疑问,那怎么才能让程序已启动就能接受到呢?没错下面LP要介绍的这种方式就能解决你们的疑问,而且注册非常简单。下面我就写一个开机广播吧...

    首先创建一个类,然后继承BroadcastReceiver,代码如下

    1 public class BootCompleteReceiver extends BroadcastReceiver {
    2     @Override
    3     public void onReceive(Context context, Intent intent) {
    4         Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
    5     }
    6 }

    然后在项目的根目录下的AndroidManifest.xml文件的Application标签下配置:

     1 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     2     package="com.example.broadcasttest"
     3     android:versionCode="1"
     4     android:versionName="1.0" >
     5 
     6     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     7 
     8     <application
     9         android:allowBackup="true"
    10         android:icon="@drawable/ic_launcher"
    11         android:label="@string/app_name"
    12         android:theme="@style/AppTheme" >
    13         <receiver android:name=".BootCompleteReceiver" >
    14             <intent-filter>
    15                 <action android:name="android.intent.action.BOOT_COMPLETED" />
    16             </intent-filter>
    17         </receiver>
    18     </application>
    19 
    20 </manifest>

    注意写开机广播接收器需要在清单文件中添加开机权限。

    我们的逻辑业务代码都是卸载onReceive这个方法里面就可以了。

    广播接收介绍完了,那么到底我们可不可以自己发广播呢,答案是肯定的....我们又怎么去发广播呢?

    其实发广播非常简单,代码如下:

     1 /**
     2  * 自定义广播接收器,接收自己发送的广播
     3  */
     4 public class MyBroadcastReceiver extends BroadcastReceiver {
     5     @Override
     6     public void onReceive(Context context, Intent intent) {
     7         Toast.makeText(context, "received in MyBroadcastReceiver",
     8                 Toast.LENGTH_SHORT).show();
     9     }
    10 }

    接收器写好了,不过还需要在AndroidManifest.xml文件中定义:

     1 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     2     package="com.example.broadcasttest"
     3     android:versionCode="1"
     4     android:versionName="1.0" >
     5 
     6     <application
     7         android:allowBackup="true"
     8         android:icon="@drawable/ic_launcher"
     9         android:label="@string/app_name"
    10         android:theme="@style/AppTheme" >
    11         <receiver android:name=".MyBroadcastReceiver" >
    12             <intent-filter>
    13                 <action android:name="com.example.broadcasttest. MY_BROADCAST" />
    14             </intent-filter>
    15         </receiver>
    16     </application>
    17 
    18 </manifest>

    好了,都准备完了,这时候我们就可以写发送广播的代码了:

     1 public class MainActivity extends Activity {
     2     @Override
     3     protected void onCreate(Bundle savedInstanceState) {
     4         super.onCreate(savedInstanceState);
     5         setContentView(R.layout.activity_main);
     6         Button button = (Button) findViewById(R.id.button);
     7         button.setOnClickListener(new OnClickListener() {
     8             @Override
     9             public void onClick(View v) {
    10                 Intent intent = new Intent(
    11                         "com.example.broadcasttest. MY_BROADCAST");
    12                 sendBroadcast(intent);
    13             }
    14         });
    15     }
    16 }

    点击按钮就可以成功的发送广播了,是不是非常简单。。其实要注意的就是  Intent()里的 com.example.broadcasttest. MY_BROADCAST 和 AndroidManifest.xml文件里定义的广播接收器配置中intent-filter中的 <action android:name="com.example.broadcasttest. MY_BROADCAST" />  一直就可以了

    前面介绍到,有两种广播的,那么我们怎么去区分呢,其实也是很简单的,只是在发送广播的时候用的方法不一样,

    发送标准广播,即不可截断的广播用  sendBroadcast(intent)方法

    发送有序广播,即可截断的广播用 sendOrderBroadcast(intent,null)方法

    最安全的广播

      那么最安全的广播是什么广播呢?

      那就是本地广播,为什么说最安全呢?因为通过这种广播机制发出的广播,只能够在应用程序的内部传递数据,且广播接收器也只能接受来自本应用的广播。而前面我们介绍的广播,都是全局广播,反正在同一个手机,应用程序发送出去的广播,别的程序都可以接收到,我们也可以接收到别的程序发来的广播。这样很容易产生安全漏洞,所以说本地广播是最安全的。

      如何去使用呢?

      通过LocalBroadcastManager的getInstance()方法得到它的一个失礼,然后调用LocalBroadcastManager的registerReceiver注册一个广播接收器,而在发送本地广播的时候调用LocalBroadcastManager的sendBroadcast()方法就可以了,非常简单...

    代码如下:

     1 public class MainActivity extends Activity {
     2     private IntentFilter intentFilter;
     3     private LocalReceiver localReceiver;
     4     private LocalBroadcastManager localBroadcastManager;
     5 
     6     @Override
     7     protected void onCreate(Bundle savedInstanceState) {
     8         super.onCreate(savedInstanceState);
     9         setContentView(R.layout.activity_main);
    10         localBroadcastManager = LocalBroadcastManager.getInstance(this); // 获取实例
    11         Button button = (Button) findViewById(R.id.button);
    12         button.setOnClickListener(new OnClickListener() {
    13             @Override
    14             public void onClick(View v) {
    15 
    16                 Intent intent = new Intent(
    17                         "com.example.broadcasttest. LOCAL_BROADCAST");
    18                 localBroadcastManager.sendBroadcast(intent); // 发送本地广播
    19             }
    20         });
    21         intentFilter = new IntentFilter();
    22         intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
    23         localReceiver = new LocalReceiver();
    24         localBroadcastManager.registerReceiver(localReceiver, intentFilter); // 注册本地广播监听器
    25     }
    26 
    27     @Override
    28     protected void onDestroy() {
    29         super.onDestroy();
    30         localBroadcastManager.unregisterReceiver(localReceiver);
    31     }
    32 
    33     class LocalReceiver extends BroadcastReceiver {
    34         @Override
    35         public void onReceive(Context context, Intent intent) {
    36             Toast.makeText(context, "received local broadcast",
    37                     Toast.LENGTH_SHORT).show();
    38         }
    39     }
    40 }

    小结

         在不知不觉中,我们已经学了Android四大组件的两个组件了,后面我还会将我学到的一一分享,写到这里来。

        关于广播接收器的重点都介绍完了,大家有没有觉得很难? 或者说有没有发现LP哪里写的不对,如果有的话,麻烦各位博友,动一下手指头在下面点评一下LP。如果觉得LP写的还不错的话,麻烦也动下鼠标帮我点个赞,你们的点赞是我的动力啊

       

    版权声明


    作者:xiaoli(小黎)

    出处:博客园小黎的技术博客--http://www.cnblogs.com/coffeeXiaoLi/

    您的支持是对博主最大的鼓励,感谢您的认真阅读。

    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Oracle Day2
    Orcale Day1
    JavaSE 单例模式
    C#Windows 服务的安装说明
    Json转Hashtable的转换
    将汉字转为拼音
    游标 的使用
    C#后台画图保存为ipg/png的文件
    T-sql 查询
    EF简单的添加修改删除基本语法
  • 原文地址:https://www.cnblogs.com/coffeeXiaoLi/p/4220173.html
Copyright © 2020-2023  润新知