当前位置:   article > 正文

Android 四大组件之广播(Broadcast)_android 广播

android 广播

一、广播是什么?

广播分为发送者和接受者,可以理解为发送者发送通知,接受者可以选择接收通知
广播分为系统广播和本地广播,系统广播可以分为标准和有序
标准广播:一但发出所有接收者同时受到
有序广播:接收者按优先级受到而且可以截断

本地广播:以上都是系统全局广播,发出的广播可以被其他任何应用接收这样容易产生安全问题,所以有了本地广播只能在应用程序内部传递。

二、广播的注册

分为动态和静态注册
静态注册:
静态注册的广播在应用安装时由系统自动注册完成,必须在AndroidManifest.xml中声明,单独一个类不能像动态一样可以在某个类里面,否则抛异常。可以监听手机的开关机。静态注册是当程序关闭后,如果有广播发过来,还能启动程序。只要设备开启状态广播就能接受。

动态注册:比静态优先级高,不需要在AndroidManifest.xml中声明,但是周期短随着context的终止而终止。

三、广播简单使用

1:标准广播(动态注册)

 Intent intent = new Intent("aaaaaa");
  intent.putExtra("key111", "value111"); //可以携带参数去参数时
  sendBroadcast(intent) ; //广播也是使用intent发送的
  • 1
  • 2
  • 3
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("测试测试测试", "onReceive: 收到广播aaaaa");
        
        //如果多条广播可以使用下面方法判断收到哪一条
        String action = intent.getAction();
        if("android.intent.action.SIM_STATE_CHANGED".equals(action)){
            //接收广播消息
         String  bValue= intent.getStringExtra("key111");//bValue值就是:value111
            Log.e(TAG,"SIM卡有变动");
        }

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
 MyBroadcastReceiver screen=new  ScreenBroadcastReceiver ();//实例化一下广播接收器
    IntentFilter filter = new IntentFilter();//添加一个过滤器只接受“aaaaaaa”广播
    filter.addAction("aaaaaa");
    registerReceiver(screen, filter);
  • 1
  • 2
  • 3
  • 4

最后别忘了销毁广播
unregisterReceiver(screen);

标准广播(静态注册):不一样的一点就是把过滤器写到AndroidManifest.xml文件中

 Intent intent = new Intent("aaaaaa");
  sendBroadcast(intent) ; //广播也是使用intent发送的
  • 1
  • 2
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("测试测试测试", "onReceive: 收到广播aaaaaa");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在AndroidManifest.xml中注册,让MyBroadcastReceiver 接收一条aaaaaa广播

<receiver android:name=".MyBroadcastReceiver">
            android:enabled="true"
            android:exported="true"
            <intent-filter>
                <action android:name="aaaaaa"/>
            </intent-filter>
 </receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2:有序广播

和标准广播不一样的就是接收器的接收有先后顺序,且前面可以将广播截断
Intent intent = new Intent(“aaaaaa”);
sendOrderedBroadcast(intent,null) ; //第二哥参数是和权限有关的直接null

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("测试测试测试", "onReceive: 收到广播aaaaaa");
        abortBroadcast();//表示截断广播
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在AndroidManifest.xml中注册,让MyBroadcastReceiver 接收一条aaaaaa广播,不一样的就孙有优先级

<receiver android:name=".MyBroadcastReceiver">
            android:enabled="true"
            android:exported="true"
           <intent-filter android:priority="100">  //优先级越高越先接收到
                <action android:name="aaaaaa"/>
            </intent-filter>
 </receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3:本地广播

以上广播都是全局的被其他应用也能接收,很不安全,本地广播只能在本app内应用。
本地广播需要获取示列;

LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(mContext);//获取广播实列

       Intent intent = new Intent("aaaaaa");
        localBroadcastManager.sendBroadcast(intent) ;//发送广播
        
  public class MyBroadcastReceiver extends BroadcastReceiver {   
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("测试测试测试", "onReceive: 收到广播aaaaa");
    }
}

 MyBroadcastReceiver screen=new  ScreenBroadcastReceiver ();//实例化一下广播接收器
    IntentFilter filter = new IntentFilter();//添加一个过滤器只接受“aaaaaaa”广播
    filter.addAction("aaaaaa");
    localBroadcastManager.registerReceiver(screen, filter);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

四、常用的系统广播

这些广播是手机系统发送的我们只需要接收就行

监听网络变化 android.net.conn.CONNECTIVITY_CHANGE
关闭或打开飞行模式 Intent.ACTION_AIRPLANE_MODE_CHANGED
充电时或电量发生变化 Intent.ACTION_BATTERY_CHANGED
电池电量低 Intent.ACTION_BATTERY_LOW
电池电量充足(即从电量低变化到饱满时会发出广播) Intent.ACTION_BATTERY_OKAY
系统启动完成后(仅广播一次) Intent.ACTION_BOOT_COMPLETED
按下照相时的拍照按键(硬件按键)时 Intent.ACTION_CAMERA_BUTTON
屏幕锁屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS
插入耳机时 Intent.ACTION_HEADSET_PLUG
未正确移除SD卡但已取出来时(正确移除方法:设置-SD卡和设备内存-卸载SD卡) Intent.ACTION_MEDIA_BAD_REMOVAL
成功安装apk Intent.ACTION_PACKAGE_ADDED
成功删除apk Intent.ACTION_PACKAGE_REMOVED
重启设备 Intnet.ACTION_REBOOT
屏幕被关闭 Intent.ACTION_SCREEN_OFF
屏幕被打开 Intent.ACTION_SCREEN_ON

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/350241
推荐阅读
相关标签
  

闽ICP备14008679号