静态广播与动态广播

原创
2015/02/03 15:46
阅读数 6K

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

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

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

 

销毁动态广播:

展开阅读全文
打赏
0
4 收藏
分享
加载中
更多评论
打赏
0 评论
4 收藏
0
分享
返回顶部
顶部