文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

详解 Android 中的广播机制

2024-12-02 16:01

关注

Android 提供了一整套的 API,允许应用程序自由地发送和接受广播

今天我们就来详细介绍下

一. 广播介绍

1、标准广播

2、有序广播

3、粘性广播

二、广播详解

Android 内置了很多系统级别的广播,我们可以在应用中通过监听这些广播来得到各种系统的状态信息。比如手机开机后会发送一条广播,电池的电量发生变化会发出一条广播,时间或时区发生改变也会发出一条广播等等;

注册广播方式一般有两种:

动态注册在代码中注册;

静态注册在 AndroidManifest.xml 中注册

1、静态注册

一般为常驻广播,在AndroidManifest.xml里通过标签声明

  1. name=".MyBroadcastReceiver"  android:exported="true"
  2.      
  3.         <action android:name="android.intent.action.BOOT_COMPLETED"/> 
  4.         <action android:name="android.intent.action.INPUT_METHOD_CHANGED" /> 
  5.      
  6.  

intent过滤器里指定的是接收器订阅的action;

2、动态注册

非常驻广播,在使用时注册,用完及时销毁;

  1. BroadcastReceiver br = new MyBroadcastReceiver(); 
  2. IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 
  3.     filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); 
  4.     this.registerReceiver(br, filter); 

记得及时注销,以免内存泄漏;

  1. @Override 
  2.  protected void onDestroy() { 
  3.      super.onDestroy(); 
  4.      unregisterReceiver(receiver); 
  5.  } 

3、自定义广播

注册广播

  1.  
  2.             android:name=".test.MyBroadcastReceiver" 
  3.             android:enabled="true" 
  4.             android:exported="true"
  5.              
  6.                 <action android:name="com.test.test" /> 
  7.              
  8.    
  9. public class MyBroadcastReceiver extends BroadcastReceiver { 
  10.     @Override 
  11.     public void onReceive(Context context, Intent intent) { 
  12.         Toast.makeText(context,"发送标准广播",Toast.LENGTH_LONG).show(); 
  13.     } 
  14.   Intent intent = new Intent("com.test.test"); 
  15.                  sendBroadcast(intent); 
  16. //发送有序广播 
  17.  Intent intent = new Intent("com.test.test"); 
  18.                  sendOrderedBroadcast(intent,null);  

4、本地广播

我们发送和接受的广播全部属于系统全局广播,即发出的广播可以被其它任何应用程序接收到,并且我们也可以接受来自于其它任何应用程序的广播;

为了解决广播安全性问题,Android 引入了一套本地广播机制,使用这个机制发出的广播只能在应用程序内部进行传递,并且广播接受器也只能接受来自本应用程序发出的广播,这样所有的安全性问题就都不存在了;

初始化广播:

  1. private LocalBroadcastManager localBroadcastManager; 
  2.    private void init() { 
  3.        //获取实例 
  4.        localBroadcastManager = LocalBroadcastManager.getInstance(this); 
  5.        IntentFilter intentFilter = new IntentFilter(); 
  6.        intentFilter.addAction("om.test.LOCAL_BROADCAST"); 
  7.        LocalReceiver localReceiver = new LocalReceiver(); 
  8.        localBroadcastManager.registerReceiver(localReceiver, intentFilter); 
  9.    } 
  10. Intent intent = new Intent("om.test.LOCAL_BROADCAST"); 
  11.        localBroadcastManager.sendBroadcast(intent); 
  12. 定义 
  13.    private class LocalReceiver extends BroadcastReceiver { 
  14.        @Override 
  15.        public void onReceive(Context context, Intent intent) { 
  16.            Toast.makeText(context, "本地广播.....", Toast.LENGTH_LONG).show(); 
  17.        } 
  18.    } 

优点:

5、带权限的标准广播

发广播

当调用sendBroadcast(Intent, String)或sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)时,可以指定权限参数;

  1. sendBroadcast(new Intent("com.test"), 
  2.               Manifest.permission.SEND_SMS); 

要想接收这个广播,那么这个接收的app必须申请该权限

  1. name="android.permission.SEND_SMS"/> 

接收广播

如果在注册广播接收器时指定了权限参数(使用registerReceiver(BroadcastReceiver,IntentFilter,String,Handler)或清单文件中的里),则只有在清单文件中使用请求权限的广播发送者才可以将Intent发送给接收者;

在清单文件中声明:

  1. name=".MyBroadcastReceiver" 
  2.           android:permission="android.permission.SEND_SMS"
  3.      
  4.         <action android:name="com.test"/> 
  5.      
  6.  

在注册的时候声明:

  1. IntentFilter filter = new IntentFilter("com.test); 
  2. registerReceiver(receiver, filter, Manifest.permission.SEND_SMS, null ); 

要给它发消息,那广播发送的app就必须得申请获得相应的权限才行:

  1. name="android.permission.SEND_SMS"/> 

总结

动态注册广播不是常驻型广播,也就是说广播跟随Activity的生命周期。注意在Activity结束前,移除广播接收器;

静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行;

当广播为有序广播时:优先级高的先接收(不分静态和动态)。同优先级的广播接收器,动态优先于静态;

同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的;

当广播为默认广播时:无视优先级,动态广播接收器优先于静态广播接收器。同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后册的;

本文转载自微信公众号「Android开发编程」

来源:Android开发编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯