幾乎所有的安卓應(yīng)用都會用到網(wǎng)絡(luò)龄广,除去極少數(shù)純單機的應(yīng)用晶渠。而在應(yīng)用使用網(wǎng)絡(luò)的過程中,必然會收到網(wǎng)絡(luò)狀態(tài)的影響。特別是一些在線播放視頻剃氧、音樂缀旁,以及一些即時游戲鸳谜。本文主要解決本刽、記載獲取網(wǎng)絡(luò)狀態(tài)、監(jiān)聽網(wǎng)絡(luò)狀態(tài)發(fā)生變化的方法亭饵。
1休偶、獲取網(wǎng)絡(luò)狀態(tài):
封裝工具類NetUtil:
public classNetUtil {
? ? ? ? ? ? public static final int NETWORN_NONE = 0;? ?
? ? ? ? ? ? public static final int NETWORN_WIFI = 1;? ??
? ? ? ? ? ? public static final int NETWORN_MOBILE = 2;? ??
? ? ? ? ? ? public static int getNetworkState(Context context) {?
? ? ? ? ? ? ? ? ? ? ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
? ? ? ? // Wifi? ? ? ?
? ? ? ? ? ? ? ? ? State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI) .getState();? ? ? ?
? ? ? ? ? ? ? ? ? ?if (state == State.CONNECTED || state == State.CONNECTING) {? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? return NETWORN_WIFI;? ? ? ?
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? // 3G? ? ? ??
? ? ? ? ? ? ? ? ?state = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
? ? ? ? ? ? ? ? ?if (state == State.CONNECTED || state == State.CONNECTING) {
? ? ? ? ? ? ? ? ? ? ?return NETWORN_MOBILE;? ? ? ??
? ? ? ? ? ? ? ? ?}? ? ? ?
? ? ? ? ? ? return NETWORN_NONE;? ?
? ? ? ? }
}
使用該方法,需要
配置ACCESS_NETWORK_STATE和ACCESS_WIFI_STATE權(quán)限
2辜羊、監(jiān)聽網(wǎng)絡(luò)狀態(tài)改變
網(wǎng)絡(luò)狀態(tài)發(fā)生變化時踏兜,系統(tǒng)會發(fā)送廣播,對應(yīng)的Action為android.net.conn.CONNECTIVITY_CHANGE八秃。因此只需要寫一個監(jiān)聽此消息的接收器即可碱妆。
public classNetBroadcastReceiverextendsBroadcastReceiver {
? ? ? ? ? ? ? @Override
? ? ? ? ? ? ?public void onReceive(Context context,Intent intent) {
? ? ? ? ? ? ? ? ? ?Log.e("=====網(wǎng)絡(luò)狀態(tài)發(fā)生變化",intent.getAction()+"===");
? ? ? ? ? ? ? ? ? ? ? ? //此處可以配合前面獲取網(wǎng)絡(luò)狀態(tài)的方法一起使用,從而得到網(wǎng)絡(luò)狀態(tài)發(fā)生變化后的網(wǎng)絡(luò)情況
? ? ? ? ? ? }
}
在Manifest.xml上注冊該接收器昔驱。
<receiver
? ? ? ? ? ? android:name=".NetBroadcastReceiver"
? ? ? ? ? ? ?android:enabled="true"
? ? ? ? ? ? ?android:exported="false">
? ? ? ? ? ? ?<intent-filter>
? ? ? ? ? ? ? ? ? ? ? ?<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
? ? ? ? ? ? ?</intent-filter>
</receiver>
3山橄、在Activity中使用
監(jiān)聽到網(wǎng)絡(luò)狀態(tài)發(fā)生變化后,需要在Activity中使用舍悯。可以有多種方式睡雇,發(fā)送通知萌衬、接口監(jiān)聽等,此處采用接口的方式它抱。
? ? ? 1秕豫、封裝接口:
public interface NetEventHandler {
? ? ? ? ? ? voidonNetChange();
}
? ? 2、定義靜態(tài)變量:
? ? ? ? ? ? ? ? ?public static NetEventHandler netEventHandler;
? 3观蓄、在NetBroadcastReceiver的的onReceive方法中調(diào)用:
? ? ? ? ? ? ? ? if(netEventHandler!=null) {
? ? ? ? ? ? ? ? ? netEventHandler.onNetChange();
? ? ? ? ? ? ? ?}
4混移、在需要處理網(wǎng)絡(luò)狀態(tài)的Activity中,或者在項目中Activity的基類中侮穿,實現(xiàn)NetEventHandler接口:
public class myActivity extends Activity implements NetEventHandler {
? ? ?@Override
? ? ? protected voidonCreate(Bundle savedInstanceState) {
? ? ?super.onCreate(savedInstanceState);
? ? ? setContentView(R.layout.activity_main);
? ? ?NetBroadcastReceiver.netEventHandler=this;//也可不用靜態(tài)變量歌径,使用set方法賦值也可以。
}
? ? ?@Override
? ? ?public voidonNetChange() {
? ? ? ?if(NetUtil.getNetworkState(this) == NetUtil.NETWORN_NONE) {
? ? ? ? ? ? ?runOnUiThread(newRunnable() {//手動切換網(wǎng)絡(luò)進行此處測試時亲茅,因為Activity處于onPause中回铛,Toast彈不出來狗准,所以需要增加主線程運行。
? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? ?public voidrun() {
? ? ? ? ? ? ? ? ? ? ?showToast("當(dāng)前處于沒有網(wǎng)絡(luò)的遠古時代");
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? });
? ? ? ? ? }else if(NetUtil.getNetworkState(this) == NetUtil.NETWORN_MOBILE) {
? ? ? ? ? ? ? ? ? ? ?runOnUiThread(newRunnable() {
? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? public voidrun() {
? ? ? ? ? ? ? ? ? ? showToast("當(dāng)前在數(shù)據(jù)流量下使用網(wǎng)絡(luò)茵肃,小心超標(biāo)哦");
? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?});
? ? ? ? ? ?}else if(NetUtil.getNetworkState(this) == NetUtil.NETWORN_WIFI) {
? ? ? ? ? ? ? ? ? ? runOnUiThread(newRunnable() {
? ? ? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? ? ? public voidrun() {
? ? ? ? ? ? ? ? ? ? ? ? showToast("當(dāng)前在wifi環(huán)境下使用網(wǎng)絡(luò)腔长,盡情爽吧");
? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ?});
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ?}
}