zoukankan      html  css  js  c++  java
  • Android之旅---广播(BroadCast)


    什么是广播

             在Android中。Broadcast是一种广泛运用的在应用程序之间传输信息的机制。

    我们拿广播电台来做个例如。

    我们寻常使用收音机收音是这种:许很多多不同的广播电台通过特定的频率来发送他们的内容。而我们用户仅仅须要将频率调成和广播电台的一样就能够收听他们的内容了。Android中的广播机制就和这个差点儿相同的道理。

    电台发送的内容是语音,而在Android中我们要发送的广播内容是一个Intent。这个Intent中能够携带我们要传送的数据。

    电台通过大功率的发射器发送内容,而在Android中则是通过sendBroadcast这种方法来发送(非常形象的名字吧)。       

    用户通过调整到详细的电台频率接受电台的内容。

    而在Android中要接受广播中的内容则是通过注冊一个BroadCastReceiver来接收的。

    仅仅有发送广播的action和接收广播的action同样,接受者才干接受这个广播。

    广播有什么用
         事实上,在什么是广播的第一句就已经说明了广播有什么用了。

    对了。笼统一点讲就是用来数据传输的。

    详细一点说就是:

     
     
       
    1.实现了不同的程序之间的传输数据与共享。由于仅仅要是和发送广播的action同样的接受者都能接受这个广播。

    典型的应用就是android自带的短信,电话等等广播。仅仅要我们实现了他们的action的广播。那么我们就能接收他们的数据了,以便做出一些处理。

    比方说拦截系统短信,拦截骚扰电话等等

     
    2.起到了一个通知的作用,比方在service中要通知主程序,更新主程序的UI等。由于service是没有界面的,所以不能直接获得主程序中的控件。这样我们就仅仅能在主程序中实现一个广播接受者专门用来接受service发过来的数据和通知了。

    实现广播

             如今我们就来实现一个简单的广播程序。

    Android提供了两种注冊广播接受者的形式,各自是在程序中动态注冊和在xml中指定。他们之间的差别就是作用的范围不同。程序动态注冊的接收者仅仅在程序执行过程中有效。而在xml注冊的接收者无论你的程序有没有启动有会起作用。首先介绍在程序中动态注冊的方式。

    动态注冊方式

             我们在程序中设置了三个button。各自是“注冊广播”。“取消注冊”和“发送广播”。

    然后每一个button设置点击事件来完毕广播的演示。

    最简单的项目的建立过程和button事件的建立我再这里就不罗嗦了,不会的能够下载以下的DEMO源代码查看。直接看三个button的实现方式。

    首先是注冊广播的button事件代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    private ReceiveBroadCast receiveBroadCast;  //广播实例
     
    public class RegisteLinster implements OnClickListener
    {
            @Override
            public void onClick(View view)
            {
                // 注冊广播接收
                receiveBroadCast = new ReceiveBroadCast();
                IntentFilter filter = new IntentFilter();
                filter.addAction(flag);    //仅仅有持有同样的action的接受者才干接收此广播
                registerReceiver(receiveBroadCast, filter);
            }
    }
     
    public class ReceiveBroadCast extends BroadcastReceiver
    {
     
            @Override
            public void onReceive(Context context, Intent intent)
            {
                //得到广播中得到的数据,并显示出来
                String message = intent.getStringExtra("data");
                txtShow.setText(message);
            }
     
    }

    首先我们实现了一个ReceiveBroadCast 类。它继承了BroadcastReceiver并实现了当中的onReceive方法。这样当这个广播被接收的时候就会运行这种方法。

    注意我们在注冊广播的时候使用了filter.addAction方法加入了一个过滤器。假设没有这一句,就相当于广播电台没有告诉咱们收音机用户接收的频率,就不好收听这个广播了。

    再来看看怎样取消注冊。是的程序不再接收这个类型的广播了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class UnregisteLinster implements OnClickListener
    {
     
            @Override
            public void onClick(View arg0)
            {
                unregisterReceiver(receiveBroadCast);
            }
    }

    怎么样?是不是超级简单的啊,就是将我们上面的那个广播类的实例传进去即可了。

    如今注冊。取消注冊都好了。就剩下怎样发送了。看代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class SendBroadCastListener implements OnClickListener
    {
            @Override
            public void onClick(View arg0)
            {
                Intent intent = new Intent();  //Itent就是我们要发送的内容
                intent.putExtra("data""this is data from broadcast "+Calendar.getInstance().get(Calendar.SECOND));  
                intent.setAction(flag);   //设置你这个广播的action,仅仅有和这个action一样的接受者才干接受者才干接收广播
                sendBroadcast(intent);   //发送广播
            }
    }

    每一句都凝视了的,就不要我再讲了吧。一看就明确了。如今。执行程序看看效果吧。

    先注冊一下,然后每发送一次广播上面的文字就会变化一次。表明已经接收到了广播了。按取消注冊后你能够发现再按发送button已经接收不到广播了。

    配置文件方式

    配置和动态注冊的差别在上面已经说了,这样的方式适合你的程序须要长期的监測某个广播的情形,比方监測用户的短信。注冊方式比較简单,相当于上面的代码仅仅要接收的那部分即可了。

    只是要注意的是通过配置文件这样的方式注冊广播须要在单独的一个类中继承BroadReceiver,内部类是没实用的。所以我们新建了一个broadCastReceiveByXml类并继承了BroadReceive。

    代码例如以下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class broadCastReceiveByXml extends BroadcastReceiver
    {
     
        @Override
        public void onReceive(Context arg0, Intent arg1)
        {
            Log.d("qlf""broadcast receive by xml");    //由于不在主UI下,不好使用控件,所以我们这里打印到LOG里面查看效果
        }
     
    }

    然后在AndroidManifest中的<activity></activity>节点之后我们加入一下代码:

    1
    2
    3
    4
    5
    6
    <receiver android:name="com.qlf.broadCast.broadCastReceiveByXml">
        <intent-filter>
            <action android:name="com.qlf.broadCastFlag">
            </action>
        </intent-filter>
    </receiver>

    receiver中的android:name就是我们在程序中的那个接收广播的类。以下的intent-filter和我们讲到的功能类似。而这个action就是上面的那个flag啦。如今我们执行程序,发现相同能够实现上面的功能。执行的结果例如以下:

    14073458

    除了使用我们自己发送广播,android也内置了很多广播。比方我们上面提到的来了消息的时候android会发送一个action名为“android.provider.Telephony.SMS_RECEIVED”的广播,这个时候假设我们想要接受这个广播仅仅要将配置文件里的那个action设置为上面这个字符串就能接收到消息信息了。android包含了更多的广播action。有兴趣的同学到网上搜搜就有了。这里就不再举例了。

  • 相关阅读:
    Xcode工程编译错误之iOS开发之The Xcode build system has crashed. Please close and reopen your workspace
    flutter学习之二Material Design设计规范
    Instruments之Xcode Analyze 代码静态检查及问题解决
    【Flutter学习】之MaterialApp和Scaffold组件使用详解
    ItunesConnect:"Missing Push Notification Entitlement"警告-----以及解决方法
    iOS 微信打开第三方应用(Universal Links 和 URL Schemes)
    关于代理服务器的原理及用法
    Xcode工程编译错误之iOS开发之Sending '__strong typeof (xxx)' (aka 'xxxx *__strong') to parameter of incompatible type 'id<xxx>'
    HL AsySocket 服务开发框架
    feign hystrix 线程池伸缩控制
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6784906.html
Copyright © 2011-2022 走看看