技术总结:
静态广播与动态广播区别:
两者及其接收广播的区别:
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
销毁动态广播:
无
静态广播与动态广播区别:
两者及其接收广播的区别:
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
销毁动态广播:
无