广播

发送一条广播,可以被不同的广播接收者所接收,广播接收者收到广播之后,再进行逻辑处理。

广播与活动的区别

(1)活动只能一对一通信;而广播可以一对多,一人发送广播,多人接收处理。

(2)对于发送方来说,广播不需要考虑接收方有没有在工作,接收方在工作就接收广播,不在工作就丢 弃广播。

(3)对于接收方来说,因为可能会收到各式各样的广播,所以接收方要自行过滤符合条件的广播,之后 再解包处理。

广播当中三个方法

  1. sendBroadcast:发送广播。

  2. registerReceiver:注册广播的接收器,可在onStart或onResume方法中注册接收器。

  3. unregisterReceiver:注销广播的接收器,可在onStop或onDestroy方法中注销接收器。

广播的收发过程

  1. 发送标准广播

  2. 定义广播接收器

  3. 开关广播接收器

收发标准广播

  1. 先创建意图对象,再调用sendBroadcast方法发送广播

  2. 广播发出来之后,还得有设备去接收广播,也就是需要广播接收器。接收器主要规定两个事情,一个是 接收什么样的广播,另一个是收到广播以后要做什么。由于接收器的处理逻辑大同小异,因此Android 提供了抽象之后的接收器基类BroadcastReceiver,开发者自定义的接收器都从BroadcastReceiver派生 而来。新定义的接收器需要重写onReceive方法,方法内部先判断当前广播是否符合待接收的广播名 称,校验通过再开展后续的业务逻辑

  3. 通过意图过滤器挑选动作名称一致的广播

收发标准广播是无序的广播

主程序实现

package com.kcs.broadcast;import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;import androidx.appcompat.app.AppCompatActivity;import com.kcs.broadcast.receiver.StandardReceiver;public class BroadcastStrandActivity extends AppCompatActivity implements View.OnClickListener {private StandardReceiver standardReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_broadcast_strand);findViewById(R.id.send_standbroad).setOnClickListener(this);}@Overridepublic void onClick(View v) {//发送标准广播Intent intent = new Intent(StandardReceiver.STANDARD_ACTION);sendBroadcast(intent);}@Overrideprotected void onStart() {super.onStart();standardReceiver = new StandardReceiver();//创建意图过滤器,处理STANDARD_ACTION的广播IntentFilter filter = new IntentFilter(StandardReceiver.STANDARD_ACTION);registerReceiver(standardReceiver,filter);}@Overrideprotected void onStop() {super.onStop();//注销接收器unregisterReceiver(standardReceiver);}
}

接受者

package com.kcs.broadcast.receiver;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;/*** @author Kcs*/
public class StandardReceiver extends BroadcastReceiver {public static final String STANDARD_ACTION = "com.kcs.broadcast.standard";/*** 接收到标准广播,触发onReceiver方法* @param context* @param intent*/@Overridepublic void onReceive(Context context, Intent intent) {if (intent != null && intent.getAction().equals(STANDARD_ACTION)){Log.d("kong","收到广播!!");}}
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="10dp"><Buttonandroid:id="@+id/send_standbroad"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="发送标准广播"android:textColor="@color/black"android:textSize="20dp"/></LinearLayout>

收发有序广播

(1)一个广播存在多个接收器,这些接收器需要排队收听广播,这意味着该广播是条有序广播。(2)先收到广播的接收器A,既可以让其他接收器继续收听广播,也可以中断广播不让其他接收器收听。

  • 优先级,级别越大,数字越大

  • 优先级大截断了优先级小的广播

以震动为例

主程序

package com.kcs.broadcast;import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;import androidx.appcompat.app.AppCompatActivity;import com.kcs.broadcast.receiver.OrderReceiver;
import com.kcs.broadcast.receiver.OrderReceiverB;public class BroadOrderActivity extends AppCompatActivity implements View.OnClickListener {public static final String ORDER_ACTION = "com.kcs.broadcast.order";private OrderReceiver orderReceiverA;private OrderReceiverB orderReceiverB;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_broad_order);findViewById(R.id.send_orderbroad).setOnClickListener(this);}@Overridepublic void onClick(View v) {//动作意图Intent intent = new Intent(ORDER_ACTION);sendOrderedBroadcast(intent,null);}/*** 处理广播规则*  1. 优先级越大的接收器,越早收到有序广播*  2. 优先级相同,越早注册的接收器越早收到有序广播*/@Overrideprotected void onStart() {super.onStart();orderReceiverA = new OrderReceiver();//创建意图过滤器,处理STANDARD_ACTION的广播IntentFilter filterA = new IntentFilter(ORDER_ACTION);//设置优先级filterA.setPriority(8);registerReceiver(orderReceiverA,filterA);orderReceiverB = new OrderReceiverB();//创建意图过滤器,处理STANDARD_ACTION的广播IntentFilter filterB = new IntentFilter(ORDER_ACTION);//设置优先级filterB.setPriority(10);//因为B的优先级比A的高,优先收到广播registerReceiver(orderReceiverB,filterB);}@Overrideprotected void onStop() {super.onStop();//注销接收器unregisterReceiver(orderReceiverA);unregisterReceiver(orderReceiverB);}
}

接收方

两个接收者, 来比较优先级,下面的优先级是B的比A大,所以A被拦截了,没有接收到广播

package com.kcs.broadcast.receiver;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;import com.kcs.broadcast.BroadOrderActivity;/*** @author Kcs*/
public class OrderReceiverB extends BroadcastReceiver {/*** 接收到有序广播,触发onReceiver方法* @param context* @param intent*/@Overridepublic void onReceive(Context context, Intent intent) {if (intent != null && intent.getAction().equals(BroadOrderActivity.ORDER_ACTION)){Log.d("kong","B===》收到广播!!");abortBroadcast();//中断广播,比B低的接收器就无法接收到信息}}
}
package com.kcs.broadcast.receiver;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;import com.kcs.broadcast.BroadOrderActivity;/*** @author Kcs*/
public class OrderReceiver extends BroadcastReceiver {/*** 接收到有序广播,触发onReceiver方法* @param context* @param intent*/@Overridepublic void onReceive(Context context, Intent intent) {if (intent != null && intent.getAction().equals(BroadOrderActivity.ORDER_ACTION)){Log.d("kong","A===》收到广播!!");}}
}

布局文件和上面的收发标准的一样,只需修改id和文本

等级相同情况下,先注册先接收,这里是A先注册,B后注册

被拦截的效果:

收发静态广播

  • 在代码中注册接收器,该方式被称作动态注册

  • 在AndroidManifest.xml中注册接收器,该方式被称作静态注册

主程序

package com.kcs.broadcast;import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;import androidx.appcompat.app.AppCompatActivity;import com.kcs.broadcast.receiver.ShakeReceiver;public class BroadStaticActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_broad_static);findViewById(R.id.send_shake_broad).setOnClickListener(this);}@Overridepublic void onClick(View v) {String fullName = "com.kcs.broadcast.receiver.ShakeReceiver";Intent intent = new Intent(ShakeReceiver.SHOCK_ACTION);ComponentName componentName = new ComponentName(this, fullName);intent.setComponent(componentName);sendBroadcast(intent);}
}

接收者

package com.kcs.broadcast.receiver;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Vibrator;
import android.util.Log;public class ShakeReceiver extends BroadcastReceiver {public static final String SHOCK_ACTION = "com.kcs.broadcast.shake";@Overridepublic void onReceive(Context context, Intent intent) {if (intent!= null && intent.getAction().equals(SHOCK_ACTION)){Log.d("kong","震动ing");Vibrator vb = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);// 震动 1svb.vibrate(1000);}}
}

布局文件和上面的收发标准广播布局的一样,只需修改id和文本

启动类配置权限

    <!-- 震动系统权限 --><uses-permission android:name="android.permission.VIBRATE" /><receiverandroid:name=".receiver.ShakeReceiver"android:exported="true"><intent-filter><action android:name="com.kcs.broadcast.shake" /></intent-filter></receiver>

模拟震动

定时管理器 AlarmManager

系统闹钟定时发送广播,常见的方法:

  • set:设置一次性定时器。

  • setAndAllowWhileIdle:设置一次性定时器,即使设备处于空闲状态,也会保证执行定时器。

  • setRepeating:设置重复定时器,但系统不保证按时发送广播。

  • cancel:取消指定延迟意图的定时器。

延迟意图

定时管理器使用了PendingIntent,它与Intent之间的差异主要有下列三点:

  1. PendingIntent代表延迟的意图,它指向的组件不会马上激活;而Intent代表实时的意图,它指 向的组件会马上激活。

  2. PendingIntent是一类消息的组合,不但包含目标的Intent对象,还包含请求代码、请求方式等 信息。

  3. PendingIntent对象在创建之时便已知晓将要用于活动还是广播

主程序

一分钟广播一次

package com.kcs.broadcast;import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;import androidx.appcompat.app.AppCompatActivity;import com.kcs.broadcast.receiver.AlarmReceiver;public class AlarmActivity extends AppCompatActivity implements View.OnClickListener {private AlarmReceiver alarmReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_alarm);findViewById(R.id.btn_alarm).setOnClickListener(this);}@Overridepublic void onClick(View v) {alarmReceiver.sendAlarm();}@Overrideprotected void onStart() {super.onStart();alarmReceiver = new AlarmReceiver(getApplicationContext());IntentFilter filter = new IntentFilter(AlarmReceiver.ALARM_ACTION);registerReceiver(alarmReceiver, filter);}@Overrideprotected void onStop() {super.onStop();unregisterReceiver(alarmReceiver);}
}

Alarm Receiver

package com.kcs.broadcast;import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;import androidx.appcompat.app.AppCompatActivity;import com.kcs.broadcast.receiver.AlarmReceiver;public class AlarmActivity extends AppCompatActivity implements View.OnClickListener {private AlarmReceiver alarmReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_alarm);findViewById(R.id.btn_alarm).setOnClickListener(this);}@Overridepublic void onClick(View v) {alarmReceiver.sendAlarm();}@Overrideprotected void onStart() {super.onStart();alarmReceiver = new AlarmReceiver(getApplicationContext());IntentFilter filter = new IntentFilter(AlarmReceiver.ALARM_ACTION);registerReceiver(alarmReceiver, filter);}@Overrideprotected void onStop() {super.onStop();unregisterReceiver(alarmReceiver);}
}

布局文件和上面的收发标准广播布局的一样,只需修改id和文本

开启画中画

回到桌面与切到任务列表

  • 按下主页键会回到桌面,按下任务键会打开任务列表,这两个操作并未提供相应的按键处理方法,而是通过广播发出事件信息。

  • 若想知晓是否回到桌面,以及是否打开任务列表,均需收听系统广播Intent.ACTION_CL OSE_SYSTEM_DIALOGS。

  • 从收到的广播意图中获取原因reason字段,该字段值为homekey时表示回到桌面,值为r ecentapps时表示打开任务列表

应用的画中画

  • 监听回到桌面与打开任务列表的广播;

  • 收到广播之后,调用 enterPictureInPictureMode 方法进入画中画模式;

  • 重写活动页面的 onPictureInPictureModeChanged 方法,补充进入画中画模式或退出

主程序

package com.kcs.broadcast;import android.app.PictureInPictureParams;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.util.Rational;import androidx.appcompat.app.AppCompatActivity;public class RetruenDesktopActivity extends AppCompatActivity {private DesktopRecevier desktopRecevier;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_retruen_desktop);//创建广播接收器desktopRecevier = new DesktopRecevier();IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);registerReceiver(desktopRecevier,intentFilter);}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(desktopRecevier);}@Overridepublic void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);if (isInPictureInPictureMode){Log.d("kong","进入画中画");}else{Log.d("kong","退出画中画");}}/*** 创建广播接收者*/private class DesktopRecevier extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent != null && intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {String reason = intent.getStringExtra("reason");if (!TextUtils.isEmpty(reason) && (reason.equals("homekey") || reason.equals("recentapps"))) {//8.0以后才有画中画if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !isInPictureInPictureMode()){// 创建画中画参数构造器PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder();//设置宽高比例Rational rational = new Rational(10, 5);builder.setAspectRatio(rational);//进入画中画enterPictureInPictureMode(builder.build());}}}}}}

启动配置

android:supportsPictureInPicture="true"

Android -- 广播相关推荐

  1. Android 广播的生命周期

    一:Android 广播的生命周期          一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg).当一 ...

  2. android广播接收器

    Android程序创建广播接收器继承BroadcastReceiver Android广播接收器需要在AndroidManifest.xml文件中声明: <recevie android:nam ...

  3. Android广播机制:Broadcast

    转载:Android总结篇系列:Android广播机制 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广 ...

  4. Android广播接实现电话的监听(电话的状态,拦截)

    Android广播接实现电话的监听 1:需要在AndroidManifest.xml清单中添加权限 <uses-permission android:name="android.per ...

  5. 图解 Android 广播机制

    从现实生活中理解广播机制 一听到广播我们第一感觉就会联想到小时候村里面的广播,每逢村里有什么活动都是通过广播发送的.收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同. ...

  6. android 广播观察者,作业三——观察者模式在Android广播机制上的应用

    观察者模式在Android广播机制上的应用 点击跳转项目git地址:https://github.com/Arfer-ustc/practice-Android.git 一.观察者模式在Android ...

  7. Android——广播

    广播 广播(Broadcast)作为Android四大组件之一,重要性不言而喻. 什么是Android广播 系统运行时,会产生很多事件(比如:电量改变, 收发短信, 拨打电话, 屏幕解锁),那么某些事 ...

  8. Android 广播(Broadcast)

    Android 广播Broadcast 1.小声嘀咕 2.广播机制简介 3.接收系统广播 3.1动态注册 3.2静态注册 4.发送自定义广播 4.1标准广播 4.2有序广播 5.使用本地广播 1.小声 ...

  9. Android——广播(BroadcastReceiver)

    1. 简介 BroadcastReceiver (广播接收器),属于Android四大组件之一 Android 广播分为两个角色:广播发送者.广播接收者 用于监听 / 接收 应用发出的广播消息,并做出 ...

  10. Android广播(Broadcast)

    Android广播(Broadcast) 一.Broadcast简介 Broadcast是android中的四大组件之一,是在组件之间传播数据(Intent)的一种机制.广播的发送者和接收者事先是不需 ...

最新文章

  1. AngularJs学习笔记(3)--$scope中的$apply和$digest方法
  2. 【ZZ】IPv4与IPv6
  3. 68.connect-flash 用法详解 req,flash()
  4. 【Visual C++】一些开发心得与调试技巧
  5. boost::hana::fill用法的测试程序
  6. 2013年网络安全事件盘点
  7. C排序算法:(二)冒泡排序
  8. 《Java线程池》:任务拒绝策略
  9. kettle-查询控件
  10. python之---Python深入06 Python的内存管理
  11. 七夕怕被偷窥?摄像头探测器来帮您!
  12. jasperReports导出PDF字体加粗等样式失效问题
  13. 两个实用的C语言工具———编程学习必备篇
  14. vbs整人小脚本(搞笑)
  15. java判断是否是自然数_java判断输入的是否是自然数
  16. Elasticsearch学习之的delimited_payloads使用
  17. 51Nod 2075 图书管理员 c/c++题解
  18. autojs零散知识点-循环找图
  19. 中国农场可变利率技术(VRT)行业市场供需与战略研究报告
  20. 技术开发项目收获了什么_鸡西拼拼优米是什么模式

热门文章

  1. ie 无人操作自动关闭_为什么一打开IE浏览器就自动关闭解决办法 IE浏览器打开后马上自动关闭了如何办...
  2. 爱奇艺财报电话会议实录:第三季度可能还无法实现盈利
  3. 介绍一个牛逼的Github项目
  4. 高级Android开发进阶之路,你需要掌握的几个关键技术!
  5. 1807520-99-5,DNP-PEG4-alcohol含有二硝基苯和羟基的PEG连接剂
  6. 柳州汇商大湾区双招双引 谋定·大健康医药:李喜贵被聘顾问
  7. [日常训练] 联络网
  8. 【好数推荐】数据堂平均音色语音库
  9. Masking Layer的作用
  10. 全闪存存储的服务器虚拟化场景应用