注册⼴播的两种⽅式:动态⼴播和静态⼴播的区别和⽤法
今天介绍⼀下Android的四⼤组件之⼀的BroadCastReceiver,即⼴播。⼴播类似于JAVA设计模式中的观察者模式,即当被观察者数据变化的时候,会去通知观察者做相应处理。这⾥也是⼀样,当发出⼴播的时候,那么注册过该⼴播的⼈,就能收到这个⼴播,进⽽做⼀些⼯作。
上⾯说的⼴播注册,在Android中有两种⽅式,即动态注册(代码注册)、静态注册(清单⽂件注册),下⾯我以Android中⽹络状态变化发出的⼴播作为例⼦,看看这两种⽅式的具体⽤法。
动态注册:即⽤代码动态的注册、注销⼴播
public class DynamicInternetActivity extends AppCompatActivity {
private InternetDynamicBroadCastReceiver mReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_dynamic_lock_screen);
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
mReceiver = new InternetDynamicBroadCastReceiver();
}
@Override
protected void onDestroy() {
unregisterReceiver(mReceiver);
}
public class InternetDynamicBroadCastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(DynamicInternetActivity.this,"⽹络发⽣了变化",Toast.LENGTH_SHORT).show();
}
}
}
在清单⽂件中注册该⼴播接受者。
<receiver android:name=".broadcastreceiver_monitor.DynamicInternetActivity$InternetDynamicBroadCastReceiver"/>
注意:上⾯在onDestroy⽅法中,必须注销⼴播,否则有内存泄漏的风险
静态⼴播:把⼴播写死在l中
public class InternetStaticBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"⽹络发⽣了变化",Toast.LENGTH_SHORT).show();
}
}
在清单⽂件中注册该⼴播接受者。
<receiver android:name=".broadcastreceiver_monitor.InternetStaticBroadCastReceiver">
<intent-filter>
<!--<action android:name="ConnectivityManager.CONNECTIVITY_ACTION"/>//这样写是不对的-->
<action android:name="CONNECTIVITY_CHANGE"/>//此处必需指定action,否则监听不到
</intent-filter>
</receiver>
注意:静态注册的⼴播,必需单独成⼀个类,不能像动态注册那样写在某个界⾯⾥。否则当监听到⽹络状态变化的时候,会抛出异常。动态注册和静态注册的区别:
动态注册的⼴播会受Activity的⽣命周期的影响,当Activity销毁的时候,⼴播就失效了。
⽽静态注册的⼴播,即使Activity销毁了,仍然可以收到⼴播。更⽜掰的是即使杀死进程,仍然可以收到⼴播,关于这点不同的⼿机测试的结果是不同的,为了验证这个问题,我⽤的是google的nexus⼿机测试的。
在Android中,有⼀些action是不⽀持静态注册的:
android.intent.action.SCREEN_ON安卓intent用法
android.intent.action.SCREEN_OFF
android.intent.action.BATTERY_CHANGED
android.intent.action.CONFIGURATION_CHANGED
android.intent.action.TIME_TICK
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论