##广播接收者的特点:BroadcastReceiver组件
即使应用程序的进程不存在,当广播事件到来的时候,广播接受者的进程会自动的启动,响应广播事件
4.0,点击了强行停止后,就把某一个程序个冻结了,想要恢复需要手动恢复
6.0最大的改动是 权限机制
> 电量不足,sd卡被移除,电话外拨,短息到了等等各种各样的事件...
(1):广播接受者的创建
1,写一个类继承BroadcastReceiver
class SDCardStatusReceiver extends BroadcastReceiver
OnReceive();方法,表示接受到广播的时候调用
当我们在广播接收者里面开启activity的时候,因为广播接收者的上下文是不包含任务栈的,
因此直接开启activity会报错,怎么样才能不报错?(提示:加一个flag)
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
2,清单文件中配置Receiver
<receiver android:name="com.itheima.sdstatus.SDCardStatusReceiver" > 类的全路径名
3,设置action(文件过滤器里面)
<intent-filter> (调到对应的频道)
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
//指定数据类型
<data android:scheme="file"></data>
</intent-filter>
(2):广播事件的类型
* 无序广播
> 广播消息没有顺序,同时接受广播消息. 效率高.
sendBroacast();
* 有序广播
> 广播消息是按照一定的顺序传达的, 高优先级的先得到广播消息,低优先级的后得到,高优先级的可以拦截广播消息或者修改广播消息. 效率比较低.
sendOrderdBroadcast(七个参数);
静态广播(在清单文件中配置)
动态广播(用代码的方式注册广播)
注意:四大组件,只有广播提供者可以new出来其他的都不能
动态注册广播使用到的api大致有:
//注册广播接受者
receiver = new XXXXXX();
//类似于清单文件中你的文件过滤器
IntentFilter filter = new IntentFilter();
//相当于清单文件里面的action标签
filter.addAction("android.intent.action.SCREEN_OFF");
filter.addAction("android.intent.action.SCREEN_ON");
//最后注册广播
registerReceiver(receiver, filter);
(3):取消广播接受者(有注册一定要在当前activity销毁的时候要取消广播)
如果activity结束了,广播接受者还在存在着就会爆出内存泄漏.ManiActivity has leaked IntentReceiver异常
即使不取消系统也会自动取消,因为导致了内存泄漏了(所以我们不想让logcat里面爆出日志信息实现下面代码即可)
在onDestroy()方法里面
unregisterReceiver(receiver);
receiver=null;
##特殊广播事件
> 在android里面有一些产生非常频繁的广播事件,在清单文件里面配置是不会生效.(因为对内存消耗比较大(如果一下子来了三十个进程),
且耗电,因为即使应用程序的进程不存在,
当广播事件到来的时候,广播接受者的进程会自动的启动,响应广播事件)
> 电量变化 屏幕锁屏/解锁 这些广播事件只能利用代码注册.(动态广播)
系统常见的一些频道
//SD卡的指定频道
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
//手机的开机启动的广播频道指定(4.0需要一个权限 RECEIVER_BOOT_COMPLETED)
<action android:name="android.intent.action.BOOT_COMPLETED"/>
//电话外播频道
<action android:name="android.intent.action.NEW_OUTGOING_CALL>
//短信 (需要添加权限RECEIVE_SMS...)侵犯了隐私4.0之后被谷歌屏蔽了
<action android:name="android.intent.android.provider.Telephony.SMS_RECEIVED>
//屏幕频道
<action android:name="android.intent.action.SCREEN_OFF"/>
<action android:name="android.intent.action.SCREEN_ON"/>