BroadcastReceiver—使用(III)

   3. 生命周期

  描述了 Android 中广播的生命周期,其次它并不像 Activity 一样复杂,运行原理很简单如下图:

BroadcastReceiver—使用(III)_第1张图片

 生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报错。

  每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 . 所以在BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR(Application No Response) 的对话框.

        怎么用好 BroadcastReceiver

    如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的

  所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的.

  广播类型及广播的收发
  广播类型

   普通广播 (Normal broadcasts)

  发送一个广播,所以监听该广播的广播接收者都可以监听到改广播。
  异步广播 , 当处理完之后的Intent ,依然存在,这时候registerReceiver(BroadcastReceiver,IntentFilter) 还能收到他的值,直到你把它去掉 , 不能将处理结果传给下一个接收者 , 无法终止广播. 


   有序广播 (Ordered broadcasts)

        广播的收发

  该组件接收被广播的 intent,Context 可以通过 sendBroadcast() 和 sendOrderedBroadcast()
  方法实现广播的发送.

  首先在需要发送信息的地方 ,把要发送的信息和用于过滤的信息 ( 如 Action 、 Category) 装入一个 Intent 对象 ,然后通过调用 Context.sendBroadcast() 、 sendOrderBroadcast() 或 sendStickyBroadcast() 方法,把 Intent 对象以广播方式发送出去。

  使用 sendBroadcast() 或 sendStickyBroadcast() 方法发出去的 Intent ,所有满足条件的 BroadcastReceiver 都会随机地执行其 onReceive() 方法

   普通广播的发送和接收:

sendBroadcast(intent);
Intent intent = new Intent( "cn.lenovo.yangguangf " );
sendBroadcast(intent);



     priority :这个是 AndroidManifest.xml 中 intent-filter 的参数。

< receiver android:name = ".MyBroadcastReceiver" >
< intent-filter android:priority = "1000" >
< action android:name = "cn.lenovo.yangguangfu" />


你可能感兴趣的:(BroadcastReceiver—使用(III))