Android基础之广播
一、类型
-
标准广播
完全异步执行的广播,所有广播接收器几乎都会同时接收到这条广播消息
-
有序广播
同步执行的广播,广播接收器有先后顺序
二、接收系统广播
-
如何创建一个广播接收器?
新建一个类,让他继承自BroadcastReceiver,并且重写父类的onReceive()方法
-
动态注册(在代码中注册—推荐)
MainActivity.java
package com.example.lenovo.broadcasttest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter=new IntentFilter(); //广播接收器想要监听什么广播,就在这里添加相应的action intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver=new NetworkChangeReceiver(); //调用registerReceiver()进行注册,让NetworkChangeReceiver收到android.net.conn.CONNECTIVITY_CHANGE的广播 registerReceiver(networkChangeReceiver,intentFilter); } @Override protected void onDestroy(){ super.onDestroy(); unregisterReceiver(networkChangeReceiver); } //广播接收器 class NetworkChangeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ //通过getSystemService()得到ConnectivityManager的实例,这是一个系统类,专门用于管理网络连接 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(); } } } }
在AndroidManifest.xml中注册权限(不注册会导致崩溃)
<!-- 申请查看网络状态的权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
效果图:
3. 静态注册(在AndroidManifest.xml注册—不推荐)
-
优点:
在程序未启动的情况下就能接收广播
-
问题原因:
Android8.0在AndroidManifest.xml文件中静态注册广播接收失效是由于官方对耗电量的优化,避免APP滥用广播的一种处理方式。除了少部分的广播仍支持静态注册(如开机广播),其余的都会出现失效的情况。 -
解决方案:
尽量使用动态注册