安卓开发-接收系统广播

  • Post author:
  • Post category:其他

监听手机电量变化-动态注册

那么该如何创建一个广播接收器呢?其实只需要新建一个类,让它继承自BroadcastReceiver ,并重写父类的onReceive() 方法就行了。这样当有广播到来时,onReceive() 方法就会得到执行,具体的逻辑就可以在这个方法中处理。

我们在MainActivity中定义了一个内部类NetworkChangeReceiver ,这个类是继承自BroadcastReceiver的,并重写了父类的onReceive() 方法。这样每当网络状态发生变化
时,onReceive() 方法就会得到执行,

这里有非常重要的一点需要说明,Android系统为了保护用户设备的安全和隐私,做了严格的规定:如果程序需要进行一些对用户来说比较敏感的操作,就必须在配置文件中声明权限才可以,否则程序将会直接崩溃。比如这里访问系统的网络状态就是需要声明权限的。打开AndroidManifest.xml文件,在里面加入如下权限就可以访问系统网络状态了:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
...
</manifest>

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 的实例,
        // 并给它添加了一个值为android.net.conn.CONNECTIVITY_CHANGE 的action,
        //为什么要添加这个值呢?因为当网络状态发生变化时,系统发出的正是一条值
        //为android.net.conn.CONNECTIVITY_CHANGE 的广播,
        //也就是说我们的广播接收器想要监听什么广播,就在这里添加相应的action。
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        //然后调用registerReceiver() 方法进行注册,将NetworkChangeReceiver
        //的实例和IntentFilter 的实例都传了进去,这样NetworkChangeReceiver 就会收到所有值
        //为android.net.conn.CONNECTIVITY_CHANGE 的广播,也就实现了监听网络变化的功能。
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver, intentFilter);


    }

	/**
	最后要记得,动态注册的广播接收器一定都要取消注册才行,这里我们
	是在onDestroy() 方法中通过调用unregisterReceiver() 方法来实
	现的。
	**/
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }


    class NetworkChangeReceiver extends BroadcastReceiver
    {

        @Override
        public void onReceive(Context context, Intent intent)
        {
            //首先通过getSystemService() 方法得到了
            //ConnectivityManager 的实例,这是一个系统服务类,专门用于管理网络连接的。
            ConnectivityManager systemService = (ConnectivityManager)getSystemService(context.CONNECTIVITY_SERVICE);
            //然后调用它的getActiveNetworkInfo() 方法可以得到NetworkInfo 的实例,
            NetworkInfo networkInfo = systemService.getActiveNetworkInfo();
            //接着调用NetworkInfo 的isAvailable() 方法,就可以判断出当前是否有网络了,
            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();
            }

//            Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
        }
    }
}

监听手机重启-静态注册

在这里插入图片描述

在这里插入图片描述


版权声明:本文为qq_45432665原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。