Android开发基础--Broadcast

本文详细介绍了Android广播的种类和使用,包括普通广播、系统广播、有序广播、粘性广播和App应用内广播。讲解了如何注册、发送广播,以及有序广播中的优先级设置和数据传递。重点阐述了不同广播的特点和应用场景,强调了应用内广播的安全性和效率优势。

广播简介

Android 应用与 Android 系统和其他 Android 应用之间可以相互收发广播消息,这与发布-订阅设计模式相似。这些广播会在所关注的事件发生时发送。举例来说,Android 系统会在发生各种系统事件时发送广播,例如系统启动或设备开始充电时。再比如,应用可以发送自定义广播来通知其他应用它们可能感兴趣的事件(例如,一些新数据已下载)。

应用可以注册接收特定的广播。广播发出后,系统会自动将广播传送给同意接收这种广播的应用。

一般来说,广播可作为跨应用和普通用户流之外的消息传递系统。但是,您必须小心,不要滥用在后台响应广播和运行作业的机会,因为这会导致系统变慢,具体如以下视频所述。

广播总共分为以下几类:

  • 普通广播(Normal Broadcast)
  • 系统广播(System Broadcast)
  • 有序广播(Ordered Broadcast)
  • 粘性广播(Sticky Broadcast)
  • App应用内广播(Local Broadcast)

普通广播(Normal Broadcast)

最常用的广播形式,即开发者自身定义intent的广播。

使用步骤:

  1. 自定义一个广播接收者。
  2. 注册广播
  3. 发送广播

静态注册

1.创建一个BroadcastReceiver类

package com.example.testapp.receiver;

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

import com.example.testapp.constant.TestConstant;

public class TestBroadcastReceiver extends BroadcastReceiver {

    private static final String TAG = "TestBroadcastReceiver";

    public TestBroadcastReceiver() {
        super();
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        //判断接收广播的名,TestConstant.ACTION_TEST_BROADCAST是自定义广播的字符串
        if(intent.getAction().equals(TestConstant.ACTION_TEST_BROADCAST)) {
            Log.i(TAG, "received broadcast in TestBroadcastReceiver");
        }
    }
}

2.在AndroidManifest文件中声明广播接收器
并在intent-filter中静态注册广播

<receiver android:name=".receiver.TestBroadcastReceiver">
    <intent-filter>
        <action android:name="com.example.testapp.testbroadcast"/>
    </intent-filter>
</receiver>

动态注册

(代码为在Service中动态注册广播)

1.创建BroadcastReceiver对象

public class Receiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(TestConstant.ACTION_TEST_BROADCAST)) {
            Log.i(TAG, "received broadcast in service.");
        }
    }
}

在Service中接收广播,首先要创建BroadcastReceiver对象;其次,一般在 onCreate() 方法中使用Context.registerReceiver(receiver, filter)进行动态注册如下

@Override
public void onCreate() {
    super.onCreate();
    receiver = new Receiver();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(TestConstant.ACTION_TEST_BROADCAST);
    registerReceiver(receiver,intentFilter);
}

发送广播

广播消息本身会被封装在一个 Intent 对象中,然后调用 context.sentBroadcast(intent) 发送广播

private void testSendBroadcast() {
    Log.i(TAG, "testSendBroadcast: ");
    Intent intent = new Intent();
    intent.setAction(TestConstant.ACTION_TEST_BROADCAST);
    this.sendBroadcast(intent);
}

系统广播(System Broadcast)

系统会在发生各种系统事件时自动发送广播,例如当系统进入和退出飞行模式时。系统广播会被发送给所有同意接收相关事件的应用。
有关系统广播操作的完整列表,请参阅 Android SDK 中的 BROADCAST_ACTIONS.TXT 文件。每个广播操作都有一个与之关联的常量字段。例如,常量 ACTION_AIRPLANE_MODE_CHANGED 的值为 android.intent.action.AIRPLANE_MODE。每个广播操作的文档都可以在关联的常量字段中找到。

有序广播(Ordered Broadcast)

sendOrderedBroadcast(Intent, String) 方法一次向一个接收器发送广播。当接收器逐个顺序执行时,接收器可以向下传递结果,也可以完全中止广播,使其不再传递给其他接收器。接收器的运行顺序可以通过匹配的 intent-filter 的 android:priority 属性来控制;具有相同优先级的接收器将按随机顺序运行,数越大优先级别越高,取值范围:-1000~1000。

优先级的设置

1.AndroidManifest中设置的优先级

<receiver android:name=".receiver.TestBroadcastReceiver">
    <intent-filter android:priority="100">
        <action android:name="com.example.testapp.testbroadcast" />
    </intent-filter>
</receiver>

2.动态设置IntentFilter的优先级

intentFilter.setPriority(200);

接收广播并向下传递数据的方法

Prority为200和100两个优先级的IntentFilter

高优先级部分(prority:200),bundle为向下传递的数据:

public class Receiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(TestConstant.ACTION_TEST_BROADCAST)) {
            Log.i(TAG, "received broadcast in service.");
            Bundle bundle = new Bundle();
            bundle.putString(TestConstant.KEY_TEST_BROADCAST_DATA,"reSend order broadcast in testService.");
            setResultExtras(bundle);           }
    }
}

低优先级接收部分:

@Override
public void onReceive(Context context, Intent intent) {
    //判断接收广播的名,TestConstant.ACTION_TEST_BROADCAST是自定义广播的字符串
    if(intent.getAction().equals(TestConstant.ACTION_TEST_BROADCAST)) {
        Bundle bundle  = getResultExtras(true);
        Log.i(TAG, "onReceive: " + bundle.getString(TestConstant.KEY_TEST_BROADCAST_DATA));
    }
}

发送有序广播

this.sendOrderedBroadcast(intent, null);

中止有序广播不再向下传递

this.abortBroadcast();

粘性广播(Sticky Broadcast)

粘性消息在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态,粘性广播的Receiver如果被销毁,那么下次重建时会自动接收到消息数据。

App应用内广播(Local Broadcast)

摘自:https://blog.csdn.net/carson_ho/article/details/53160580

  1. App应用内广播可理解为一种局部广播,广播的发送者和接收者都同属于一个App。
  2. 相比于全局广播(普通广播),App应用内广播优势体现在:安全性高 & 效率高

使用方法:

  1. 注册广播时将exported属性设置为false,使得非本App内部发出的此广播不被接收;
  2. 在广播发送和接收时,增设相应权限permission,用于权限验证;
  3. 发送广播时指定该广播接收器所在的包名,此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中。

具体使用:

使用封装好的LocalBroadcastManager类,使用方式上与全局广播几乎相同,只是注册/取消注册广播接收器和发送广播时将参数的context变成了LocalBroadcastManager的单一实例

**注:**对于LocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager动态注册,不能静态注册

//注册应用内广播接收器
//步骤1:实例化BroadcastReceiver子类 & IntentFilter mBroadcastReceiver 
mBroadcastReceiver = new mBroadcastReceiver(); 
IntentFilter intentFilter = new IntentFilter(); 

//步骤2:实例化LocalBroadcastManager的实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);

//步骤3:设置接收广播的类型 
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

//步骤4:调用LocalBroadcastManager单一实例的registerReceiver()方法进行动态注册 
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);

//取消注册应用内广播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);

//发送应用内广播
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
localBroadcastManager.sendBroadcast(intent);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值