• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android-BroadcastReceiver详解

Android-BroadcastReceiver详解

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android broadcast,android中broadcast,broadcastreceiver,android receiver,android四大组件详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android-BroadcastReceiver详解


什么是Broadcast

Broadcast即广播,在Android广播是非常重要的功能。例如我们想在系统开机之后做某些事情、监控手机的电量、监控手机的网络状态等等,这些功能都需要用到广播。当然我们也可以自定义广播。

自定义广播

通常实现一个简单的自定义广播可以通过如下几个步骤:

创建一个类继承android.content.BroadcastReceiver,并实现onReceive方法 在AndroidManifest.xml中注册广播 通过Context的registerReceiver等方法注册广播 调用Context的sendBroadcast等方法发送广播,在onReceive方法中处理广播 调用Context的unregisterReceiver等方法注销广播

我们通过代码来解释一下上面的步骤:

1.创建一个类继承android.content.BroadcastReceiver,并实现onReceive方法

package com.mark.broadcastreciver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * 创建一个自定义广播接收者需要继承android.content.BroadcastReceiver,
 * 并实现onReceive方法即可。
 */
public class MyReceiver extends BroadcastReceiver {

    private final static String TAG = MyReceiver.class.getSimpleName();

    public MyReceiver() {
    }

    /**
     * 当接收到广播之后会调用此方法
     * @param context 上下文对象
     * @param intent 调用sendBroadcast(intent)传入的Intent实例,其中包含了action、和其他附带信息
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        // 获取msg对应的数据
        String msg = intent.getStringExtra("msg");
        // 打印msg数据
        Log.i(TAG, "msg = " + msg);
        // 打印action字符串
        Log.i(TAG, "action = " + intent.getAction());
    }
}

2.在AndroidManifest.xml中注册广播


    
    

3.通过Context的registerReceiver等方法注册广播
4.调用Context的sendBroadcast等方法发送广播,在onReceive方法中处理广播
5.调用Context的unregisterReceiver等方法注销广播

package com.mark.broadcastreciver;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    BroadcastReceiver registerReceiver;
    IntentFilter intentFilter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 创建BroadcastReceiver实例
        registerReceiver = new MyReceiver();
        // 创建IntentFilter,指定其action为com.mark.broadcast.receiver,这个可以自己定义
        intentFilter = new IntentFilter("com.mark.broadcast.receiver");
        // 注册广播将registerReceiver与intentFilter关联,
        // registerReceiver可以接收到action为com.mark.broadcast.receiver的广播
        registerReceiver(registerReceiver, intentFilter);

        findViewById(R.id.btnRegister).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 发送广播

                // 创建Intent,指定其action为com.mark.broadcast.receiver,与registerReceiver关联的action一致
                Intent intent = new Intent("com.mark.broadcast.receiver");
                // 指定要发送的信息
                intent.putExtra("msg", "Hello, a new message.");
                sendBroadcast(intent);
            }
        });

    }

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

通过上述的步骤我们就实现了一个自定义广播,当我们点击Button在控制台中可以看到如下信息:

04-13 17:12:28.591 16882-16882/com.mark.broadcastreciver I/MyReceiver: msg = Hello, a new message.
04-13 17:12:28.591 16882-16882/com.mark.broadcastreciver I/MyReceiver: action = com.mark.broadcast.receiver

注册广播

注册广播的方式有两种:静态注册和动态注册。

静态注册

这种方法是在配置AndroidManifest.xml配置文件中注册,通过这种方式注册的广播为常驻型广播,也就是说如果应用程序关闭了,有相应事件触发,程序还是会被系统自动调用运行。例如:



    
        
        
        
    

动态注册

这种方法是通过代码在.Java文件中进行注册。通过这种方式注册的广播为非常驻型广播,即它会跟随Activity的生命周期,所以在Activity结束前我们需要调用unregisterReceiver(receiver)方法移除它。例如:

// 创建BroadcastReceiver实例
registerReceiver = new MyReceiver();
 // 创建IntentFilter,指定其action为com.mark.broadcast.receiver,这个可以自己定义
 intentFilter = new IntentFilter("com.mark.broadcast.receiver");
 // 注册广播将registerReceiver与intentFilter关联,
 // registerReceiver可以接收到action为com.mark.broadcast.receiver的广播
registerReceiver(registerReceiver, intentFilter);

注意:如果我们在Activity中注册了BroadcastReceiver,当这个Activity销毁的时候要主动撤销注册否则会出现异常。方法如下:

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

广播的类型

Broadcast的类型有两种:普通广播和有序广播。

Normal broadcasts (普通广播)

Normal broadcasts是完全异步的可以同一时间被所有的接收者接收到。消息的传递效率比较高。但缺点是接收者不能讲接收的消息的处理信息传递给下一个接收者也不能停止消息的传播。多个普通广播设置相同的IntentFilter,则先注册的先收到广播。

Ordered broadcasts (有序广播)

Ordered broadcasts的接收者按照一定的优先级进行消息的接收。如:A,B,C的优先级依次降低,那么消息先传递给A,在传递给B,最后传递给C。优先级别声明在中,取值为[-1000,1000]数值越大优先级别越高。优先级也可通过filter.setPriority(10)方式设置。

另外Ordered broadcasts的接收者可以通过abortBroadcast()的方式取消广播的传播,也可以通过setResultData和setResultExtras方法将处理的结果存入到Broadcast中,传递给下一个接收者。然后,下一个接收者通过getResultData()和getResultExtras(true)接收高优先级的接收者存入的数据。

例如:



    
        

        
    


    
        

        
    

如上两个receiver我们分别设置为priority为999,和1000,及时MyReceiver是后注册的,但是其优先级比FirstReceiver高,则MyReceiver会先处理广播。

sendOrderedBroadcast 发送有序广播

sendOrderedBroadcast(intent, receiverPermission)方法接收两个参数,比普通广播的发送方式多了一个receiverPermission参数,这是一个String类型的参数,代表具有这个权限的Receiver才能处理收到此广播。如果为null则表明不要求接受者声明指定权限。我们来看一下具体的操作。

首先我们要自定义一个权限,例如:

然后我们要是当前的程序具有此权限:例

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android-BroadcastReceiver详解
  • BroadcastReceiver--Android广播机制,broadcastreceiver
  • Android--BroadcastReceiver应用详解
  • android四大组件之Broadcast,androidbroadcast

相关文章

  • 2017-05-26Android使用静默安装时碰见的问题,android静默
  • 2017-05-26AndroidStudio如何快速制作.so
  • 2017-05-26Android关于Dex拆分(MultiDex)技术的解析
  • 2017-05-26项目优化之热更新,项目优化
  • 2017-05-26APK瘦身记,如何实现高达53%的压缩效果,apk53%
  • 2017-05-26Android 实现闪屏页和右上角的倒计时跳转,android跳转
  • 2017-05-26回顾自定义view三个构造函数,回顾view构造函数
  • 2017-05-26Android必知必会-使用okhttp的PUT方式上传文件
  • 2017-05-26开发 Material Design+RxJava+Retrofit+MVP App 参考资料,rxjavaretrofit
  • 2017-05-26Android一些不太常用XML文件属性的总结

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android事件分发机制总结
    • Android中通过反射获取资源Id,android获取资源id
    • 新版mysql搭建多线程主从复制
    • Android--BroadcastReceiver应用详解
    • android 读中文文本文件,android中文
    • android6.0 adbd深入分析(二)adb驱动数据的处理、写数据到adb驱动节点
    • Android 友盟分享详细集成过程及所遇问题解决,android
    • 安卓第十一天笔记-Intent与inter-filter配置,intentfilter
    • 安卓开源项目周报1220,安卓开源项目1220
    • Android与HTML+JS交互入门

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有