广播接收器——接收系统广播

一、分类

标准广播
是一种完全异步执行的广播,在广播发出后,所有的广播接收器几乎会在同一时刻接受到这条广播消息,没有任何顺序而言。这种广播效率比较高,但是无法被截断。
有序广播
是一种同步执行的广播,在广播发出后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。显而易见,这类广播是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前边的广播接收器可以截断正在传递的广播。

二、动态注册接收系统广播

就以监听网络变化为例吧!

步骤

1、声明网络权限

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

2、创建一个类NetworkChangeReceiver继承自BroadcastReceiver。
3、创建一个IntentFilter实例,并为其添加一个值为android.net.conn.CONNECTIVITY_CHANGE的action。
4、创建NetworkChangeReceiver的实例,然后调用registerReceiver()方法进行注册,同时传入NetworkChangeReceiver的实例和IntentFilter的实例。
5、最后不要忘记取消注册广播接收器(因为此广播接收器为动态注册的)。

代码


package com.henuajy.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    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 chages",Toast.LENGTH_SHORT).show();
        }
    }
}

三、静态注册接收系统广播

仍然以监听系统网络状态为例

步骤

1、新建一个类NetworkChangeReceiver,继承BroadcastReceiver并重写onReceive()方法;

package com.henuajy.notificationtest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //网络状态发生变化的逻辑
    }
}

2、在配置文件中的manifest标签下声明网络权限;

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

3、在配置文件中的application标签下添加receiver并添加action--“android.net.conn.CONNECTIVITY_CHANGE”;

<receiver
    android:name=".NetworkStateReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
    </intent-filter>
</receiver>

注意

Android系统为了保护用户设备的安全和隐私,做了严格的规定:如果程序需要进行一些对用户来书比较敏感的操作,就必须在配置文件中声明权限才可以,否则程序会直接崩溃。比如这里访问系统的网络状态就是需要声明权限的。

小补充

如果想要判断网络状态是开启还是关闭,可用下列方法:
1、通过getSystemService()【由于是关于网络状态的,所以要传入参数Context.CONNECTIVITY_SERVICE】方法获取ConnectionManager类的实例manager;
2、通过调用manager的getActiveNetworkInfo()方法获取NetworkInfo类的实例info;
3、通过info的isAvailable()【返回bool值】方法判断网络是否可用。


ConnectionManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if(info!=null&&info.isAvailable()){
    //网络可用的逻辑
}else{
    //网络不可用的逻辑
}

原文地址:https://www.cnblogs.com/HenuAJY/p/10860224.html

时间: 2024-10-15 03:11:44

广播接收器——接收系统广播的相关文章

android在广播接收器BroadcastReceiver里面再进行发送广播,造成当前广播接收器不断循环执行问题

最近在公司处理项目时,用到锁屏状态弹出activity进行提示,类似QQ消息弹屏提示的功能.当中用到了,假如该弹出activity已经位于锁屏界面外时,将不进行再次弹窗,而是发送广播进行通知数据更新,但是在广播接收器里面的某个步骤进行了再次发送通知的操作,发现该广播接收器变成了一个死循环的执行.经过仔细检查,发现没有任何一处用错action.  最终将该广播接收器里面的发送广播语句注释,死循环不在.代码如下: 注:里面的所有action都经过仔细检查,使用均正确,没任何错误,或者引用错误. pa

Android安全问题 抢先接收广播 - 内因篇之广播接收器注册流程

导读:本文说明系统是如何注册动态广播以及静态广播,这里主要注意其注册的顺序 这篇文章主要是针对我前两篇文章 android安全问题  抢先开机启动 - 结果篇 android安全问题  抢先拦截短信 - 结果篇 之前只给出了结果,并没有给出代码分析,现在给出第一步分的分析 大家都知道,广播接收器分为动态注册和静态注册两种 静态接收,就是配置到manifest.xml文件中,PackageManagerService扫描后记录其信息…… 动态接收,就是从代码中注册,通过调用下面的方法实现 Inte

Android -- 简单广播接收与发送(2)--动态注册广播接收器

1. 效果图 2. 代码 1. 布局文件 <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn1" > </Button> <Button android:id="@+id/bu

Broadcase Receiver 广播接收器详解

Android中Broadcast Receiver组件详解 BroadcastReceiver(广播接收器)是Android中的四大组件之一. 下面是Android Doc中关于BroadcastReceiver的概述:①广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件.很多广播是源自于系统代码的──比如,通知时区改变.电池电量低.拍摄了一张照片或者用户改变了语言选项.应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态.②应用程序可以拥有任意数量的广播

Android组件系列----BroadcastReceiver广播接收器

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3960623.html 联系方式:[email protected] [正文] 一.广播的功能和特征 广播的生命周期很短,经过调用对象-->实现onReceive-->结束,整个过程就结束了.从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码.广播对象被构造出

Android开发之接收系统广播消息

BroadcastReceiver除了接收用户所发送的广播消息之外,还有一个重要的用途:接收系统广播.如果应用需要在系统特定时刻执行某些操作,就可以通过监听系统广播来实现.Android的大量系统事件都会对外发送标准广播.以下是Android常见的广播Action常量(详请参考Android API文档中关于Intent的说明). Action常量 说明 ACTION_TIME_CHANGED 系统时间被改变. ACTION_DATE_CHANGED 系统日期被改变. ACTION_TIMEZO

BroadcastReceiver广播接收器基础

BroadcastReceiver 广播接收器 广播接收器,主要是用于app注册一些指定事件的广播接收器,系统在这些事件被触发的时候,会通知到注册的广播接收器,然后广播接收器在onReceive函数中对接收到的通知进行处理:广播接收器的两种注册方式:静态注册:<receiver android:name=".SMSBroadcastReceiver" > <intent-filter> <action android:name="android.

Android基础(4)——广播接收器

在Android中的每个应用程序可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能来自于系统的,也可能来自于其他应用程序的.Android提供了一整套完整的API,允许应用程序自由地发送和接收广播.发送广播就是借助之前了解过的Intent,接收广播则需要用到广播接收器(Broadcast Receiver).. 1.广播的类型 标准广播:Normal broadcast,是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播

Android四大基本组件(1)之Activity与BroadcastReceive广播接收器

Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一.Activity (1)应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应. (2)Activity之间通过Intent进行通信.在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据. (3)典型的动作类型有:M AIN(activity的门户).VIE