1、Android中广播分为静态注册和动态注册

2、下面是一个简单静态注册的例子

  • 创建一个继承BroadcastReceiver的子类
public class DeviceBootReceiver extends BroadcastReceiver {

    private static final String TAG = DeviceBootReceiver.class.getName();

    @Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "开机了:" + intent.getAction());
}
}

该类的功能用于接收手机开机的广播。

  • AndroidManifest.xml中注册该组件
<receiver android:name=".DeviceBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

action标签中的值用于匹配广播的类型,这里是开机广播。

这样当手机开机时,便会收到来自系统的消息。

同样,我们也可以监听应用安装,应用卸装,USB插拔等系统广播。只是action的值稍有不同。

<receiver android:name=".OtherStateReceiver">
<intent-filter>
<!--电量过低-->
<action android:name="android.intent.action.BATTERY_LOW" />
<!--USB连接-->
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<!--USB断开-->
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
<!--软件包安装-->
<action android:name="android.intent.action.PACKAGE_ADDED" />
<!--软件包卸装-->
<action android:name="android.intent.action.PACKAGE_REMOVED" />
</intent-filter>
</receiver>

上面除了开机广播,其他广播这样注册能成功的前提是 API Level < 26(Android8.0以下)

。Google为了防止接收者程序常驻内存消耗资源,禁止了一些Manifest declared receiver。我们想要继续监听,就要使用动态注册的方式。

3、下面是一个动态注册的例子:

public class SystemBroadcastReceiverActivity extends AppCompatActivity {

    private SystemBroadcastReceiver receiver;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_system_broadcast_receiver); IntentFilter filter = new IntentFilter();
//USB连接
filter.addAction(Intent.ACTION_POWER_CONNECTED);
//USB断开
filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
receiver = new SystemBroadcastReceiver();
registerReceiver(receiver, filter);
} private class SystemBroadcastReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
System.out.println(intent.getAction());
}
} @Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}

然后在AndroidManifest.xml注册该Activity即可。

4、自定义广播

前面说的都是接收系统广播,我们也可以发送自定义的广播,然后在同一个应用或不同应用中接收。

下面是一个静态注册的自定义广播:
  • 建立一个Activity,提供一个Button,点击后发送广播
public class CustomSenderActivity extends AppCompatActivity {

    public static final String BROADCAST_ACTION = "com.hncj.android.manifest.CustomSenderActivity";
public static final String BROADCAST_CONTENT = "broadcast_content"; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_sender);
} @SuppressLint("WrongConstant")
public void sendBroadcast(View view) {
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
intent.putExtra(BROADCAST_CONTENT, "我发送了广播,你看收没收到?"); //解决API26及以上的Android静态注册的Receiver收不到广播
//第一种解决方案:设置标志 Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
intent.addFlags(0x01000000); //不论是一个应用自己发自己收还是一个应用发一个应用收,都可以实现效果 //第二种解决方案:指定包名(这里是一个应用,自己发,自己收,都在一个包下)
//intent.setPackage(getPackageName()); //如果是给另一个应用发广播 则写成intent.setPackage("另一个项目应用接收者的包名"); //第三种解决方案: 明确指定包名,类名
//intent.setComponent(new ComponentName(this, CustomReceiver.class)); //如果是给另一个应用发广播 则写成 intent.setComponent(new ComponentName("另一个应用接收者包名", "另一个应用接收者类名")); //发送广播
sendBroadcast(intent);
}
}
  • 布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="40dp"> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="sendBroadcast"
android:background="#008080"
android:textSize="30dp"
android:text="发送广播"></Button>
</LinearLayout>
  • 接收者
public class CustomReceiver extends BroadcastReceiver {

    private static final String TAG = CustomReceiver.class.getName();

    @Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d(TAG, "我收到了来自" + action + "的广播");
}
}
  • AndroidManifest.xml文件
<activity android:name=".manifest.CustomSenderActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <receiver android:name=".manifest.CustomReceiver">
<intent-filter>
<action android:name="com.hncj.android.manifest.CustomSenderActivity" />
</intent-filter>
</receiver>

这里的一个接收者是在当前项目,还有一个接收者在另一个项目,代码基本是一致的。

相关的API:

发送有序广播:

<!--广播中携带数据-->
Bundle bundle = new Bundle();
bundle.putString("username", "nacy");
sendOrderedBroadcast(intent, null, null, null, Activity.RESULT_OK, null, bundle);

为接收者设置优先级:(-1000-1000),即定义哪个接收者先收到,优先级越大,越早收到广播

<receiver android:name=".manifest.CustomReceiver">
<!--priority可以设置优先级-->
<intent-filter android:priority="9">
<action android:name="com.hncj.android.manifest.CustomSenderActivity" />
</intent-filter>
</receiver>

终止广播:

<!--广播不再向下传递-->
abortBroadcast();

取出广播中的数据:

//取出Bundle对象,类似于一个map
Bundle bundle = getResultExtras(true);

设置接收者权限:(谁能收到)

  • 先在发送方AndroidManifest.xml中声明一个权限(包名+权限名)
<permission android:name="com.hncj.android.RECEIVER_PERMISSION" />
  • 发送时定义接收者需要拥有的权限:
sendOrderedBroadcast(intent, Manifest.permission.RECEIVER_PERMISSION, null, null, Activity.RESULT_OK, null, bundle);
  • 接收者需要在AndroidManifest.xml使用权限:
<uses-permission android:name="com.hncj.android.RECEIVER_PERMISSION" />

设置发送者权限:(谁能给我发)

  • 先在接收方AndroidManifest.xml声明一个权限
<permission android:name="com.hncj.android.SENDER_PERMISSION" />
  • 在Receiver标签中说明发送者要拥有的权限:
<receiver android:name=".manifest.CustomReceiver" android:permission="com.hncj.android.SENDER_PERMISSION">
<intent-filter android:priority="9">
<action android:name="com.hncj.android.manifest.CustomSenderActivity" />
</intent-filter>
</receiver>
  • 在发送方AndroidManifest.xml中使用权限
<uses-permission android:name="com.hncj.android.SENDER_PERMISSION" />

还有动态注册的自定义广播,与上面提到的动态注册的例子差不多,只是自定义action的内容。

Android中BroadcastReceiver的使用的更多相关文章

  1. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  2. Android中BroadcastReceiver广播

    BroadCastReceiver 简介 广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用 Context.sendBroadca ...

  3. Android中BroadcastReceiver组件具体解释

    Android系统的4个组件最终还剩一种组件了BroadcastReceiver,这个组件是全局监听器,能够监听系统全局的广播消息,能够方便的实现系统中不同组件之间的通信 BroadcastRecei ...

  4. android中broadcastreceiver的用法-代码中注册

    界面如下:     问题1:点击“解绑广播接收器“后再次点击”解绑广播接收器“后,程序崩溃,log信息如下: 08-04 05:04:35.420: E/AndroidRuntime(5521): F ...

  5. android中broadcastreceiver的用法-manifest中注册。

    package com.jinhoward.broadcast.activity; import com.jinhoward.broadcast.activity.R; import android. ...

  6. (转)Android 中LocalBroadcastManager的使用方式

    发表于2个月前(2014-11-03 22:05)   阅读(37) | 评论(0) 0人收藏此文章, 我要收藏 赞0 1月10日 #长沙# OSC 源创会第32期开始报名 摘要 android中广播 ...

  7. Android 中的BroadCastReceiver

    BroadCastReceiver 简介 (末尾有源码) BroadCastReceiver 源码位于: framework/base/core/java/android.content.Broadc ...

  8. Android笔记(二十六) Android中的广播——BroadcastReceiver

    为了方便进行系统级别的消息通知,Android有一套类似广播的消息机制,每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能是来自于系统,也可能是来自于 ...

  9. Android中创建一个BroadcastReceiver

    首先创建一个java类继承BroadcastReceiver类 package com.example.service; import android.content.BroadcastReceive ...

随机推荐

  1. Java工作笔记:工作中使用JNA调用C++库的一些细节(转载)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/zjutzmh/article/detai ...

  2. java 获取String中的数字

    随便给你一个含有数字的字符串,比如: String s="eert343dfg56756dtry66fggg89dfgf"; 那我们如何把其中的数字提取出来呢?大致有以下几种方法, ...

  3. HTML5 地理位置定位API(1)

    地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用.今天这篇文章向大家介绍一下 HTML5 地理位置定位的基本原理及各个 ...

  4. 123457123456#0#-----com.yuming.HitMouse01--前拼后广--幼儿打地鼠游戏

    com.yuming.HitMouse01--前拼后广--幼儿打地鼠游戏

  5. JQuery.BlockUI使用方法举例

    JQuery.BlockUI是众多JQuery插件弹出层中的一个,它小巧(原版16k,压缩后10左右),容易使用, 功能齐全,支持Iframe,支持Modal,可定制性高也意味他默认谦虚的外表. jQ ...

  6. SQL Server 2008 R2如何使用正则表达式搜索

    正则表达式是简明而灵活的表示法,用于查找和替换各种模式的文本.在 SQL Server Management Studio 的“查找和替换”对话框中的“查找内容”字段中,可以使用一组特定的正则表达式. ...

  7. Docker 镜像的内部结构(四)

    目录 一.base镜像 1.rootfs 2.base 镜像提供的是最小安装的 Linux 发行版. 3.支持运行多种 Linux OS 二.镜像的分层结构 可写的容器层 一.base镜像 base ...

  8. Leetcode之148. Sort List Medium

    https://leetcode.com/problems/sort-list/ Sort a linked list in O(n log n) time using constant space ...

  9. 在搭建Hadoop集群环境时遇到的一些问题

    最近在学习搭建hadoop集群环境,在搭建的过程中遇到很多问题,在这里做一些记录.1. SSH相关的问题 问题一: ssh: connect to host localhost port 22: Co ...

  10. 《ucore lab1 exercise1》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:理解通过make生成执行文件的过程 列出本实验各练习中对应的OS原理的知识点,并说明本实验中的实现部分如何对应和体现了原理中的基本概念和关 ...