版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzhworld/article/details/70233085
Android广播之接收系统广播(一)
##广播的机制介绍
广播可以分为标准广播与有序广播,区别主要是前者为异步,后者为同步。
标准广播是在发出广播之后所有的接受器都会收到广播,效率较高,有序广播是发出广播之后只有一种能接受到广播,当这个接收器逻辑执行完后才会发到下一个接收器,主要是有序的,同时广播是可以截断的,只要阶段其中的某一步,后面的就会收不到。
##一、接收系统广播
有两种注册方式,一种是代码注册,一种是在AndroidMainfest.xml中注册,前者为动态,后者为静态
###1、动态注册监听网络变化
public class MainActivity extends AppCompatActivity {
private IntentFilter mIntentFilter;
/*
创建一个IntentFilter实例,然后将android.net.conn.CONNECTIVITY_CHANGE
传入到实例中,也就是说我们想要监听什么样的广播就传入什么样的数值,然后
使用注册receiver,动态的广播接收器一定要取消注册,所以在destory要调用
unregisterReceiver
*/
private NetworkChangReceiver mNetworkChangeReceiver;
/*
NetworkChangeReceiver是继承BroadcastReceiiver
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIntentFilter = new IntentFilter();
mIntentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
mNetworkChangeReceiver = new NetworkChangReceiver();
registerReceiver(mNetworkChangeReceiver,mIntentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mNetworkChangeReceiver);
}
class NetworkChangReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
}
}
}
###2、动态注册改进
单单只是网络的改变还不够人性化,所以我们改进成能够提示网络的开关闭,我们在onReceiver中修改,
class NetworkChangReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectionManager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
if(networkInfo !=null && networkInfo.isAvailable()){
Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();
}
else
Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();
}
}
注意在AndroidMainfest.xml申请网络权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
好了,我们现在按home键,然后找到设置里开关数据,开关可以看到变化
###3、静态注册
静态注册的优点是动态所没有的,就是当程序没有启动的时候可接收广播
####先增加一个BroadcastReceiver
public class BootCompleteReceiver extends BroadcastReceiver{
private static final String TAG ="Start";
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();
}
}
####在androidmainfest.xml中添加开机广播权限声明
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
以及在application中添加receiver
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>