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. SQL-W3School-函数:SQL NOW() 函数

    ylbtech-SQL-W3School-函数:SQL NOW() 函数 1.返回顶部 1. NOW() 函数 NOW 函数返回当前的日期和时间. 提示:如果您在使用 Sql Server 数据库,请 ...

  2. ISO/IEC 9899:2011 条款5——5.2.2 字符显示语义

    5.2.2 字符显示语义 1.活动位置是在一个显示设备上的位置,由fputc函数所输出的下一个字符会出现在那个位置上.写一个打印字符(由isprint函数)到显示设备的意图是为了在活动位置上显示那字符 ...

  3. removeEntry

    void VCGantt::removeEntry() { QModelIndexList selectedIndexes = ganttViewCommon->selectionModel() ...

  4. 17flutter中的路由/命名路由/命名路由传值/无状态组件传值/有状态组件传值。

    main.dart import 'package:flutter/material.dart'; import 'package:flutter_demo/pages/Search.dart'; i ...

  5. Qwidget::update

    void QWidget::update ()分析重绘事件激活 1看看手册中这段话 void QWidget::update () [slot] Updates the widget unless u ...

  6. Mysql安装、查看密码、修改密码、初始化、修改字符类型

    安装mysql 参照python篇一键安装lnmp.安装完之后再按照下面修改密码,修改配置文件,否则安装的时候就修改配置文件会出错. 注意:这也是二进制安装mysql.另一种二进制安装容易出错,生产环 ...

  7. mysql正则替换某个字段值里面的某个字符串

    sql语句如下: UPDATE `ccvms_video` SET title=REPLACE(title, "最", "相对") WHERE title LI ...

  8. laravel服务提供者类说明

    IoC 是将内部设计的类交给系统去控制,但是有些类在初始化的时候,需要制定特定的参数,或者当你需要将实现类绑定到某个接口,这时候就必须对这些依赖进行配置,系统才能正确解析并引用. register 而 ...

  9. 【ARM-Linux开发】使用QT和Gstreanmer 遇到的一些问题

    1.如果出现错误,可能是在安装UCT PCRF时,相关组件不全,略举两个碰到的错误. 1)curl/curl.h:No such file or directory --可能原因是libcurl及相关 ...

  10. springboot与redis

    该项目已上传至GitHub:https://github.com/xiaostudy/springboot_redis 用到的框架技术有:springboot.mybatis.shiro.redis ...