android基础---->Broadcast的使用

  在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。

目录导航:

  1. 广播Broadcast的简要说明
  2. 广播Broadcast的准备工作
  3. Broadcast广播的测试
  4. 友情链接

广播Broadcast的简要说明

一、 广播的种类:标准广播和有序广播

  • 标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的

   

  • 有序广播:则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递

  

二、 注册BroadcastReceiver的两种方式:

  • 静态注册:在AndroidManifest.xml中用标签生命注册,并在标签内用标签设置过滤器
<receiver android:name=".NetworkChangeReceiver">
    <intent-filter>
        <action android:name="com.example.linux.broadcasttest.MyBroadcast" />
    </intent-filter>
</receiver>
  • 动态注册:在java代码中调用registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法
Intent intent = new Intent();
intent.putExtra("username", "linux");
intent.setAction("com.example.linux.broadcasttest.MyBroadcast");
sendBroadcast(intent);

广播Broadcast的准备工作

我们建立一个android项目,结构如下:

一、 在MainActivity中初始化一些信息:

private final static String TAG = "OtherReceiver";
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
private LocalBroadcastManager localBroadcastManager;
private LocalReceiver localReceiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.i(TAG, "main on create");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

二、 创建三个广播接收器,用于广播的测试:它们分别如下

  • LocalReceiver本地广播:
package com.example.linux.broadcasttest;

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

/**
 * Created by Linux on 2016/3/7.
 */
public class LocalReceiver extends BroadcastReceiver {
    private final static String TAG = "OtherReceiver";

    public LocalReceiver() {
        Log.i(TAG, "local receiver constructor.");
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String username = intent.getStringExtra("username");
        Log.i(TAG, "local username: " + username);
    }
}
  • OtherReceiver用于测试有序广播:
package com.example.linux.broadcasttest;

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

public class OtherReceiver extends BroadcastReceiver {
    private final static String TAG = "OtherReceiver";
    public OtherReceiver() {
        Log.i(TAG, "other receiver constructor.");
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String username = intent.getStringExtra("username");
        Log.i(TAG, "other username: " + username);
        abortBroadcast();
    }
}
  • NetworkChangeReceiver用于测试系统广播的使用:
package com.example.linux.broadcasttest;

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

/**
 * Created by Linux on 2016/3/7.
 */
public class NetworkChangeReceiver extends BroadcastReceiver {
    private final static String TAG = "OtherReceiver";

    public NetworkChangeReceiver() {
        Log.i(TAG, "network receiver constructor.");
    }

    @Override
    //Intent是sendBroadcast中的参数
    public void onReceive(Context context, Intent intent) {
        String username = intent.getStringExtra("username");
        Log.i(TAG, "network username: " + username);
    }
}

三、 由于广播会涉及到注册,这里我把广播的注册代码贴出来:在AndroidManifest.xml文件中

<receiver android:name=".NetworkChangeReceiver">
    <intent-filter>
        <action android:name="com.example.linux.broadcasttest.MyBroadcast" />
    </intent-filter>
</receiver>
<receiver android:name=".OtherReceiver">
    <intent-filter android:priority="100">
        <action android:name="com.example.linux.broadcasttest.MyBroadcast" />
    </intent-filter>
</receiver>
<receiver android:name=".LocalReceiver">
    <intent-filter>
        <action android:name="com.example.linux.broadcasttest.MyBroadcast" />
    </intent-filter>
</receiver>

Broadcast广播的测试

一、 定义方法sendSystemBroad,用于发送系统广播

// 发送系统广播
public void sendSystemBroad(View view) {
    intentFilter = new IntentFilter();
    intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
    networkChangeReceiver = new NetworkChangeReceiver();
    registerReceiver(networkChangeReceiver, intentFilter);
}
  • 打印的结果:
03-23 23:03:20.087 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: other receiver constructor.
03-23 23:03:20.087 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: other username: linux
03-23 23:03:20.097 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: network receiver constructor.
03-23 23:03:20.107 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: network username: linux
03-23 23:03:20.107 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: local receiver constructor.
03-23 23:03:20.107 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: local username: linux

二、 定义方法sendBroadCast,用于测试发送标准广播

// 发送标准广播
public void sendBroadCast(View view) {
    Intent intent = new Intent();
    intent.putExtra("username", "linux");
    intent.setAction("com.example.linux.broadcasttest.MyBroadcast");
    sendBroadcast(intent);
}
  • 打印的结果:
03-23 23:05:47.957 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: network receiver constructor.
03-23 23:05:47.967 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: network username: null

三、 定义方法sendOrderBroad,用于测试有序广播

// 发送有序广播
public void sendOrderBroad(View view) {
    Intent intent = new Intent();
    intent.putExtra("username", "linux");
    intent.setAction("com.example.linux.broadcasttest.MyBroadcast");
    sendOrderedBroadcast(intent, null);
}
  • 打印的结果:
03-23 23:07:28.877 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: other receiver constructor.
03-23 23:07:28.877 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: other username: linux

四、 定义方法sendLocalBroad,用于测试本地广播

// 使用本地广播
public void sendLocalBroad(View view) {
    localBroadcastManager = LocalBroadcastManager.getInstance(this);
    Intent intent = new Intent();
    intent.putExtra("username", "linux");
    intent.setAction("com.example.linux.broadcasttest.MyBroadcast");
    localBroadcastManager.sendBroadcast(intent);
}
  • 打印的结果:
03-23 23:28:09.327 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: local username: linux
03-23 23:28:09.327 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: local username: linux
03-23 23:28:09.327 31259-31259/com.example.linux.broadcasttest I/OtherReceiver: local username: linux

友情链接

时间: 2024-10-07 02:10:38

android基础---->Broadcast的使用的相关文章

Android 面试题总结之Android 基础(四)

Android 面试题总结之Android 基础Service(四) 在上一章节Android 面试题总结之Android 基础Broadcast Receiver(三) 我们讲了Broadcast Receiver基础知识.本节主要讲解Service相关基础知识,Service也是我们开发过程中经常使用到. 在阅读过程中有任何问题,请及时联系.如需转载请注明 fuchenxuan de Blog 本章系<Android 之美 从0到1 – 高手之路>Android基础Service 总结了A

Android基础之五:四大组件(Broadcast Receiver)

Broadcast Receiver作为Android四大组件之一,在整个系统中广泛运用,系统中存在各种各样的广播机制,例如下载,网络等都有具体的广播接收器 广播在很大程度上简化了开发,可以通过广播监听系统状态变化,监听另一App中事件传递,可以接收当前App中不同组件,不同UI.不同线程之间的消息传递 广播的创建与使用 创建一个继承自BroadcastReceiver类的子类,重写onReceiver方法 public class MReceiver extends BroadcastRece

android基础知识13:AndroidManifest.xml文件解析

1.重要性 AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息. 因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所

Android 基础总结:( 十四)Handler详解(上)

Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发,比如说,你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作. 如果此时需要一个耗时的操作,例如:联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象,如果5秒钟还没有完成的话,会收

Android基础入门教程——2.5.2 Notification(状态栏通知)详解

Android基础入门教程--2.5.2 Notification(状态栏通知)详解 标签(空格分隔): Android基础入门教程 本节引言: 本节带来的是Android中用于在状态栏显示通知信息的控件:Notification,相信大部分 学Android都对他都很熟悉,而网上很多关于Notification的使用教程都是基于2.x的,而 现在普遍的Android设备基本都在4.x以上,甚至是5.0以上的都有:他们各自的Notification 都是不一样的!而本节给大家讲解的是基于4.x以

Android基础入门教程——4.2.2 Service进阶

Android基础入门教程--4.2.2 Service进阶 标签(空格分隔): Android基础入门教程 本节引言 上节我们学习了Service的生命周期,以及两种启动Service的两种方法, 本节继续来深入了解Service中的IntentService,Service的使用实例: 前台服务与轮询的实现! 1.IntentService的使用 在上一节后我们已经知道了如何去定义和启动Service,但是如果我们直接把 耗时线程放到Service中的onStart()方法中,虽然可以这样做

Android 面试题总结之Android 基础(一)

Android 面试题总结之Android 基础(一) 转眼间毕业好久了,写程序也很久了,从高中就一直写到现在好多年了啊,学习了很多东西,把之前整理的资料和知识点慢慢分享出来.这里主要总结Android可能出的面试的题目比较全面\详细,持久更新,也欢迎大家补充,纠正,批评. Android四大组件简介 请简要介绍Android的四大组件. 答案:Android系统有四种组件,这四种组件构成了Android应用的框架,然后由Intent联系这四种组件. Activity用来显示Android的程序

Android 面试题总结之Android 基础(二)

Android 面试题总结之Android 基础ContentProvider(二) 在上一章节Android 面试题总结之Android 基础Activity(一) 我们讲的Activity基础知识.有许多朋友反映看着比较乱,我又回去看了看 ,确实很乱,不够细心.然后我又重新整理了一遍.让大家阅读体验更好! 在阅读过程中有任何问题,请及时联系. 本章系<Android 之美 从0到1 – 高手之路>Android基础ContentProvider 总结了Android 开发者面试比较常见的C

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧