您的位置:首页 > 移动开发 > Android开发

Android四大组件之一——广播

2016-06-21 00:00 447 查看
BroadCastReceiverwhat?(是什么)广播接收器是一个专注于接收广播通知信息,并作出对应处理的组件。how?(怎么使用)你的应用可以使用它对外部应用过滤,只对感兴趣的外部事件进行处理和反应。静态注册:在清单文件下:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
动态注册,在代码中
IntentFilter intent = new intentFilter();
intent.addAction(String);
registterReceiver(BrodCastReceiver,intentfilter);//第一个参数可以是自定义的广播。
一般:在onStart中注册,onStop中取消unregisterReceiver  指定广播目标Action:Intent intent = new Intent(actionString);  并且可通过Intent携带消息 :intent.putExtra("msg", "hello,我通过广播发送消息了");
廣播的發送有:
普通廣播:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Action。
context.sendBrodCast(intent);
有序廣播:通過Context.SendBroadCast();來發送。
context.sendBroadCast(intent,receiverpermission);//第二個參數是優先級,範圍在-1000 ----1000之間
所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播——不传播给其他receiver。 而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行。when?(何时使用)例如:电量低---ACTION_BATTERY_LOW,ACTION_TIME_CHANGED(系统时间改变时触发),需要注意的是,如果需要完成一次耗時的操作,時間超過10秒的。就通過發送intent給service,不能使用工作線程來操作why?{為什麼)1它生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息,如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver的所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的2. 动态注册广播接收器还有一个特点,就是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用系统常见广播Intent,如开机启动、电池电量变化、时间改变等广播
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: