BroadCastReceiver的应用

本文介绍了Android中的五种广播类型:无序广播、有序广播、粘性广播、本地广播和系统广播,包括它们的创建、注册、发送及接收方式,以及各自的特点和应用场景。有序广播支持优先级设定,粘性广播能保留最后一条广播信息,本地广播限制在应用内部传播,系统广播则涉及设备状态变化等系统事件。
摘要由CSDN通过智能技术生成

广播分为普通(无序)广播,有序广播,粘性广播,本地广播,系统广播。

广播的三要素:广播发送者(发送广播)

广播接收者(调频,接收广播)

要处理的事情(处理广播的相关信息,Intent有图对象)

创建:

一.普通广播

普通广播又叫无序广播,在接收时,所有广播接收器几乎会在同一时刻接收到广播。

  1. 普通广播需要在清单文件中增加过滤器

  1. 普通广播的应用():

 //注册静态广播
Intent intent = new Intent();
// intent.setPackage(getPackageName());
//如果版本为8.0以上,需要加上述代码
intent.setAction("com.bw.sta");
Bundle bundle = new Bundle();
bundle.putString("name","");
bundle.putInt("age","");
bundle.putFloat("money","");
intent.putExtras(bundle);
sendBroadcast(intent);
  1. 广播的继承(在广播传值的时候可以使用Bundle传值):

public class MyStaticReceiver extends BroadCastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals("com.bw.sta")){
            Bundle bundle = intent.getExtras();
            String name = bundle.getString(“name”);
            int age = bundle.getInt(“age”);
            float money = bundle.getFloat(“money”);
        }
    }
}

二.有序广播

有序广播的接收在同一时刻只会有一个接收者接收到消息。

  1. 同理,在应用动态广播的时候在Activity中进行编译同样需要继承

 //注册动态广播
        MyDynReceiver myDynReceiver =new MyDynReveiver();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("com.bw.dyn");
//动态广播需要注册
        registerReceiver(myDynReceiver,intentFilter);
  1. 需要调用sendOrderedBroadcast()进行传值,接收时与其无异。

sendOrderedBroadcast(intent,null);
  1. intentFilter.setPriority()为动态广播设置优先级的选择。

       //设置的值为-1000到1000
        intentFilter.setPriority(100);
        registerReceiver(oneReceiver,intentFilter);
        intentFilter.setPriority(200);
        registerReceiver(twoReceiver,intentFilter);

4.abortBroadCast:阻止其他接收者接收这条广播,只对有序广播有效。

三.粘性广播

而粘性广播的传值传递

需要调用sendStickyBroadcast()进行传值并添加权限,接收时与其无异。

<uses-permission android:name="android.permission.BROADCAST_STICKY"/>

需注意:粘性广播的区别在于能(1)一直保存最后一条广播,(2)并一直滞留,(3)而且可以被多次接收。

四.本地广播

本地广播的优缺点:发送的广播只能在本应用程序内部进行传递,并且广播接收器也只能接收本应用程序的广播,但保证安全的同时也加大了局限性,只能在本应用程序中使用。

注册一个本地广播并发送出去

localBroadcastManager=LocalBroadcastManager.getInstance(this);

localBroadcastManager.sendBroadcast(new Intent("com.bw.local"));

注意事项:

  • 本地广播无法通过静态注册来接收

  • 在广播中启动活动需要添加FLAG_ACTIVITY_NEW_TASK的标记

  • 在广播中弹出AlertDialog需要添加TYPE_SYSTEM_ALERT

五.系统广播

一些常用的系统广播

监听网络变化

android.net.conn.CONNECTIVITY_CHANGE

关闭或打开飞行模式

Intent.ACTION_AIRPLANE_MODE_CHANGED

充电时或电量发生变化

Intent.ACTION_BATTERY_CHANGED

系统启动完成后(仅广播一次)

Intent.ACTION_BOOT_COMPLETED

电池电量低

Intent.ACTION_BATTERY_LOW

电池电量充足(即从电量低变化到饱满时会发出广播)

Intent.ACTION_BATTERY_OKAY

按下照相时的拍照按键(硬件按键)时

Intent.ACTION_CAMERA_BUTTON

屏幕锁屏

Intent.ACTION_CLOSE_SYSTEM_DIALOGS

设备当前设置被改变时(界面语言,设备方向等)

Intent.ACTION_CONFIGURATION_CHANGED

插入耳机时

Intent.ACTION_HEADSET_PLUG

未正确移除SD卡但已取出来时(正确移除方法:设置-SD卡和设备内存-卸载SD卡)

Intent.ACTION_MEDIA_BAD_REMOVAL

插入外部存储装置(如SD卡)

Intent.ACTION_MEDIA_CHECKING

成功安装apk

Intent.ACTION_PACKAGE_ADDED

成功删除apk

Intent.ACTION_PACKAGE_REMOVED

重启设备

Intnet.ACTION_REBOOT

屏幕被关闭

Intent.ACTION_SCREEN_OFF

屏幕被打开

Intent.ACTION_SCREEN_ON

关闭系统时

Intent.ACTION_SHUTDOWN

注:

在使用前需要在清单文件中加入并进行版本判断

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_SMS"></uses-permission>
    <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
    <uses-permission android:name="android.permission.READ_CALL_LOG"/>

六.注意事项

  1. 广播中不允许开辟线程

  1. onReceiver()运行时间超过10秒 还没有结束程序会报错。

3.最后结束时在OnDestroy中销毁广播即可,如果不主动销毁则容易出现异常,则可能导致已经注册的receiver没有在合适的时机注销,导致内存泄漏,占用内存空间,加重 SystemService负担。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值