基础总结篇之五:BroadcastReceiver应用详解(二)

2.网络状态变化java

在某些场合,好比用户浏览网络信息时,网络忽然断开,咱们要及时地提醒用户网络已断开。要实现这个功能,咱们能够接收网络状态改变这样一条广播,当由链接状态变为断开状态时,系统就会发送一条广播,咱们接收到以后,再经过网络的状态作出相应的操做。下面就来实现一下这个功能:android

package com.scott.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
public class NetworkStateReceiver extends BroadcastReceiver {
	
	private static final String TAG = "NetworkStateReceiver";
	
	@Override
	public void onReceive(Context context, Intent intent) {
		Log.i(TAG, "network state changed.");
		if (!isNetworkAvailable(context)) {
			Toast.makeText(context, "network disconnected!", 0).show();
		}
	}
	
	/**
	 * 网络是否可用
	 * 
	 * @param context
	 * @return
	 */
	public static boolean isNetworkAvailable(Context context) {
		ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo[] info = mgr.getAllNetworkInfo();
		if (info != null) {
			for (int i = 0; i < info.length; i++) {
				if (info[i].getState() == NetworkInfo.State.CONNECTED) {
					return true;
				}
			}
		}
		return false;
	}
}

再注册一下这个接收者的信息:网络

<receiver android:name=".NetworkStateReceiver">  
    <intent-filter>  
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>  
        <category android:name="android.intent.category.DEFAULT" />  
    </intent-filter>  
</receiver>

由于在isNetworkAvailable方法中咱们使用到了网络状态相关的API,因此须要声明相关的权限才行,下面就是对应的权限声明:ide

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>测试

咱们能够测试一下,好比关闭WiFi,看看有什么效果。spa

3.电量变化.net

若是咱们阅读软件,多是全屏阅读,这个时候用户就看不到剩余的电量,咱们就能够为他们提供电量的信息。要想作到这一点,咱们须要接收一条电量变化的广播,而后获取百分比信息,这听上去挺简单的,咱们就来实现如下:code

package com.scott.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.BatteryManager;
import android.util.Log;
public class BatteryChangedReceiver extends BroadcastReceiver {
	private static final String TAG = "BatteryChangedReceiver";
	
	@Override
	public void onReceive(Context context, Intent intent) {
		int currLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);	//当前电量
		int total = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);		//总电量
		int percent = currLevel * 100 / total;
		Log.i(TAG, "battery: " + percent + "%");
	}
}

而后再注册一下广播接地址信息就能够了:orm

<receiver android:name=".BatteryChangedReceiver">  
    <intent-filter>  
        <action android:name="android.intent.action.BATTERY_CHANGED"/>  
        <category android:name="android.intent.category.DEFAULT" />  
    </intent-filter>  
</receiver>

固然,有些时候咱们是要当即获取电量的,而不是等电量变化的广播,好比当阅读软件打开时当即显示出电池电量。咱们能够按如下方式获取:get

Intent batteryIntent = getApplicationContext().registerReceiver(null,
        new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int currLevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
int total = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);
int percent = currLevel * 100 / total;
Log.i("battery", "battery: " + percent + "%");
相关文章
相关标签/搜索