1 为什么需要广播接收者(broadcastReceiver)
(1)老年人
(2)出租车司机
(3)寂寞的大学生 情感夜话 卖药的 音乐台
(4)想听广播必须的有电台 你在买一个收音机 安装一块电池 调到一个合适的频道
(5)Android系统内部相当于已经有一个电台 定义了好多的广播事件 比如外拨电话 短信到来 sd卡状态 电池电量变化....
(6)谷歌工程师给我们定义了一个组件专门用来接收这些事件的
(7)谷歌工程师为什么要设计这样一个组件 目的就是为了方便开发者进行开发
(8)javase javaee javame
——————————————————————————————
定义广播接收者:
(1)记住 和activity一样 在定义 广播接收者的时候 后面是以 Receiver 结尾。
这个类要继承 BroadCastReceiver
(2)记住要在清单文件中配置.
onReceive()
这个方法是 接收到你发的 广播事件的时候 会执行这个方法。
但是当你 配置了两个 事件的时候。
不管你接收到 哪个事件的广播 都会执行 onReceive方法.
当你去实现IP拨号器 的时候 记住加上权限;
android.permission.PROCESS_OUTGOING_CALLS
当我们注册的 这个 事件 OUTGOING 一旦被执行,那么 OnReceive就会执行。
也就是说 一旦打电话 OnReceive 就会执行.
我们首先要拿到 广播事件的数据。
使用getResultData();
你在清单文件中 定义的 广播事件 是什么 就返还给你 当前执行的这个 广播事件的数据。
同理我们使用setResultData();设置接收到的播放数据.
_____________
String action = intent.getAction();我们在onReceive方法中
使用这个方法 可以获得 当前广播事件的类型。
小细节:
当你想对SD卡的事件 进行监听的时候必须要加上:
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<action android:name="android.intent.action.MEDIA_REMOVED" />
这三个时间都要加上 这个约束.
——————
有一个问题 ,谷歌开发者为了 方便用户的开发。
只要你安装了 这个 广播接收者的这个程序。 就算你没有打开这个进程。
只要你运行了 这个程序所监听的广播事件。
那么 这个程序会自动的运行在进程中来接收你的监听的内容。
这里的第一步用 intent.getExtras()方法,用来获取一个map 在intent 中。
然后在使用get 方法 获取map 中 key 为 "pdus" 的对象。
pdu :协议数据单元(Protocol Data Unit),是一种短信格式
pdus 就是多条 短信.
——————————————————————————————
定义广播接收者:
(1)记住 和activity一样 在定义 广播接收者的时候 后面是以 Receiver 结尾。
这个类要继承 BroadCastReceiver
(2)记住要在清单文件中配置.
onReceive()
这个方法是 接收到你发的 广播事件的时候 会执行这个方法。
但是当你 配置了两个 事件的时候。
不管你接收到 哪个事件的广播 都会执行 onReceive方法.
当你去实现IP拨号器 的时候 记住加上权限;
android.permission.PROCESS_OUTGOING_CALLS
当我们注册的 这个 事件 OUTGOING 一旦被执行,那么 OnReceive就会执行。
也就是说 一旦打电话 OnReceive 就会执行.
(3)当我们配置的action 的事件发生了 onReceive方法就会执行
我们首先要拿到 广播事件的数据。
使用getResultData();
你在清单文件中 定义的 广播事件 是什么 就返还给你 当前执行的这个 广播事件的数据。
同理我们使用setResultData();设置接收到的播放数据.
_____________
String action = intent.getAction();我们在onReceive方法中
使用这个方法 可以获得 当前广播事件的类型。
小细节:
当你想对SD卡的事件 进行监听的时候必须要加上:
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<action android:name="android.intent.action.MEDIA_REMOVED" />
这三个时间都要加上 这个约束.
——————
有一个问题 ,谷歌开发者为了 方便用户的开发。
只要你安装了 这个 广播接收者的这个程序。 就算你没有打开这个进程。
只要你运行了 这个程序所监听的广播事件。
那么 这个程序会自动的运行在进程中来接收你的监听的内容。
这里的第一步用 intent.getExtras()方法,用来获取一个map 在intent 中。
然后在使用get 方法 获取map 中 key 为 "pdus" 的对象。
pdu :协议数据单元(Protocol Data Unit),是一种短信格式
pdus 就是多条 短信.
SmsMessage类是用来创建短信的,也只管创建,比如设置短信内容,计算短信长度。 SmsManager类是用来发送短信的。
记住要加上:这个权限android.permission.RECEIVE_SMS
如果你把activity 里面的 intent-fliter 删除,那就没有图标了 就可以后台运行.
______________
卸载安装:
注意你实现 package的操作的广播事件的时候 一定要配置
下面这个data的约束
但是你会发现有两个 安装,第一个是 Install 这个占时没有作用,是谷歌开发工程师
预留出来的。
_____
手机重启广播监听:
<action android:name="android.intent.action.BOOT_COMPLETED" />
记住需要加权限:android.permission.RECEIVE_BOOT_COMPLETED
需要注意一点 就是,如果你要在 onReceive方法里面使用.
StartActivity这个方法的时候,记住需要Context.startActivity();
然后就会报错:
09-08 03:26:15.926: E/AndroidRuntime(1152): java.lang.RuntimeException: Unable to start receiver com.itheima.bootreceiver.BootReceiver: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
这个错误就是说,你在activity外部 开启一个activity,那么你就需要 开启一个任务栈。
因为 我们前面说过,activity 就是用任务栈 来进行存储的。
所以我们要在开启activity 前面加上::::::::intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
如果我们把父类的方法屏蔽了,那么后退键 就没用了。
————————————————
自定义广播:
分别为无序和有序两种广播形式
有序广播需要配置优先级:
<intent-filter android:priority="1000" > priority是int 类型的;
有一个API :
abortBroadcast();
可以终止 广播。
无序广播:类似新闻联播:广播不可以被终止 数据不可以被修改
有序广播:类似中央发送的红头文件 按照优先级一级一级的接收 有序广播可以被终止 数据可以被修改
记住有序广播中有一个sendOrderedBroadcast();里面的resultReceiver参数;
是最终的结果 返回给这个 Reveicer 不需要再清单文件中定义。直接获取内容即可
————————————————
特殊广播接收者:
比如操作特别频繁的广播事件 屏幕的锁屏和解锁 电池电量的变化
这样的广播接收者在清单文件里面注册无效
所以我们只能动态的去注册,不能在清单文件中注册。
但是当我们点后退按钮时报错了 ;
09-08 07:25:42.239: E/ActivityThread(2173): Activity com.itheima.screen.MainActivity has leaked IntentReceiver com.itheima.screen.ScreenReceiver@b6486088 that was originally registered here. Are you missing a call to
unregisterReceiver()?
这个错误是说要你在 activity 的销毁的时候 去 解除注册;
因为这些频繁操作的 广播,如果不这样去设计,那么 如果每个应用都写了这个功能,那么 只要收到广播,所有有关的应用后台都会自动启动去接收,那么就会浪费内存.
_______________