广播/广播接收器

1.Android提供了一套完整的API,允许应用程序自由的发送和接受广播,发送广播借助于我们之前学过的:Intent,而接收广播需要借助于广播接收器(Broadcast Receiver)
2.广播的类型主要分为两种:标准广播和有序广播。
标准广播:一种完全异步执行的广播,在广播发出之后,所有接收器几乎在同一时刻接收到这条广播消息,因此它们之间没有任何的先后顺序可言,这种广播的效率会比较高,但是同时也意味着它无法被截断的。
有序广播:一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到这条广播,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,所以这种广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
3.注册广播的方式一般有两种,在代码中注册称为动态注册(继承BroadcastReceiver,重写BroadcastReceiver里面的onReceiver方法动态注册),在AndroidManifest.xml中注册称为静态注册。动态注册的广播接收器可以自由的控制注册和注销,在灵活性方面有很大的优势,但是只能在程序启动后才能接收到广播,因为逻辑是写在onCreate()方法中。使用静态注册就可以在程序没有启动的前提下接收到广播
4.让程序接收一条开机广播,当收到这条广播时就可以在onReceive()方法里执行相应的逻辑,从而实现开机启动的功能。可以使用Android Studio提供的快捷方式来创建一个广播接收器,右击com.example.broadcasttest 包→New -> Other -> Broadcast Receiver,
将广播接收器命名为BootCompleteReceiver,Exported 属性表示是否允许这个广播接收器接收本程序以外的广播, Enabled属性表示是否启用这个广播接收器。勾选这两个属性,点击Finish完成创建。



权限添加

5.自定义广播

  • 定义一个广播接收器来接收广播,新建一个MyBroadcastReceiver继承BroadcastReceiver,重写onReceiver
  • 修改AndroidManifest.xml,让MyBroadcastReceiver
    接收"com.example.broadcasttest.MY_BROADCAST"的广播
 <receiver
            android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
            </intent-filter>
        </receiver>
  • 修改activity_ main.xml 中的代码,定义一个按钮
  • MainActivity中为按钮添加监听,构建一个Intent对象,并把要发送的广播的值传入,然后调用了Context
    的sendBroadcast()方法将广播发送出去,这样所有监听"com.example.broadcasttest.MY_BROADCAST"
    这条广播的广播接收器就会收到消息
    ?未响应问题解决方法:
    Intent intent=new Intent(“com.example.broadcasttest.MY_BROADCAST”);
    intent.setComponent(new ComponentName(getPackageName(),“com.example.broadcasttest.MyBroadcastReceiver”));
    //第一个参数是目标广播接收器所在应用的包名,第二个参数是目标广播接收器类全路径(即MyBroadcastReceiver类的路径)。
    sendBroadcast(intent);
    原因分析:自定义广播接收器,采用静态注册的方式,在Android8.0以及更高的版本中无法收到广播信息。需要给intent添加Component或者setPackage也行,就是需要更明确的指定处理这个intent的组件信息。
    6.设置优先级,截至传递
<intent-filter android:priority="100">
                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>

//截断广播
abortBroadcast();
7.本地广播机制
为了能够简单地解决广播的安全性问题,Android引人了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。
本地广播的用法并不复杂,主要就是使用了一个LocalBroadcastManager,来对广播进行管理,并提供了发送广播和注册广播接收器的方法。

  • 新建一个本地接收器LocalReceiver的类,继承BroadcastReceiver,重写方法。
  • 新建LocalReceiver和 LocalBroadcastManager对象
  • onCreate(中
    //获取实例
 localBroadcastManager = LocalBroadcastManager.getInstance(this);
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
//发送本地广播
localBroadcastManager.sendBroadcast(intent);
 - intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
//注册本地广播监听器
protected void onDestroy() {
        super.onDestroy();
        //取消注册
        localBroadcastManager.unregisterReceiver(localReceiver);
    }
  • 使用本地广播的优势
    可以明确地知道正在发送的广播不会离开我们的程序,因此不必担心机密数据泄漏。
    其他的程序无法将广播发送到我们程序的内部,因此不需要担心会有安全漏洞的隐患。
    发送本地广播比发送系统全局广播将会更加高效。
    8.实现强制下线
  • 创建一个ActivityCollector类来管理所有活动
  • 然后创建BaseActivity类作为所有活动的父类
  • 创建一个登录界面的活动,新建LoginActivity,并让Android Studio
    帮我们自动生成相应的布局文件。然后编辑布局文件activity_ login.xml,编写登录布局
  • 改LoginActivity中的代码:获取控件中的内容,为Button添加监听,如果帐号密码正确,利用INTENT.startActivity(),实现跳转,否则,Toast提示错误
  • 可以将MainActivity作为登录成功后的主页面,在主页面添加强制下线功能
  • activity_main.xml设置按钮强制下线
  • MainActivity中对按钮进行监听,Intent,sendBroadcast()广播值
  • 修改BaseActivity中的代码
    构建接受器,由于需要弹出一个对话框,而静态注册是无法弹出对话框这种UI控件的,因此需要动态注册接收器。
  • 在onResume中注册接收器,因为始终需要在栈顶的活动才能接受这条广播,非栈顶的不需要,因此在onresume中注册,在onPause中注销
  • AndroidManifest.xml中将主活动设置为登录活动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值