zoukankan      html  css  js  c++  java
  • 广播、应用Android BroadcastReceiver(一)by小雨

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

        

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

  • 相关阅读:
    树上问题
    Windows Server 2012 安装dll到GAC
    一妹子开车发现车不动,男友听完她电话崩溃了
    各浏览器对 window.open() 的窗口特征 sFeatures 参数支持程度存在差异
    FullCalendar日历插件说明文档
    Request url 各种属性值
    Your Job Is Not to Write Code
    Nice way for strip_tags a like
    sqlserver 三种恢复模式
    ASP.NET路由
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3024019.html
Copyright © 2011-2022 走看看