android开发之 广播机制

广播接收器(BroadcastReceiver)

Android中的广播主要可以分为两种类型,标准广播和有序广播。

标准广播(Normal broadcasts):

是一种完全异步执行的广播,在广播发出之后,所有的 广播接收器几乎都会在同一时刻接收到这条广播消息,

因此它们之间没有任何先后顺序可 言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。

 有序广播(Orderedbroadcasts):

则是一种同步执行的广播,在广播发出之后,同一时刻 只会有一个广播接收器能够收到这条广播消息,当这个

广播接收器中的逻辑执行完毕后,广 播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广

播接收器就可以先 收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器

就无法收到广播消息了。

想要接收到广播,就需要使用广播接收器了。

注册广播的方式一般有两种,在代码中注册和在 AndroidManifest.xml中注册,其中前者也被称为动态注册,

后者也被称为静态注册。

这是就收广播的方法:

下面是 动态注册监听网络变化

那么该如何创建一个广播接收器呢?其实只需要新建一个类,让它继承自BroadcastReceiver, 并重写父类的

onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行, 具体的逻辑就可以在这个方

法中处理。 那我们就先通过动态注册的方式编写一个能够监听网络变化的程序,借此学习一下广播 接收器的基本

用法吧。新建一个 BroadcastTest项目,然后修改 MainActivity中的代码:

public class MainActivity extends Activity {
    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }

    class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
        }
    }
}

可以看到,我们在 MainActivity 中定义了一个内部类 NetworkChangeReceiver,这个类 是继承自

BroadcastReceiver的,并重写了父类的 onReceive()方法。这样每当网络状态发生变 化时,onReceive()

方法就会得到执行,这里只是简单地使用 Toast提示了一段文本信息。 然后观察 onCreate()方法,首先我们

创建了一个 IntentFilter的实例,并给它添加了一个 值为 android.net.conn.CONNECTIVITY_CHANGE

的 action,为什么要添加这个值呢?因为 当网络状态发生变化时,系统发出的正是一条值为

android.net.conn.CONNECTIVITY_ CHANGE 的广播,也就是说我们的广播接收器想要监听什么广播,

就在这里添加相应的 action就行了。接下来创建了一个 NetworkChangeReceiver的实例,然后调用

registerReceiver() 方法进行注册,将 NetworkChangeReceiver 的实例和 IntentFilter 的实例都传了进去

,这样 NetworkChangeReceiver就会收到所有值为android.net.conn.CONNECTIVITY_CHANGE的广 播,

也就实现了监听网络变化的功能。 最后要记得,动态注册的广播接收器一定都要取消注册才行,这里我们是在

onDestroy() 方法中通过调用 unregisterReceiver()方法来实现的。 整体来说,代码还是非常简单的,现在

运行一下程序。首先你会在注册完成的时候收到 一条广播,然后按下 Home键回到主界面(注意不能按 Back键

,否则 onDestroy()方法会执 行) ,接着按下 Menu键→Systemsettings→Datausage进入到数据使用详情

界面,然后尝试着 开关 MobileData来启动和禁用网络,你就会看到有 Toast提醒你网络发生了变化。 不过只

是提醒网络发生了变化还不够人性化,最好是能准确地告诉用户当前是有网络还 是没有网络,因此我们还需要

对上面的代码进行进一步的优化。修改 MainActivity中的代码:

public class MainActivity extends Activity {

    class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfonetworkInfo = connectionManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();
            }
        }
    }
} 

在onReceive()方法中,首先通过get getSystemService()方法得到了 ConnectivityManager的

实例,这是一个系统服务类,专门用于管理网络连接的。然后调用它的 getActiveNetworkInfo()

方法可以得到 NetworkInfo的实例,接着调用 NetworkInfo的 isAvailable()方法,就可以判断

出当前是否有网络了,最后我们还是通过 Toast的方式对用户进行提示。

另外要注意:

Android系统为了保证应用程序的安全性做了 规定,如果程序需要访问一些系统的关

键性信息,必须在配置文件中声明权限才可以,否则 程序将会直接崩溃,比如这里查询系统的网络

状态就是需要声明权限的。打开 AndroidManifest.xml文件,在里面加入如下权限就可以查询系统

网络状态了:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest"
android:versionCode="1"
android:versionName="1.0">

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="19" />

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

然后就可以再android的应用中查看这些已经声明的权限了。

现在再次运行就看里看到来自系统的提示了。

还有一个就是

静态注册实现开机启动 这个我还不是太明白所以没打算写  等等明白了就决定写下来。

2, 静态注册实现开机启动:(链接)

时间: 2024-10-14 00:42:36

android开发之 广播机制的相关文章

Android开发之广播

广播是Android开发中的一个重要的功能,在Android里面有各式各样的广播,比如:电池的状态变化.信号的强弱状态.电话的接听和短信的接收等等,现在给大家简单介绍一下系统发送.监听这些广播的机制. Android中的广播机制基本如下: 那广播在Android程序中到底是如何运行的呢?现在我给大家以代码的形式好好分析一下: 一.发送广播 Intent是Activity中发送广播的桥梁,通过他我们可以轻松的将广播发送到系统中,具体的实现如下: final String Intent_Action

Android中使用广播机制退出多个Activity

谷歌百度一下,Android中退出多个Activity的方法,大家讨论的很多. 在实习的时候,看到公司的项目退出多个Activity,是采用LinkedList方法,毕业设计的时候,也参照了那种方法.完成之时,无意在网上看到的可以使用广播机制退出Activity.看了一部分人的博客.文章等教程,发现也是摘抄的“很随便”,说的不详细,或不能实现. 看了他们的意思,写了demo,大家看看吧.主要代码如下:(不方便看的直接下整个工程) 为了代码的简洁性,抽取出一个基类BaseActivity(自定义的

Android开发——BroadcastReceiver广播的使用

想要了解广播定义及相关原理的可以看下这一篇BroadcastReceiver史上最全面解析 简单地对广播进行分类吧,广播有两个角色,一个是广播发送者,另外一个是广播接收者 广播按照类型分为两种,一种是全局广播,另外一种是本地广播 全局广播的意思就是发出的广播可以被其他任意的应用程序接收,或者可以接收来自其他任意应用程序的广播. 本地广播则是只能在应用程序的内部进行传递的广播,广播接收器也只能接收内部的广播,不能接受其他应用程序的广播 按照广播机制也可以分为两种,标准广播和有序广播 无序广播:所有

&lt;Android基础&gt;(五) 广播机制 Part 1

1)接收系统广播:a.动态注册监听网络变化 b.静态注册实现开机启动 2)发送自定义广播:a.发送标准广播 b.发送有序广播 3)使用本地广播 第五章 5.1 广播机制 Android中的每个程序都可以对自己感兴趣的广播进行注册.发送广播的方法借助Intent,接收广播的方法则为广播接收器(Broadcast Receiver). 广播可分为两种. 1.标准广播 (Normal broadcasts):完全异步执行的广播,在广播发出之后,所有广播几乎会在同一时刻接收到这条广播信息,没有任何先后顺

[Android随笔]BroadcastReceiver广播机制

一,介绍 android四大组件之一:BroadcastReceiver 翻译成中文:广播接收者.在Android中,Broadcast是一种广泛运用在应用程序之间传输信息的机制.而BroadcastReceiver是对发送出来的Broadcast(广播)进行过滤.接收.响应的一类组件. 呵呵,作为一个android研发学习者,我们想要学习使用BroadcastReceiver这个组件,当然实践是最好的方式.下面介绍BroadcastReceiver的几种使用方式. 二,使用方式 2.1 静态注

Android开发——消息处理传递机制

在程序开发时,对于比较耗时的操作,通常会为其开辟一个单独的线程来执行,以尽可能减少用户的等待时间.在Android中,默认情况下,所有的操作都是在主线程中进行的,主线程负责与UI相关的事件.而在自己新建的线程中,不能对UI进行操作.因此Android提供了消息处理传递机制来解决这一问题. Message,消息类.存放于MessageQueue中,包含数据类型,用户自定义的消息代码等. MessageQueue,消息队列.在MessageQueue中,存放的消息按照FIFO(先进先出)的原则执行.

Android开发之消息机制

转:http://stackvoid.com/introduction-to-Message-Handler-in-Android/ http://blog.dreamtobe.cn/2016/03/11/android_handler_looper/ Android应用程序主线程用来跟新UI,所以不能让主线程做费时操作,否则会出现ANR(App Not Response), 一般来说耗时操作都新开启一个线程,新线程执行结束,发消息给主线程来更新UI,常用方法有: Activity.runOnU

Android学习笔记-广播机制

Android广播类似QT中的信号和槽~~~ 界面文件activity_main.xml    <TextView         android:id="@+id/textView1"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="@string/hell

Android 开发笔记 “广播组件使用”

在Activity中,注册广播的一个Demo. 总共分3步 第一步:定义一个BroadcastReceiver广播接收类: private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equa