Android之路-------传说中的大喇叭(广播接收器)_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > Android之路-------传说中的大喇叭(广播接收器)

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

 2015/1/14 2:53:28  Leo's  程序员俱乐部  我要评论(0)
  • 摘要:前言没想到离上一篇博文的时间已经有一个多星期了,时间真的不等人啊,在这里LP告诉你们一个道理,如果现在有谁正在看管理时间的书,那么请你们把这些书放下吧,看了也没有用,因为时间我们根本管不了,我们只能管自己,如果真的想管时间,错了,应该是珍惜时间的话,那么请你们要和时间做朋友,介绍一本书给大家看《和时间做朋友》作者是李笑来。不说废话了,广播开始了目录什么是广播广播的种类怎么去使用这些广播最安全的广播什么是广播?广播相信有上过学的人都知道,在学校里面都有那么一个大喇叭,通知大家起床做早操
  • 标签:android

前言

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

目录

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

什么是广播?

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

广播的种类

  1.标准广播

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

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

直接上图

   

  2.有序广播

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

直接上图

怎么去使用这些广播

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

  1.动态注册

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

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

代码如下:

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

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

 

小结

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

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

   

发表评论
用户名: 匿名