广播、应用Android BroadcastReceiver(一)by小雨

摘要:
有序的broadcasts是同时发送给一个receiver。BroadcastReceiver不能处置startActivity()法方发送出来的Intent,没有种这制机;一样的,当广播一个Intent,一样不能找到或者启动一个activity。如果是用registerReceiver注册Receiver,任何应用都有可能发送广播到那个receiver。ReceiverLifecycleBroadcastReceiver对象只有在用调onReceive法方是才效有.一旦从这个法方里头回返,统系会为认这个对象经已成完并且不在处于活动状态。特别情况下,在BroadcastReceiver里头可能不会表现一个dialog或者绑定一个service。

每日一贴,今天的内容关键字为广播、应用-

Android BroadcastReceiver

分析: broadcastReceiver是android的四大件组之一,大部分的广播是统系收回来的。例如,屏幕闭关,电池电量缺乏等等。应用一样可以建创广播,例如:当下载成完的时候,要让其他的应用道知这个情况,要需用到broadcastreceiver,receiver没有面界,它可能会建创一个status bar notification知通用户。broadcastreceiver 只是会做一些非常小的作工,例如,它可以动身一个service作工。

基类的码代会收到sendBroadcast()发送过去的Intents.

如果不要需在应用之间发送广播,可以虑考应用LocalBroadcastManager替代上面分析的式方。种这式方会有更好的性能,并且用不虑考不同应用之间的安全问题,因为其他的应用有可能可以收接这个广播。

可以用Context.registerReceiver()态动注册receiver或者是在AndroidManifest.xml文件里通过<receiver>元素静态注册receiver。

注意: 如果在Activity.onResume()里头注册一个receiver,那么必须在Activity.onPause()法方里头销注这个receiver。不要在Activity.onSaveInstanceState()法方里头销注receiver,因为当用户回到史历堆栈中不会用调它。

这里有两种主要的广播可以收到:

  • 常正的 broadcasts(Context.sendBroadcast发送的) 都是异步的. 有所的receiver都是没有次序的,通常在同一时间。种这式方效率更好,这意味着receiver不能应用结果或者止终API。
  • 有序的 broadcasts(Context.sendOrderedBroadcast发送的) 是同时发送给一个receiver。因为个一每receiver按照次序执行,那么就能够传递结果到下一个receiver,或者它可以完整止终广播,已达到不传递给下一个receiver。有序的receiver运行的时与android:priority有关系,这个性属可以控制它执行次序;如果receiver具有一样的priority,那么它们的执行次序是意任的。

即使在常正的广播中,统系在有些情况下会把广播同时发给一个receiver。在特别条件下,可能要需建创一个进程来处置receiver,在某一时间点只有一个receiver会运行,为了防止超负荷作工是统系可能建创新的进程。在种这情况下,然而,这些receiver还是不能够回返结果和止终他们的广播。

要需注意,即使Intent类被用来发送和收接广播,Intent 广播与启动activity的制机是完整不同的。BroadcastReceiver 不能处置startActivity()法方发送出来的Intent,没有种这制机;一样的,当广播一个Intent,一样不能找到或者启动一个activity。这两种操纵在语义上是完整不同的:通过Intent启动一个activity是一个前台操纵,这是随着用户的操纵而产生的变改;广播一个Intent是一种后台操纵,用户是不能意想到的.

上面有三个主题的内容:

  1. Security
  2. Receiver Lifecycle
  3. Process Lifecycle

Security

receiver通常是应用之间通信的一个工具,因此必须虑考其他的应用可能如何滥用它们。要需虑考的问题有:

  • Intent的命名空间是全局的。要证保定义的action名字和其他的字符串都是属于自己的应用,要不然会识意无的与统系其他的突冲。

  • 如果是用registerReceiver(BroadcastReceiver, IntentFilter)注册Receiver, 任何应用都有可能发送广播到那个receiver。可以通过定义permissions控制谁能发送广播给它。

  • 在manifest里头定义receiver,并且定义了intent-filters, 任何应用都可以略忽指定的滤过条件并发送广播给它。为了止防其他的应用发送广播给它,在在manifest里头定义android:exported="false",这样其他的应用就不能发送广播到这个receiver了。

  • sendBroadcast(Intent) 或者相干的法方,常正情况,其他的应用可以收到这个广播。要需通过定义permission控制可以接受这个广播的receiver。或者是,从 ICE_CREAM_SANDWICH开始,可以同通过设置Intent.setPackage来指定receiver

LocalBroadcastManager就不会有这个些问题,从广播收回后,都不会出前当进程。

receiver和broadcast都可以设置问访权限。

为了在发送的时候执行permission,必须供给一个非空的permission数参给sendBroadcast(Intent, String)或者sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle). 仅仅定义这个permission的receiver可以收接广播(AndroidManifest.xml里头定义<uses-permission>)。

当收到执行权限时,在注册receiver的时候要需供给一个非空的permission数参--要么当用调registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)或者是在AndroidManifest.xml文件里头定义一个静态的<receiver>. 只有授予了指定permission的广播才能够发送到receiver中。

Receiver Lifecycle

BroadcastReceiver 对象只有在用调onReceive(Context, Intent)法方是才效有. 一旦从这个法方里头回返,统系会为认这个对象经已成完并且不在处于活动状态。

这里是当实现onReceive(Context, Intent)时要需注意: 任何要需异步的操纵是不可行的,因为要需从法方里头回返,但是法方又要处置异步的操纵,这样就能够行了,种这情况下,统系会在异步操纵成完之前可能会杀死BroadcastReceiver的进程。

特别情况下,在BroadcastReceiver里头可能不会表现一个dialog或者绑定一个service。对于前者,用NotificationManager API替代,对后者,可以用Context.startService()发送令命给service。

Process Lifecycle

前当正在运行的BroadcastReceiver(运行在onReceive(Context, Intent)法方上)进程要需被为认是前台进程,并且会直一运行除非是统系的内存处于极限情况下(统系会回收内存)。

一旦从onReceive()回返,BroadcastReceiver不再是活动状态的,它运行的进程与其他运行的在它里头的应用件组一样主要,这是非常特别并且非常主要的,因为那个进程只是为BroadcastReceiver服务,然后receiver从onReceive()里头回返,统系会为认这个进程是空的并且会尽快杀死它回收资源。

这就意味着,如果是一个长时间运行的操纵,最好是用service和BroadcastReceiver 结合应用,为了坚持进程在全部操纵中久持运行。

文章结束给大家分享下程序员的一些笑话语录: 很多所谓的牛人也不过如此,离开了你,微软还是微软,Google还是Google,苹果还是苹果,暴雪还是暴雪,而这些牛人离开了公司,自己什么都不是。

免责声明:文章转载自《广播、应用Android BroadcastReceiver(一)by小雨》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇笔记之Cyclone IV第一卷第四章Cyclone IV器件中的嵌入式乘法器旋转字体的设置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android开发人员不得不收集的代码(不断更新中...)

尺寸相关 dp与px转换 sp与px转换 各种单位转换 在onCreate()即可获取View的宽高 ListView中提前测量View尺寸 手机相关 判断设备是否是手机 获取当前设备的IMIE,需与上面的isPhone一起使用 获取手机状态信息 是否有SD卡 获取MAC地址 获取手机厂商,如Xiaomi 获取手机型号...

canvas动画—圆形扩散、运动轨迹

介绍 在ECharts中看到过这种圆形扩散效果,类似css3,刚好项目中想把它用上,but我又不想引入整个echart.js文件,更重要的是想弄明白它的原理,所以自己动手。在这篇文章中我们就来分析实现这种效果的两种方法,先上效果图: 实现原理 通过不断的改变圆的半径大小,不断重叠达到运动的效果,在运动的过程中,设置当前canvas的透明度context....

SpringBoot启动过程中涉及到了扩展接口

SpringApplicationRunListener接口 1、ApplicationListener接口 是ApplicationContext的事件监听器 2、EnvironmentPostProcessor接口 上下文环境后置处理器,事件中调用 3、PropertySourceLoader接口 自定义配置文件加载器,自己解析配置文件属性...

canvas基础—图形变换

1、canvas转换方法 1.1canvas转换方法 二、canvas实现图形的中心点旋转 step1:获取canva元素并指定canvas的绘图环境 var canvas=document.getElementById('canvas'); var context=canvas.getContext('2d'); step2:在画布(1...

Android开发高级进阶——多进程间通信

一. 什么是多进程? 多进程就是多个进程的意思,那么什么是进程呢? 当一个应用在开始运行时,系统会为它创建一个进程,一个应用默认只有一个进程,这个进程(主进程)的名称就是应用的包名。 进程的特点: 进程是系统资源和分配的基本单位,而线程是调度的基本单位。 每个进程都有自己独立的资源和内存空间 其它进程不能任意访问当前进程的内存和资源 系统给每个进程分...

context.startActivity时报错startActivity() from outside of an Activity context require the FLAG_ACTIVITY_NEW_TASK flag

源代码如下: 1 public class ReceiveHandler extendsBroadcastReceiver{ 2 3 private final String ACTION_RECE_LinkReply="com.hutao.linkRequestReceive"; 4 privateContext context; 5...