关闭

Android基础知识整合篇——广播接收器知识点

标签: androidbroadcastreceiver
425人阅读 评论(0) 收藏 举报
分类:


    好的,我又来完成我的个人第一个连载博客了,上次介绍的是Activity相关的基础知识,这次为大家带来广播接收器的相关解释和说明。希望博客能给诸位一点小小的帮助,也就是对我博客最大的鼓励!

四大组件——BroadcastReceiver

广播分类:

标准广播:是一种完全异步执行的广播,它无法被截断,广播发出后,所有的接收器都能在同一时刻收到广播消息,因此没有先后顺序,所以它的效率比较高。

有序广播:是一种同步执行的广播,广播发出后只有一个接收器收到它,处理完成后再继续往下传播,因此这时广播存在先后顺序。优先级高的接收器可以优先接收,并且广播可以被截断。

 

广播接收器:可以自由的对感兴趣的广播进行注册,注册方式一般有两种:

动态注册:在代码里新建实例来进行注册。

先定义成员变量,再新建实例

intentFilter=new intentFilter();
intentFilter.addAction(“android.net.conn.CONNECTIVITY_CHANGE”);
networkChangeReceiver=new NetWorkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter);

别忘了注册完成后,在活动销毁时注销接收器释放系统资源!

protected void onDestroy(){
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}

接收广播需要新建类并继承BroadcastReceiver重写onReceive方法

class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
Toast.makeText(context,”network changes”,Toast.LENGTH_SHORT).show();
}
}

通过onReceive方法接收到广播后打印消息

 

静态注册:在AndroidMainifest.xml里添加标签。

新建一个Receiver类继承BroadcastReceiver如下:

public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
Toast.makeText(context,”Complete”,Toast.LENGTH_SHORT).show();
}
}

<receiver android:name=”.MyReceiver”></receiver>静态注册

 

发送自定义广播

发送前,要先定义个标签用来标示广播

<receiver android:name=”.MyBroadcastReceiver”>
<intent-filter>
<action android:name=”包名.MY_BROADCAST”/>
</intent-filter>
</receiver>

然后用Intent识别标签并发送广播:

Intent intent=new Intent(“包名.MY_BROADCAST”);
sendBroadcast(intent);

此时发出的就是一条标准广播。然而发送有序广播的不同点就是在<intent-filter>

里加入权限级别<intent-filter android:priority=”100”>,priority表示接收广播的级别"2147483647"为最高优先级,这样优先级高的就会先收到广播,中断广播只需要调用abortBoradcast方法。

注意

1.生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(ApplicationNo Response) 程序无响应的错误信息,如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由Service来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的。

2. 动态注册广播接收器还有一个特点,就是注册的Activity关掉后,广播就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开的。系统常见广播Intent,如开机启动、电池电量变化、时间改变等广播。


------------------------------------------------------------------------------------------------------

好了,关于四大组件——BroadcastReceiver所涉及的各个方面基本都解释到了,如果还有不全面或是解释有误的点,欢迎广大看官给予点评和建议,本人必定细心查看,纠察改错。尴尬
 
敬请关注下一篇连载:四大组件——Service!再见


1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12991次
    • 积分:380
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    博客专栏
    最新评论