" 介绍: broadcastReceiver是android的四大组件之一,大部分的广播是系统发出来


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


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,苹果还是苹果,暴雪还是暴雪,而这些牛人离开了公司,自己什么都不是。