Android 全局大喇叭——详解广播机制

  • 一、广播机制简介
    • 1. 标准广播(Normal broadcasts)
    • 2. 有序广播(Ordered broadcasts)
  • 二、接收系统广播
    • 1. 动态注册监听网络变化
    • 2. 静态注册实现开机启动提示
  • 三、发送自定义广播
    • 1. 发送标准广播
    • 2. 发送有序广播
  • 四、使用本地广播

一、广播机制简介

安卓的每个程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接受到自己所关心的广播内容,这些广播可以来自系统,也可以来自其他应用程序。Android提供了一套完整的API来允许应用自由地接受和发送广播。

我们先来简单的介绍一下广播的两种类型:标准广播和有序广播。

1. 标准广播(Normal broadcasts)

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

它的流程图如下图所示:

#mermaid-svg-xQ5jka7uzbtCcemT .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-xQ5jka7uzbtCcemT .label text{fill:#333}#mermaid-svg-xQ5jka7uzbtCcemT .node rect,#mermaid-svg-xQ5jka7uzbtCcemT .node circle,#mermaid-svg-xQ5jka7uzbtCcemT .node ellipse,#mermaid-svg-xQ5jka7uzbtCcemT .node polygon,#mermaid-svg-xQ5jka7uzbtCcemT .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-xQ5jka7uzbtCcemT .node .label{text-align:center;fill:#333}#mermaid-svg-xQ5jka7uzbtCcemT .node.clickable{cursor:pointer}#mermaid-svg-xQ5jka7uzbtCcemT .arrowheadPath{fill:#333}#mermaid-svg-xQ5jka7uzbtCcemT .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-xQ5jka7uzbtCcemT .flowchart-link{stroke:#333;fill:none}#mermaid-svg-xQ5jka7uzbtCcemT .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-xQ5jka7uzbtCcemT .edgeLabel rect{opacity:0.9}#mermaid-svg-xQ5jka7uzbtCcemT .edgeLabel span{color:#333}#mermaid-svg-xQ5jka7uzbtCcemT .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-xQ5jka7uzbtCcemT .cluster text{fill:#333}#mermaid-svg-xQ5jka7uzbtCcemT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-xQ5jka7uzbtCcemT .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-xQ5jka7uzbtCcemT text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-xQ5jka7uzbtCcemT .actor-line{stroke:grey}#mermaid-svg-xQ5jka7uzbtCcemT .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-xQ5jka7uzbtCcemT .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-xQ5jka7uzbtCcemT #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-xQ5jka7uzbtCcemT .sequenceNumber{fill:#fff}#mermaid-svg-xQ5jka7uzbtCcemT #sequencenumber{fill:#333}#mermaid-svg-xQ5jka7uzbtCcemT #crosshead path{fill:#333;stroke:#333}#mermaid-svg-xQ5jka7uzbtCcemT .messageText{fill:#333;stroke:#333}#mermaid-svg-xQ5jka7uzbtCcemT .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-xQ5jka7uzbtCcemT .labelText,#mermaid-svg-xQ5jka7uzbtCcemT .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-xQ5jka7uzbtCcemT .loopText,#mermaid-svg-xQ5jka7uzbtCcemT .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-xQ5jka7uzbtCcemT .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-xQ5jka7uzbtCcemT .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-xQ5jka7uzbtCcemT .noteText,#mermaid-svg-xQ5jka7uzbtCcemT .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-xQ5jka7uzbtCcemT .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-xQ5jka7uzbtCcemT .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-xQ5jka7uzbtCcemT .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-xQ5jka7uzbtCcemT .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xQ5jka7uzbtCcemT .section{stroke:none;opacity:0.2}#mermaid-svg-xQ5jka7uzbtCcemT .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-xQ5jka7uzbtCcemT .section2{fill:#fff400}#mermaid-svg-xQ5jka7uzbtCcemT .section1,#mermaid-svg-xQ5jka7uzbtCcemT .section3{fill:#fff;opacity:0.2}#mermaid-svg-xQ5jka7uzbtCcemT .sectionTitle0{fill:#333}#mermaid-svg-xQ5jka7uzbtCcemT .sectionTitle1{fill:#333}#mermaid-svg-xQ5jka7uzbtCcemT .sectionTitle2{fill:#333}#mermaid-svg-xQ5jka7uzbtCcemT .sectionTitle3{fill:#333}#mermaid-svg-xQ5jka7uzbtCcemT .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xQ5jka7uzbtCcemT .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-xQ5jka7uzbtCcemT .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xQ5jka7uzbtCcemT .grid path{stroke-width:0}#mermaid-svg-xQ5jka7uzbtCcemT .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-xQ5jka7uzbtCcemT .task{stroke-width:2}#mermaid-svg-xQ5jka7uzbtCcemT .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xQ5jka7uzbtCcemT .taskText:not([font-size]){font-size:11px}#mermaid-svg-xQ5jka7uzbtCcemT .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xQ5jka7uzbtCcemT .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-xQ5jka7uzbtCcemT .task.clickable{cursor:pointer}#mermaid-svg-xQ5jka7uzbtCcemT .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-xQ5jka7uzbtCcemT .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-xQ5jka7uzbtCcemT .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-xQ5jka7uzbtCcemT .taskText0,#mermaid-svg-xQ5jka7uzbtCcemT .taskText1,#mermaid-svg-xQ5jka7uzbtCcemT .taskText2,#mermaid-svg-xQ5jka7uzbtCcemT .taskText3{fill:#fff}#mermaid-svg-xQ5jka7uzbtCcemT .task0,#mermaid-svg-xQ5jka7uzbtCcemT .task1,#mermaid-svg-xQ5jka7uzbtCcemT .task2,#mermaid-svg-xQ5jka7uzbtCcemT .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-xQ5jka7uzbtCcemT .taskTextOutside0,#mermaid-svg-xQ5jka7uzbtCcemT .taskTextOutside2{fill:#000}#mermaid-svg-xQ5jka7uzbtCcemT .taskTextOutside1,#mermaid-svg-xQ5jka7uzbtCcemT .taskTextOutside3{fill:#000}#mermaid-svg-xQ5jka7uzbtCcemT .active0,#mermaid-svg-xQ5jka7uzbtCcemT .active1,#mermaid-svg-xQ5jka7uzbtCcemT .active2,#mermaid-svg-xQ5jka7uzbtCcemT .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-xQ5jka7uzbtCcemT .activeText0,#mermaid-svg-xQ5jka7uzbtCcemT .activeText1,#mermaid-svg-xQ5jka7uzbtCcemT .activeText2,#mermaid-svg-xQ5jka7uzbtCcemT .activeText3{fill:#000 !important}#mermaid-svg-xQ5jka7uzbtCcemT .done0,#mermaid-svg-xQ5jka7uzbtCcemT .done1,#mermaid-svg-xQ5jka7uzbtCcemT .done2,#mermaid-svg-xQ5jka7uzbtCcemT .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-xQ5jka7uzbtCcemT .doneText0,#mermaid-svg-xQ5jka7uzbtCcemT .doneText1,#mermaid-svg-xQ5jka7uzbtCcemT .doneText2,#mermaid-svg-xQ5jka7uzbtCcemT .doneText3{fill:#000 !important}#mermaid-svg-xQ5jka7uzbtCcemT .crit0,#mermaid-svg-xQ5jka7uzbtCcemT .crit1,#mermaid-svg-xQ5jka7uzbtCcemT .crit2,#mermaid-svg-xQ5jka7uzbtCcemT .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-xQ5jka7uzbtCcemT .activeCrit0,#mermaid-svg-xQ5jka7uzbtCcemT .activeCrit1,#mermaid-svg-xQ5jka7uzbtCcemT .activeCrit2,#mermaid-svg-xQ5jka7uzbtCcemT .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-xQ5jka7uzbtCcemT .doneCrit0,#mermaid-svg-xQ5jka7uzbtCcemT .doneCrit1,#mermaid-svg-xQ5jka7uzbtCcemT .doneCrit2,#mermaid-svg-xQ5jka7uzbtCcemT .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-xQ5jka7uzbtCcemT .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-xQ5jka7uzbtCcemT .milestoneText{font-style:italic}#mermaid-svg-xQ5jka7uzbtCcemT .doneCritText0,#mermaid-svg-xQ5jka7uzbtCcemT .doneCritText1,#mermaid-svg-xQ5jka7uzbtCcemT .doneCritText2,#mermaid-svg-xQ5jka7uzbtCcemT .doneCritText3{fill:#000 !important}#mermaid-svg-xQ5jka7uzbtCcemT .activeCritText0,#mermaid-svg-xQ5jka7uzbtCcemT .activeCritText1,#mermaid-svg-xQ5jka7uzbtCcemT .activeCritText2,#mermaid-svg-xQ5jka7uzbtCcemT .activeCritText3{fill:#000 !important}#mermaid-svg-xQ5jka7uzbtCcemT .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xQ5jka7uzbtCcemT g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-xQ5jka7uzbtCcemT g.classGroup text .title{font-weight:bolder}#mermaid-svg-xQ5jka7uzbtCcemT g.clickable{cursor:pointer}#mermaid-svg-xQ5jka7uzbtCcemT g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-xQ5jka7uzbtCcemT g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-xQ5jka7uzbtCcemT .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-xQ5jka7uzbtCcemT .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-xQ5jka7uzbtCcemT .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-xQ5jka7uzbtCcemT .dashed-line{stroke-dasharray:3}#mermaid-svg-xQ5jka7uzbtCcemT #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-xQ5jka7uzbtCcemT #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-xQ5jka7uzbtCcemT #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-xQ5jka7uzbtCcemT #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-xQ5jka7uzbtCcemT #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-xQ5jka7uzbtCcemT #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-xQ5jka7uzbtCcemT #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-xQ5jka7uzbtCcemT #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-xQ5jka7uzbtCcemT .commit-id,#mermaid-svg-xQ5jka7uzbtCcemT .commit-msg,#mermaid-svg-xQ5jka7uzbtCcemT .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xQ5jka7uzbtCcemT .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xQ5jka7uzbtCcemT .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xQ5jka7uzbtCcemT g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xQ5jka7uzbtCcemT g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-xQ5jka7uzbtCcemT g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-xQ5jka7uzbtCcemT g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-xQ5jka7uzbtCcemT g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-xQ5jka7uzbtCcemT g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-xQ5jka7uzbtCcemT .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-xQ5jka7uzbtCcemT .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-xQ5jka7uzbtCcemT .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-xQ5jka7uzbtCcemT .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-xQ5jka7uzbtCcemT .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-xQ5jka7uzbtCcemT .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-xQ5jka7uzbtCcemT .edgeLabel text{fill:#333}#mermaid-svg-xQ5jka7uzbtCcemT .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xQ5jka7uzbtCcemT .node circle.state-start{fill:black;stroke:black}#mermaid-svg-xQ5jka7uzbtCcemT .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-xQ5jka7uzbtCcemT #statediagram-barbEnd{fill:#9370db}#mermaid-svg-xQ5jka7uzbtCcemT .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-xQ5jka7uzbtCcemT .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-xQ5jka7uzbtCcemT .statediagram-state .divider{stroke:#9370db}#mermaid-svg-xQ5jka7uzbtCcemT .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-xQ5jka7uzbtCcemT .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-xQ5jka7uzbtCcemT .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-xQ5jka7uzbtCcemT .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-xQ5jka7uzbtCcemT .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-xQ5jka7uzbtCcemT .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-xQ5jka7uzbtCcemT .note-edge{stroke-dasharray:5}#mermaid-svg-xQ5jka7uzbtCcemT .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-xQ5jka7uzbtCcemT .error-icon{fill:#522}#mermaid-svg-xQ5jka7uzbtCcemT .error-text{fill:#522;stroke:#522}#mermaid-svg-xQ5jka7uzbtCcemT .edge-thickness-normal{stroke-width:2px}#mermaid-svg-xQ5jka7uzbtCcemT .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-xQ5jka7uzbtCcemT .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-xQ5jka7uzbtCcemT .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-xQ5jka7uzbtCcemT .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-xQ5jka7uzbtCcemT .marker{fill:#333}#mermaid-svg-xQ5jka7uzbtCcemT .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-xQ5jka7uzbtCcemT {color: rgba(0, 0, 0, 0.75);font: ;}

发出一条广播
广播接收器1
广播接收器1
广播接收器1

2. 有序广播(Ordered broadcasts)

有序广播是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到该广播消息,当这个广播接收器的逻辑执行完毕后,广播才会继续传递至下一个广播接收器。所以此时广播接收器是有先后顺序的,优先级更高的广播接收器更先接收到广播信息, 并且可以选择截断广播,这样后面的广播接收器就无法接收到广播信息。

它的流程图如下图所示:

#mermaid-svg-RS8nemWIUeudkyr7 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-RS8nemWIUeudkyr7 .label text{fill:#333}#mermaid-svg-RS8nemWIUeudkyr7 .node rect,#mermaid-svg-RS8nemWIUeudkyr7 .node circle,#mermaid-svg-RS8nemWIUeudkyr7 .node ellipse,#mermaid-svg-RS8nemWIUeudkyr7 .node polygon,#mermaid-svg-RS8nemWIUeudkyr7 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-RS8nemWIUeudkyr7 .node .label{text-align:center;fill:#333}#mermaid-svg-RS8nemWIUeudkyr7 .node.clickable{cursor:pointer}#mermaid-svg-RS8nemWIUeudkyr7 .arrowheadPath{fill:#333}#mermaid-svg-RS8nemWIUeudkyr7 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-RS8nemWIUeudkyr7 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-RS8nemWIUeudkyr7 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-RS8nemWIUeudkyr7 .edgeLabel rect{opacity:0.9}#mermaid-svg-RS8nemWIUeudkyr7 .edgeLabel span{color:#333}#mermaid-svg-RS8nemWIUeudkyr7 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-RS8nemWIUeudkyr7 .cluster text{fill:#333}#mermaid-svg-RS8nemWIUeudkyr7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-RS8nemWIUeudkyr7 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-RS8nemWIUeudkyr7 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-RS8nemWIUeudkyr7 .actor-line{stroke:grey}#mermaid-svg-RS8nemWIUeudkyr7 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-RS8nemWIUeudkyr7 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-RS8nemWIUeudkyr7 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-RS8nemWIUeudkyr7 .sequenceNumber{fill:#fff}#mermaid-svg-RS8nemWIUeudkyr7 #sequencenumber{fill:#333}#mermaid-svg-RS8nemWIUeudkyr7 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-RS8nemWIUeudkyr7 .messageText{fill:#333;stroke:#333}#mermaid-svg-RS8nemWIUeudkyr7 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-RS8nemWIUeudkyr7 .labelText,#mermaid-svg-RS8nemWIUeudkyr7 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-RS8nemWIUeudkyr7 .loopText,#mermaid-svg-RS8nemWIUeudkyr7 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-RS8nemWIUeudkyr7 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-RS8nemWIUeudkyr7 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-RS8nemWIUeudkyr7 .noteText,#mermaid-svg-RS8nemWIUeudkyr7 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-RS8nemWIUeudkyr7 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-RS8nemWIUeudkyr7 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-RS8nemWIUeudkyr7 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-RS8nemWIUeudkyr7 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-RS8nemWIUeudkyr7 .section{stroke:none;opacity:0.2}#mermaid-svg-RS8nemWIUeudkyr7 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-RS8nemWIUeudkyr7 .section2{fill:#fff400}#mermaid-svg-RS8nemWIUeudkyr7 .section1,#mermaid-svg-RS8nemWIUeudkyr7 .section3{fill:#fff;opacity:0.2}#mermaid-svg-RS8nemWIUeudkyr7 .sectionTitle0{fill:#333}#mermaid-svg-RS8nemWIUeudkyr7 .sectionTitle1{fill:#333}#mermaid-svg-RS8nemWIUeudkyr7 .sectionTitle2{fill:#333}#mermaid-svg-RS8nemWIUeudkyr7 .sectionTitle3{fill:#333}#mermaid-svg-RS8nemWIUeudkyr7 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-RS8nemWIUeudkyr7 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-RS8nemWIUeudkyr7 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-RS8nemWIUeudkyr7 .grid path{stroke-width:0}#mermaid-svg-RS8nemWIUeudkyr7 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-RS8nemWIUeudkyr7 .task{stroke-width:2}#mermaid-svg-RS8nemWIUeudkyr7 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-RS8nemWIUeudkyr7 .taskText:not([font-size]){font-size:11px}#mermaid-svg-RS8nemWIUeudkyr7 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-RS8nemWIUeudkyr7 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-RS8nemWIUeudkyr7 .task.clickable{cursor:pointer}#mermaid-svg-RS8nemWIUeudkyr7 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-RS8nemWIUeudkyr7 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-RS8nemWIUeudkyr7 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-RS8nemWIUeudkyr7 .taskText0,#mermaid-svg-RS8nemWIUeudkyr7 .taskText1,#mermaid-svg-RS8nemWIUeudkyr7 .taskText2,#mermaid-svg-RS8nemWIUeudkyr7 .taskText3{fill:#fff}#mermaid-svg-RS8nemWIUeudkyr7 .task0,#mermaid-svg-RS8nemWIUeudkyr7 .task1,#mermaid-svg-RS8nemWIUeudkyr7 .task2,#mermaid-svg-RS8nemWIUeudkyr7 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-RS8nemWIUeudkyr7 .taskTextOutside0,#mermaid-svg-RS8nemWIUeudkyr7 .taskTextOutside2{fill:#000}#mermaid-svg-RS8nemWIUeudkyr7 .taskTextOutside1,#mermaid-svg-RS8nemWIUeudkyr7 .taskTextOutside3{fill:#000}#mermaid-svg-RS8nemWIUeudkyr7 .active0,#mermaid-svg-RS8nemWIUeudkyr7 .active1,#mermaid-svg-RS8nemWIUeudkyr7 .active2,#mermaid-svg-RS8nemWIUeudkyr7 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-RS8nemWIUeudkyr7 .activeText0,#mermaid-svg-RS8nemWIUeudkyr7 .activeText1,#mermaid-svg-RS8nemWIUeudkyr7 .activeText2,#mermaid-svg-RS8nemWIUeudkyr7 .activeText3{fill:#000 !important}#mermaid-svg-RS8nemWIUeudkyr7 .done0,#mermaid-svg-RS8nemWIUeudkyr7 .done1,#mermaid-svg-RS8nemWIUeudkyr7 .done2,#mermaid-svg-RS8nemWIUeudkyr7 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-RS8nemWIUeudkyr7 .doneText0,#mermaid-svg-RS8nemWIUeudkyr7 .doneText1,#mermaid-svg-RS8nemWIUeudkyr7 .doneText2,#mermaid-svg-RS8nemWIUeudkyr7 .doneText3{fill:#000 !important}#mermaid-svg-RS8nemWIUeudkyr7 .crit0,#mermaid-svg-RS8nemWIUeudkyr7 .crit1,#mermaid-svg-RS8nemWIUeudkyr7 .crit2,#mermaid-svg-RS8nemWIUeudkyr7 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-RS8nemWIUeudkyr7 .activeCrit0,#mermaid-svg-RS8nemWIUeudkyr7 .activeCrit1,#mermaid-svg-RS8nemWIUeudkyr7 .activeCrit2,#mermaid-svg-RS8nemWIUeudkyr7 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-RS8nemWIUeudkyr7 .doneCrit0,#mermaid-svg-RS8nemWIUeudkyr7 .doneCrit1,#mermaid-svg-RS8nemWIUeudkyr7 .doneCrit2,#mermaid-svg-RS8nemWIUeudkyr7 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-RS8nemWIUeudkyr7 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-RS8nemWIUeudkyr7 .milestoneText{font-style:italic}#mermaid-svg-RS8nemWIUeudkyr7 .doneCritText0,#mermaid-svg-RS8nemWIUeudkyr7 .doneCritText1,#mermaid-svg-RS8nemWIUeudkyr7 .doneCritText2,#mermaid-svg-RS8nemWIUeudkyr7 .doneCritText3{fill:#000 !important}#mermaid-svg-RS8nemWIUeudkyr7 .activeCritText0,#mermaid-svg-RS8nemWIUeudkyr7 .activeCritText1,#mermaid-svg-RS8nemWIUeudkyr7 .activeCritText2,#mermaid-svg-RS8nemWIUeudkyr7 .activeCritText3{fill:#000 !important}#mermaid-svg-RS8nemWIUeudkyr7 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-RS8nemWIUeudkyr7 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-RS8nemWIUeudkyr7 g.classGroup text .title{font-weight:bolder}#mermaid-svg-RS8nemWIUeudkyr7 g.clickable{cursor:pointer}#mermaid-svg-RS8nemWIUeudkyr7 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-RS8nemWIUeudkyr7 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-RS8nemWIUeudkyr7 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-RS8nemWIUeudkyr7 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-RS8nemWIUeudkyr7 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-RS8nemWIUeudkyr7 .dashed-line{stroke-dasharray:3}#mermaid-svg-RS8nemWIUeudkyr7 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-RS8nemWIUeudkyr7 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-RS8nemWIUeudkyr7 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-RS8nemWIUeudkyr7 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-RS8nemWIUeudkyr7 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-RS8nemWIUeudkyr7 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-RS8nemWIUeudkyr7 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-RS8nemWIUeudkyr7 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-RS8nemWIUeudkyr7 .commit-id,#mermaid-svg-RS8nemWIUeudkyr7 .commit-msg,#mermaid-svg-RS8nemWIUeudkyr7 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-RS8nemWIUeudkyr7 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-RS8nemWIUeudkyr7 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-RS8nemWIUeudkyr7 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-RS8nemWIUeudkyr7 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-RS8nemWIUeudkyr7 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-RS8nemWIUeudkyr7 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-RS8nemWIUeudkyr7 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-RS8nemWIUeudkyr7 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-RS8nemWIUeudkyr7 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-RS8nemWIUeudkyr7 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-RS8nemWIUeudkyr7 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-RS8nemWIUeudkyr7 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-RS8nemWIUeudkyr7 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-RS8nemWIUeudkyr7 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-RS8nemWIUeudkyr7 .edgeLabel text{fill:#333}#mermaid-svg-RS8nemWIUeudkyr7 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-RS8nemWIUeudkyr7 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-RS8nemWIUeudkyr7 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-RS8nemWIUeudkyr7 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-RS8nemWIUeudkyr7 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-RS8nemWIUeudkyr7 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-RS8nemWIUeudkyr7 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-RS8nemWIUeudkyr7 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-RS8nemWIUeudkyr7 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-RS8nemWIUeudkyr7 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-RS8nemWIUeudkyr7 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-RS8nemWIUeudkyr7 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-RS8nemWIUeudkyr7 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-RS8nemWIUeudkyr7 .note-edge{stroke-dasharray:5}#mermaid-svg-RS8nemWIUeudkyr7 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-RS8nemWIUeudkyr7 .error-icon{fill:#522}#mermaid-svg-RS8nemWIUeudkyr7 .error-text{fill:#522;stroke:#522}#mermaid-svg-RS8nemWIUeudkyr7 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-RS8nemWIUeudkyr7 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-RS8nemWIUeudkyr7 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-RS8nemWIUeudkyr7 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-RS8nemWIUeudkyr7 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-RS8nemWIUeudkyr7 .marker{fill:#333}#mermaid-svg-RS8nemWIUeudkyr7 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-RS8nemWIUeudkyr7 {color: rgba(0, 0, 0, 0.75);font: ;}

发出一条广播
广播接收器1
广播接收器2
广播接收器3
可将广播截断
可将广播截断

二、接收系统广播

Android内置了许多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息。比如手机开机后会发出一条广播,电池电量发生变化会发出一条广播,时间或时区改变会发出一条广播,等等等等。如果想要接收到这些光不怕,我们就要引入一个新的概念——广播接收器(Broadcast Recevier),下面我们就来看看他具体的用法。

广播接收器可以自由地对自己感兴趣的广播进行注册,这样当有相应的广播发出时,广播接收器就能接收到该广播,并在内部处理相应的逻辑。注册广播的方式一般有两种方式,在代码中注册称为动态注册在AndroidManifest.xml中注册称为静态注册

1. 动态注册监听网络变化

首先我们应该学习的是如何创建一个广播接收器,它非常简单,其实只要我们自定义一个类让它继承自BroadcastReceiver,并且重写父类的onReceive()方法就可以了。这样当广播到来时,就会执行onReceive()方法,具体的逻辑写在其中就可以了。

我们就借用动态注册的方式来来编写一个监听网络变化的程序,顺便借此来学习一下广播接收器的基本用法吧,

首先我们新建一个项目,然后修改MainActicvity中的代码,

public class MainActivity extends AppCompatActivity {private IntentFilter intentFilter;private NetWorkChangeReceiver netWorkChangeReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);intentFilter = new IntentFilter();intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");netWorkChangeReceiver = new NetWorkChangeReceiver();registerReceiver(netWorkChangeReceiver,intentFilter);}class NetWorkChangeReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);Network network = connectivityManager.getActiveNetwork();if(network != null ){Toast.makeText(context,"Network is available",Toast.LENGTH_SHORT).show();}else{Toast.makeText(context,"NetWork is not available",Toast.LENGTH_SHORT).show();}}}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(netWorkChangeReceiver);}
}

接下来我们看onCreate()方法,首先创建了一个IntentFilter类,如果你观察仔细,就会发现AndroidManifest.xml中有<intent - filter>这样的标签,其实他们是一个意思,都是意图过滤器,这里面添加的都是我们所需要的意图,接下来我们再intentfilter中添加了一个值为android.net.conn.CONNECTIVITY_CHANGE的action,为什么添加这个值呢?因为每当我们的网络发生变化时,系统正式发出一个值为android.net.conn.CONNECTIVITY_CHANGE的广播,也就是说我们想让广播接收器接收什么样的广播,就在这里添加对应的action。接下来创建了一个NetworkChangeReceiver的实例,然后调用registerRecevier()方法对广播接收器进行注册,这里有两个参数,一个是广播接收器实例,一个是IntentFilter实例,这样就意味着我们的广播接收器接收的是IntentFilter中的广播值,也就实现了监听网络变化的功能。

接下来可以看到,我们在MainActivity中自定义了一个NetworkChangeReceiver类继承了BroadcastReceiver类,并且重写了父类的onReceive()方法。这样每当网络发生改变的时候,onReceive()方法就会得到执行,这就是我们所自定义的一个广播接收器。

在我们的自定义的类里面,首先通过getSystemService()方法得到了ConnectivityManager实例,这是一个系统的服务类,用来管理网络连接和监听网络状态的。然后我们调用它的getActiveNetwork()方法就可以得到Network实例,获取到Network实例后,我们就可以通过Network是否为空来判断当前的网络状态,最后在里面通过Toast来提示用户。

最后我们一定要记得动态注册的广播接收器需要取消注册才可以,我们在这onDestroy()方法中调用unregisterReceiver()方法就可以了。

最最最重要的是,Andorid系统为了保护用户设备的安全和隐私,做了严格的规定:如果程序需要进行一些对用户比较敏感的操作,必须在配置文件中声明权限才可以,否则程序将直接崩溃。比如这里访问系统的网络状态就是需要声明权限的。打开AndroidManifest.xml,在里面加入如下权限就可以访问系统网络状态了:

<user-permission android:name="andorid.permission.ACCESS_NETWORK_STATE">

接下来我们运行程序,然后打开关闭网络就可以看到屏幕底部的提示:

2. 静态注册实现开机启动提示

动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大优势,但是他存在着一个缺点,就是必须启动程序后才能接收广播,因为注册的逻辑是写在onCreate()中的。那么有没有什么方法能够让程序在不启动的情况下接收到广播呢?这就需要使用静态注册的方式了。

这里我们准备让程序接受一条开机广播,当接收到这个程序时,就可以在onReceive()方法里的逻辑进行执行,从而实现开机启动的功能。我们先建立一个广播接收器,命名为BootCompleteReceiver。

public class BootCompleteReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"开机了",Toast.LENGTH_SHORT).show();}
}

代码非常简单,我们只需要在onReceive()方法中使用Toast弹出一条提示信息。

另外我们需要在AndroidManifest.xml中注册我们的广播接收器

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.broadcasttested"><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme">...<receiverandroid:name=".BootCompleteReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver>

由于Android系统完成启动后会发出一条值为andorid.intent.action.BOOT_COMPLETED的广播,因此我们在<intent - filter>中添加了相应的action。另外,监听系统开机的广播也需要声明权限,可以看到,我们使用<user - permission>标签加入了一条andorid.permission.RECEIVE_BOOT_COMPLETED

这样我们的程序目的就达到了,接下来我们将模拟器关机后重新启动,在启动完成后就会接收到开机广播。


三、发送自定义广播

我们已经学会了通过广播接收器来接收系统广播,接下来我们就来学习一下如何在应用程序中发送自定义广播。接下来我们就来通过实践来看一下如何发送标准广播有序广播

1. 发送标准广播

在发送广播之前,我们还是需要自己定义一个广播接收器来接收广播才行。我们新建一个MyBroadcastReceiver,代码如下:

public class MyBroadCastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"已接受自定义广播",Toast.LENGTH_SHORT).show();}
}

接下来我们需要在AndroidManifest.xml中为这个广播接收器绑定需要接受的广播值,这里我们让它接受一条值为com.example.broadcasttest.MY_BROADCAST的广播,待会我们发送时,也需要这样发出这样一条广播。

 <receiverandroid:name=".MyBroadCastReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="com.example.broadcasttested.MY_BROADCAST"/></intent-filter></receiver>

接下来我们在主活动布局中添加一个按钮

<?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"><Buttonandroid:id="@+id/btn_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="send broadcast"/></LinearLayout>

最后我们修改MainActivity中的代码,当我们点击按钮时就发出一条值为com.example.broadcasttest.MY_BROADCAST的广播,如下所示:

    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = findViewById(R.id.btn_1);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent ("com.example.broadcasttest.MY_BROADCAST");intent.setComponent(new ComponentName("com.example.broadcasttested","com.example.broadcasttested.MyBroadcastReceiver"));sendBroadcast(intent);}});}

我们只需要构建一个Intent对象,将广播值传入,
然后我们为intent传入当前包名和广播接收器的路径,之后就可以调用Context的sendBroadcast()方法将广播发出,这样所有监听该广播的广播接收器就会受到该信息。此时发出去的广播是一条标准广播。

由于广播是通过intent传输的,我们还可以在intent添加想要传递的数据给广播接收器。

2. 发送有序广播

其实有序广播和标准广播的不同就是

标准广播所用发送广播方法:

sendBroadcast(Intent intent)

有序广播所用发送广播方法:

sendOrderedBroadcast(Intent intent ,String receiverPermission)

并且我们可以通过在AndroidManifest.xml中的< receiver >标签内<intent - filter android:priority="">来设置广播接收器的优先级,优先级越大,就先收到有序广播。

当然我们也可以在接收器里的onReceive()方法中调用abortBroadcast()方法来截断广播,导致优先级更低的广播接收器无法接受该有序广播。

四、使用本地广播

前面所讲的广播都是全局广播,即所发出的广播都可以被其他应用来接受到,并且我们也可以接受来自于其他任何程序的广播。这样就容易引起安全性问题,比如说我们发送的一些携带关键数据的广播被其他程序截获,或者是我们接受到其他程序的垃圾广播。

为了解决这个问题,Android引入了本地广播机制来解决这个问题,使用这个机制的广播只能在程序内进行传递,并且广播接收器也只能接受来自本程序的广播,这样我们的安全性问题就不存在了。

本地广播的实质就是使用了一个LocalBroadcastManager来对广播进行管理,并且提供了发送广播和注册广播接收器的方法。下面我们一起来看看:

首先我们修改MainActivity中的代码:

 注意,LocalBroadcastManager已被弃用
public class MainActivity extends AppCompatActivity {private IntentFilter intentFilter;private LocalReceiver localReceiver;private LocalBroadcastManager localBroadcastManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取实例localBroadcastManager =LocalBroadcastManager.getInstance(this);Button button=(Button)findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent("111");//发送本地广播localBroadcastManager.sendBroadcast(intent);}});intentFilter =new IntentFilter();intentFilter.addAction("111");localReceiver = new LocalReceiver();//注册本地广播监听器localBroadcastManager.registerReceiver(localReceiver,intentFilter);}@Overrideprotected void onDestroy() {super.onDestroy();//解除本地广播监听器localBroadcastManager.unregisterReceiver(localReceiver);}class LocalReceiver extends BroadcastReceiver{@overridepublic void onReceive(Context context , Intent intent){Toast.makeText(context,"已接受接受本地广播",Toast.LENGTH_SHORT).show(); }}
}

这样我们就完成了本地广播的注册和接收。

Android 全局大喇叭——详解广播机制相关推荐

  1. 第一行代码学习笔记第五章——详解广播机制

    知识点目录 5.1 广播机制 5.2 接收系统广播 * 5.2.1 动态注册监听网络变化 * 5.2.2 静态注册实现开机广播 5.3 发送自定义广播 * 5.3.1 发送标准广播 * 5.3.2 发 ...

  2. android 广播的权限,Android四大组件详解之BroadcastReceiver广播接收者

    Android四大组件详解---BroadcastReceicer广播接收者 广播有两个角色,一个是广播发送者,另一个是广播接收者. 广播按照类型分为两种,一种是全局广播,另一种是本地广播 全局广播: ...

  3. Android 动态分区详解(六) 动态分区的底层机制

    文章目录 1. Android 动态分区的两重含义 2. device mapper 的原理 3. linear 映射的原理 3.1 多个设备映射示例 3.2 `dmsetup create` 命令参 ...

  4. Android SystemUI 架构详解

    Android SystemUI 架构详解 本文描述Android系统中一个核心应用SystemUI,详细赘述SystemUI中几大模块功能的实现过程.由于作者水平有限,如发现本文中错误的地方,欢迎指 ...

  5. Android 动画框架详解

    Android 动画框架详解 基本原理 朱 韦伟, 软件工程师, IBM 李 浩, 软件工程师, 爱格码 简介: Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果.A ...

  6. Android进阶——AIDL详解之使用远程服务AIDL实现进程间带远程回调接口和自定义Bean的较复杂通信小结(二)

    文章大纲 引言 一.远程回调AIDL接口的应用 1.封装基本的父类和一些工具类 2. 创建服务端的AIDL 2.1.定义回调AIDL接口 2.2.定义业务AIDL接口 3.实现服务端对应AIDL的带有 ...

  7. [Android]多进程知识点详解

    作者:Android开发_Hua 链接:https://www.jianshu.com/p/e0f833151f66 多进程知识点汇总: 一:了解多进程 二:项目中多进程的实现 三:多进程的优缺点与使 ...

  8. Android事件流程详解

    Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...

  9. android屏幕适配详解

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...

最新文章

  1. php windows 编译,Windows编译PHP7.2拓展
  2. 线程的同步-----Lock同步锁
  3. 每日一皮:原型还可以啊,怎么上线后就这样了。。。
  4. 超图桌面版加载obj 3D模型
  5. secureCRT配置ssh -x
  6. Effective Java~23. 类层次优于标签类
  7. 电脑与电脑之间数据是如何传输的(数据封装与解装)
  8. 将dll制作成控件_案例丨首例将影视作品制作成网络图片集被判侵权案 二审维持原判...
  9. div不占位置_Python爬取校花网,妈妈再也不会担心我不给她发女朋友照片了
  10. quartus仿真27:JK触发器构成的同步十进制可逆计数器(分析)
  11. arcgis xml 下载 切片_如何下载谷歌地球影像的 ArcGIS Server 缓存切片(瓦片)
  12. tc275怎么移植到ram中去,把函数
  13. 数学机器证明与机器验证
  14. 【C++】给定两个没有刻度的容器,对于任意给定的容积,求出如何只用两个瓶装出L升的水
  15. uview ui与element ui的区别和用法
  16. 华为手机安装debug的apk时出现无效安装和与操作系统不兼容问题解决
  17. windows安装gem和fastlane
  18. 「 神器 」快速启动应用Wox
  19. dlclose隐藏的秘密!
  20. 淘宝客如何通过闲鱼引流?淘宝客的推广方法有哪些?

热门文章

  1. JavaScript 学习-37.jQuery 添加/删除/替换元素
  2. spark core 2.0 SerializedShuffleHandle UnsafeShuffleWriter ShuffleExternalSorter
  3. jQuery使用手册 [zt]
  4. 【计算机程序设计思想与方法】1 什么是计算?
  5. 我被现实强奸了,心情烂到极点!!!
  6. 线程池3rd卷:龙卧浅滩等海潮
  7. 2023年重庆大学计算机专业考研参考书、择校及备考经验
  8. 金山银四来了!论程序员和老板谈加薪的正确姿势,针不戳!
  9. 为什么说Windows10 22H2千万别更新?
  10. 如何用蓝牙网关扫描蓝牙广播设备