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

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

2016-03-26 15:12 465 查看
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 的销毁的时候 去 解除注册;



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

 

_______________

 

 

 


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android