广播接收者(Broadcast Receiver)



独立寒秋,湘江北去,橘子洲头。 —–毛泽东《沁园春·长沙》


  • 广播

    • 广播类型

      • 有序广播
      • 无序广播
      • 特殊的广播接收者
    • 注册广播接收者的两种方式
  • 系统广播示例
    • 接收系统发送的广播

      • 示例-短信到来
  • 自定义无序广播示例
    • 创建广播
    • 接收广播方式静态注册
    • 接收广播方式代码注册
  • 自定义有序广播示例
    • 发送有序广播
    • 接收有序广播
    • 有序广播结果
    • 特殊的广播接收者-锁屏等等

广播

  • 听广播要有:电台 收音机 音乐广播
  • Android系统内部已经定义好了电台 ,也已经定义好了一些广播事件

    比如外拨电话 短信到来 SD卡状态 电池电量….

  • 使用Broadcast Receiver取接收系统已经定义好的事件
  • 定义广播是为了开发者更好的开发
  • 发送方和接收发可以是同一个应用程序
  • 广播接收器没有用户界面
  • 如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由Service 来完成

广播类型

有序广播

按照一定的优先级接收

发送优先级级别数值是在 -1000 到 1000 之间 , 值越大 , 发送的优先级越高

有序广播的数据可以被修改

有序广播的数据可以被终止

无序广播

无序广播的数据不可以被修改

无序广播的数据不可以被终止

特殊的广播接收者

操作特别频繁的广播事件,比如屏幕的锁屏和解锁,电池电量的变化 这种事件的广播在清单文件里面注册无效

SD卡的安装,卸载的广播,想要接收的话,需要一个约束类型,在< receiver>中

         <receiver android:name="....">
            <intent-filter>
                <action android:name="android.intent.action.MEDIA_UNMOUNTED"></action>
                <action android:name="android.intent.action.MEDIA_MOUNTED"></action>
                <!--约束类型叫file sd卡的数据类型是file -->
                <data android:scheme="file"></data>
            </intent-filter>
        </receiver>

应用程序的安装,卸载 也需要一个约束类型

<data android:scheme="package"></data>

注册广播接收者的两种方式

注意

动态注册,广播接收者的生命周期依附应用程序的生命,关闭程序,广播接收者也无效了

在清单文件里注册,广播接收者的生命会依附应用程序的进程存在,即使关闭了应用程序,进程没有销毁(没有因为内存不足销毁),广播接收者也是有效的

[1]动态注册 通过代码方式注册

private MyBroadcast myBroadcast;
......
        myBroadcast = new MyBroadcast();

        IntentFilter filter =new IntentFilter();
        filter.addAction("......");
        registerReceiver(myBroadcast,filter);
public  class MyBroadcast extends BroadcastReceiver{
 @Override
        public void onReceive(Context context, Intent intent) {
        //接收广播后执行逻辑
        }
}
@Override
protected void onDestroy() {
    unregisterReceiver(screenReceiver);
    super.onDestroy();
}

[2]在清单文件里通过receiver tag 节点静态发布

<receiver android:name=".SmsListenerReciver">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
            </intent-filter>
</receiver>

系统广播示例

接收系统发送的广播

[1] 定义广播接收者

public class onReceiver extends BroadcastReceiver {
@Override
    public void onReceive(Context context, Intent intent) {
    }
}

[2]在清单文件里配置

<receiver android:name=".SmsListenerReciver"/>

[3定义过滤器具体接收什么广播

<intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
</intent-filter>

示例-短信到来

短信到来是一个有序广播

  • 定义广播接收者
package com.peng.smslistener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;

/**
 * Created by Peng on 2016/7/31.
 */
public class SmsListenerReciver  extends BroadcastReceiver{
    //短信到来是执行
    @Override
    public void onReceive(Context context, Intent intent) {

        System.out.println("短信到了");
        //拿到信息发送的内容和号码
         Object object[] = (Object[]) intent.getExtras().get("pdus");

        //循环取短信
        for(Object obj:object){
            //获取smsmessage实例
             SmsMessage smsMessage= SmsMessage.createFromPdu((byte[]) obj);
            //获取发送短信的内容
            String messageBody = smsMessage.getMessageBody();
            String address = smsMessage.getOriginatingAddress();

            System.out.println("body:"+messageBody+address);
        }

    }
}
  • 配置广播接收者
<receiver android:name=".SmsListenerReciver">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
            </intent-filter>
        </receiver>
        ...
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

自定义无序广播示例

发送广播和接收广播在不同的两个应用程序中

创建广播

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void click(View view) {
        //发送无序广播
         Intent intent =new Intent();
        intent.setAction("com.peng.guangbo");

        intent.putExtra("name","新闻联播每天晚上7点准时开播");

        sendBroadcast(intent);
        System.out.println("--------------->>>>>>>发送无序广播");
    }
}

接收广播方式(静态注册)

public class onReceiver extends BroadcastReceiver {

    //接收自定义广播
    @Override
    public void onReceive(Context context, Intent intent) {
        //终止广播,在无序广播里没用
        abortBroadcast();
        String content =intent.getStringExtra("name");

   Toast.makeText(context,content,Toast.LENGTH_LONG).show();
    }
}
<receiver android:name="定义的接收者类名">
            <intent-filter>
                <action android:name="com.peng.guangbo"></action>
            </intent-filter>
</receiver>

接收广播方式(代码注册)

有序和无序广播都可以通过代码注册

public class MainActivity extends AppCompatActivity {

    private Mybroadcastreceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        receiver = new Mybroadcastreceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.peng.guangbo");
        registerReceiver(receiver,filter);
    }
    public class Mybroadcastreceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            String content =intent.getStringExtra("name");
            System.out.println(">>>>>>>>>>>动态注册");
            Toast.makeText(context,content, Toast.LENGTH_LONG).show();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }
}

自定义有序广播示例

发送广播和接收广播在不同的两个应用程序中

发送有序广播

假定”政府”发送一个广播,并携带数据”政府给每个村民发了1000元补贴”,这里设置了四个接收者,分别是”省长”,”市长”,”乡长”,和”农民”,优先级级别从高到低,并且会更改数据

 public void click(View view) {
        //点击按钮发送有序广播
        Intent intent = new Intent();
        intent.setAction("com.peng.sendrice");
        /**
         *
         * 1 Intent 意图
         * 2 receiverPermission 接收的权限
         * 3 resultReceiver 最终的receiver
         * 4 scheduler handler
         * 5 initialcode 初始码
         * 6initalDate 初始化数据
         */
        sendOrderedBroadcast(intent,null,new FinalReceiver(),null,1,"政府给每个村民发了1000元补贴",null);
    }

FinalReceiver 位于发送广播的应用程序中

这是一个resultReceiver,也是一个广播接收者,也可以理解为finalReceiver,当广播被所有接收方接收之后,才会执行这个广播接收者,相当于广播结果的反馈,它返回的是最后一个广播接收者接收的内容,在这个例子中就是”农民”的接收的数据

public class FinalReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        String content = getResultData();

        Toast.makeText(context,"报告习大大:"+content,Toast.LENGTH_LONG).show();

    }
}

接收有序广播

在清单文件里配置过滤器,接收方分别新建一个类,便于管理

如果你想在MainActivity里写广播接收者,又想在清单文件里配置,就会是这样,

<receiver android:name=".MainActivity$Mybroadcastreceiver"></receiver>

“省长”

public class ProvienceReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        String content = getResultData();

        Toast.makeText(context,"省长:"+content,Toast.LENGTH_LONG).show();
       /*
        *//终止广播
        *abortBroadcast();
        */
        //修改广播
        setResultData("政府给每个村民发了500元补贴");

    }
}


“市长”

public class CityReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        String content = getResultData();

        Toast.makeText(context,"市长:"+content,Toast.LENGTH_LONG).show();
        //修改广播
        setResultData("政府给每个村民发了250元补贴");
    }
}


“乡长”

public class CountryReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        String content = getResultData();

        Toast.makeText(context,"乡长:"+content,Toast.LENGTH_LONG).show();
        //修改广播
        setResultData("政府给每个村民发了50元补贴");
    }
}


“农民”

public class NongMinReceiver  extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {

        String content = getResultData();

        Toast.makeText(context,"农民:"+content,Toast.LENGTH_LONG).show();
    }
}
  • 清单文件里配置< reeiver>和优先级

    如果通过代码注册,优先级可以这样设置

IntentFilter intentFilter =new IntentFilter();
intentFilter.addAction("......");
intentFilter.setPriority(100);

清单文件里配置

 <receiver android:name=".ProvienceReceiver">
              <!-- 省长-->
            <intent-filter android:priority="1000">
                <action android:name="com.peng.sendrice"></action>
            </intent-filter>
        </receiver>
            <!-- 市长-->
        <receiver android:name=".CityReceiver">
            <intent-filter android:priority="500">
                <action android:name="com.peng.sendrice"></action>
            </intent-filter>
        </receiver>
              <!-- 乡长-->
        <receiver android:name=".CountryReceiver">
            <intent-filter android:priority="100">
                <action android:name="com.peng.sendrice"></action>
            </intent-filter>
        </receiver>
              <!-- 农民-->
        <receiver android:name=".NongMinReceiver">
            <intent-filter android:priority="-100">
                <action android:name="com.peng.sendrice"></action>
            </intent-filter>
        </receiver>

有序广播结果

特殊的广播接收者-锁屏等等

MainActivity.java

.....
public class MainActivity extends AppCompatActivity {
    private ScreenReceiver screenReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //动态的注册广播接收者
         screenReceiver = new ScreenReceiver();
        /*<intent-filter>
        <action android:name="android.intent.action.SCREEN_ON"></action>
        <action android:name="android.intent.action.SCREEN_OFF"></action>
        </intent-filter>*/

        //创建intentfilter对象
         IntentFilter intentFilter =new IntentFilter();

        //添加要注册的action
        intentFilter.addAction("android.intent.action.SCREEN_ON");
        intentFilter.addAction("android.intent.action.SCREEN_OFF");
        //动态的注册广播接收者
        registerReceiver(screenReceiver,intentFilter);

    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(screenReceiver);
        super.onDestroy();
    }
}

ScreenReceiver.java

.....
public class ScreenReceiver extends BroadcastReceiver {
    //当我们屏幕解锁和锁屏 这个方法执行
    @Override
    public void onReceive(Context context, Intent intent) {
        //获取广播的事件类型
        String action = intent.getAction();
        if("android.intent.action.SCREEN_OFF".equals(action)) {
            System.out.println("屏幕锁屏了");
        }else if("android.intent.action.SCREEN_ON".equals(action)){
            System.out.println("屏幕解锁了");
        }
    }
}

屏幕都关了,就不要用Toast显示屏幕锁屏数据了

时间: 2024-07-29 20:40:03

广播接收者(Broadcast Receiver)的相关文章

广播接收者--Broadcast

什么是Broadcast BroadcastReceiver是安卓中的四大组件之一. 广播接收器,也被称为全局事件,或系统事件. 当Android系统中任何程序有动作时,如果想通知其他程序,采用广播的方式进行传播是非常有效的.广播从理论上说,可以将一个动作传播给任意多个程序(当然,广播接收器的数量会受到系统限制). 在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理.这个广播跟我们传统意义中的电台广播有些相似之处.

广播接收者BroadCast的认识

BroadCast用于接收其他程序或者本身发出的系统级别的通知 分为标准广播和有序广播 又分为动态注册和静态注册 动态注册: 首先新建一个类用于接收广播(即广播接收者)的类,该类继承BroadCatReceiver类,并且重写onReceiver方法,收到广播后的各种逻辑就是在该方法里面编写,在onCreate()方法里面回去IntentFilter实例,并且添加广播的指令,然后获取BroadCastReciver类的实例,然后利用registerReciver()方法进行广播的注册, @Ove

android中代码形式注册广播接收者

   /**   * 自定义内部类实现广播接受者    *    * @author Byron   *    */  class OutCallReceiver extends BroadcastReceiver {   @Override   public void onReceive(Context context, Intent intent) {       }  }      // 用代码去注册广播接收者   receiver = new OutCallReceiver();   I

Android Broadcast Receiver (广播接收者)

一.简介 Broadcast Receiver是广播接收器,接收自定义和系统的主播.也可以称为监听器. Broadcast Intent与Intent一样是通信的媒介,与Intent不同的是Broadcast Intent同时被多个组件接收. Broadcast Intent广播机制,广播源发出消息,通过AMS(Activity manager service),可以使多个组件接收同一个消息.与Broadcast Intent成对配合应用的是Broadcast Receiver广播接收器,用于,

Android中Intent详解(二)之使用Intent广播事件及Broadcast Receiver简介

通过第一篇的讲解,我们已经看到了如何使用Intent来启动新的应用程序组件,但是实际上他们也可以使用sendBroadcast方法来在组件间匿名的广播消息. 作为一个系统级别的消息传递机制,Intent可以在进程之间发送结构化的消息.因此,通过实现Broadcast Receiver来监听和响应应用程序内的这些Broadcast Intent. 通过使用Intent来广播一个事件,可以在不修改原始的应用程序的情况下,让我们开发人员对事件做出反应.Android大量使用了Broadcast Rec

Android中Intent具体解释(二)之使用Intent广播事件及Broadcast Receiver简单介绍

通过第一篇的解说,我们已经看到了怎样使用Intent来启动新的应用程序组件,可是实际上他们也能够使用sendBroadcast方法来在组件间匿名的广播消息. 作为一个系统级别的消息传递机制,Intent能够在进程之间发送结构化的消息. 因此,通过实现Broadcast Receiver来监听和响应应用程序内的这些Broadcast Intent. 通过使用Intent来广播一个事件,能够在不改动原始的应用程序的情况下.让我们开发者对事件做出反应.Android大量使用了Broadcast Rec

详解广播机制,Broadcast Receiver,Android进阶必备知识(一)。

直奔主题,关于广播的一些定义什么的我觉得只要是一名合格的初级android开发这都知道吧,我下面要做的就是怎么去使用broadcast receiver. 1.怎么去监听系统广播? Android系统有很多内置的系统广播:电话,短信,时间,地区,电池电量,网络变化等等...那么我们怎么去在我们的应用中实现监听呢?下面我们以监听手机网络发生改变的广播进行监听,都知道广播有两种注册方式,在这里我使用的代码注册的方式,为的是能更好的去理解广播运行机制.在代码中注册一定要注意在你使用完毕的时候一定要反注

广播接收者Receiver

思路: 1:需要注册一个广播接收者,registerReceiver()需要两个参数 public Intent registerReceiver( BroadcastReceiver receiver, IntentFilter filter) {//接收者,过滤器(需要接收的内容) return mBase.registerReceiver(receiver, filter); } 2:参数一,接收者.新建一个NetworkChanceReceiver内部类,继承于BroadcastRece

Broadcast Receiver基本使用

Broadcast Receiver介绍 Broadcast Receiver翻译成中文叫"广播接收器",所以它的作用是用来接收发送过来的广播的. Android应用程序可以发送或接收来自Android系统和其他Android应用程序的广播消息,类似于发布订阅设计模式.当有兴趣的事件发生时发送这些广播.例如,Android系统在各种系统事件发生时发送广播,例如当系统启动或设备开始充电时.应用程序也可以发送自定义广播,例如,通知其他应用程序的东西,他们可能感兴趣(例如,一些新的数据已被下