文档章节

静态广播与动态广播

jacky_123
 jacky_123
发布于 2015/02/03 15:46
字数 739
阅读 2699
收藏 4

静态广播与动态广播区别:

两者及其接收广播的区别:

1.动态注册的广播 永远要快于 静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低>\

2.动态注册广播不是 常驻型广播 ,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。

静态注册是常驻型 ,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

3.在同一个优先级下,谁先启动的快,谁将先接收到广播.

动态注册代码:

UpdateBroadcast  broadcast= new UpdateBroadcast();
IntentFilter filter = new IntentFilter("com.unit.UPDATE");
registerReceiver(broadcast, filter);

静态注册代码(在配置文件中添加):

<receiver android:name="net.youmi.android.AdReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <data android:scheme="package" />
            </intent-filter>
 </receiver>

 发送广播:

sendBroadcast 发送的是无序广播。

sendOrderedBroadcast 发送的是有序广播。

 

广播的生命周期:

广播接收器仅在它执行这个方法时处于活跃状态。当 onReceive() 返回后,它即为失活状态。

拥有一个活跃状态的广播接收器的进程被保护起来而不会被杀死,但仅拥有失活状态组件的进程则会在其它进程需要它所占有的内存的时候随时被杀掉。 所以,如果响应一个广播信息需要很长的一段时 间,我们一般会将其纳入一个衍生的线程中去完成,而不是在主线程内完成它,从而保证用户交互过程的流畅。

 

静态广播的实现:

 

添加权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

 

1、在配置文件里面注册广播接收器:

<receiver android:name=".comm.ConnectivityChangeBroadcastReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter></receiver>


2、在广播接收器里处理广播:

public class ConnectivityChangeBroadcastReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  Log.d("TAG",intent.getAction());
  if (isNetworkConnected(context)) {
   Log.d("TAG","网络连通了");
  }
 }
 public boolean isNetworkConnected(Context context) {
  if (context != null) {
   ConnectivityManager mConnectivityManager = (ConnectivityManager) context
     .getSystemService(Context.CONNECTIVITY_SERVICE);
   NetworkInfo mNetworkInfo = mConnectivityManager
     .getActiveNetworkInfo();
   if (mNetworkInfo != null) {
    return true;
   }
  }
  return false;
 }
}

断开wifi,然后连接log日志如下(即使在Activity destroy状态下也能够运行):

02-03 15:40:23.842: D/TAG(16825): android.net.conn.CONNECTIVITY_CHANGE

02-03 15:40:30.732: D/TAG(16825): android.net.conn.CONNECTIVITY_CHANGE

02-03 15:40:30.732: D/TAG(16825): 网络连通了

 

动态广播的实现:

 

注册动态广播

发送动态广播

销毁动态广播

 

@Override

 public void onClick(View v) {

  // TODO Auto-generated method stub

  switch (v.getId()) {

  case R.id.btDynamicBroadRegist:

   dyBroadCast = new DynamicBroadCast();

   IntentFilter filter = new IntentFilter();

   filter.addAction("com.test1");//过滤**条件的广播

   // 动态注册广播接收器

   registerReceiver(dyBroadCast, filter);

   break;

  case R.id.btDynamicBroadSend:

   Intent intent = new Intent();

   intent.setAction("com.test1");//设置过滤条件

   sendBroadcast(intent);

   break;

  case R.id.btDynamicBroadDestory:

   unregisterReceiver(dyBroadCast);

   break;

  }

 }

 

 DynamicBroadCast.java:

public class DynamicBroadCast extends BroadcastReceiver {
 public DynamicBroadCast() {
  System.out.println("DynamicBroadCast---------------->");
 }
 @Override
 public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
  System.out.println("DynamicBroadCast---------------->onReceive");
 }
}

输出:

注册动态广播:

02-03 20:15:00.923: I/System.out(9638): DynamicBroadCast---------------->

 

 

发送动态广播:

02-03 20:15:04.463: I/System.out(9638): DynamicBroadCast---------------->onReceive

 

销毁动态广播:

© 著作权归作者所有

下一篇: Java 反射机制
jacky_123
粉丝 3
博文 55
码字总数 26297
作品 0
南通
程序员
私信 提问
Android源码解析四大组件系列(七)---广播的发送过程

本篇文章的目录 1、广播数据结构分析 2、线程的切换 3、processNextBroadcast分析 3.1、处理并行广播 3.2、处理Pending广播 3.3、处理有序广播 3.4、获取下一条广播 3.5、检查是否是动态广播...

LooperJing
2017/07/19
0
0
VirtualApk源码分析-BroadcastReceiver插件化

广播的注册分为静态注册和动态注册两种,android关于广播的源码分析可以参照此文 : https://www.jianshu.com/writer#/notebooks/11066526/notes/28225946 广播的插件化指的是插件能够接受到...

jasmine_ben
2018/05/19
0
0
Android插件化原理解析——广播的管理

在Activity生命周期管理 以及 插件加载机制 中我们详细讲述了插件化过程中对于Activity组件的处理方式,为了实现Activity的插件化我们付出了相当多的努力;那么Android系统的其他组件,比如B...

weishu
2016/05/13
0
0
BroadcastReceiver的源码分析

android提供了广播机制,通过BroadcastReceiver可以在不同的进程间传递消息。类似于观察者模式,A应用通过注册广播表示A对消息subject感兴趣,当B应用发出subject类型的消息的时候,A应用就能...

JasmineBen
2018/05/18
0
0
android成长日记 10.关于BroadcastReceiver的详细说明

广播看完了,然后回过头写一下,其实就是分为几种广播, 广播分为动态注册和静态注册,,,广播又分为系统广播和自定义广播, ....发送方式又分为,有序广播和无序广播....发送广播又分为直接send和利...

康康渐渐
2016/03/08
37
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部