Android 第七天重置版_BroadCastReceiver_注意事项

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 就会执行.


(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 的销毁的时候 去 解除注册;


因为这些频繁操作的 广播,如果不这样去设计,那么 如果每个应用都写了这个功能,那么 只要收到广播,所有有关的应用后台都会自动启动去接收,那么就会浪费内存.

 

 

_______________

 

 

 











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值