监听手机电量变化-动态注册
那么该如何创建一个广播接收器呢?其实只需要新建一个类,让它继承自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 版权协议,转载请附上原文出处链接和本声明。