幾乎所有的安卓應(yīng)用都會(huì)用到網(wǎng)絡(luò),除去極少數(shù)純單機(jī)的應(yīng)用。而在應(yīng)用使用網(wǎng)絡(luò)的過程中,必然會(huì)收到網(wǎng)絡(luò)狀態(tài)的影響。特別是一些在線播放視頻、音樂,以及一些即時(shí)游戲。本文主要解決、記載獲取網(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ā)生變化時(shí),系統(tǒng)會(huì)發(fā)送廣播,對(duì)應(yīng)的Action為android.net.conn.CONNECTIVITY_CHANGE。因此只需要寫一個(gè)監(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上注冊(cè)該接收器。
<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中使用??梢杂卸喾N方式,發(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中,或者在項(xiàng)目中Activity的基類中,實(shí)現(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() {//手動(dòng)切換網(wǎng)絡(luò)進(jìn)行此處測(cè)試時(shí),因?yàn)锳ctivity處于onPause中,Toast彈不出來,所以需要增加主線程運(yùn)行。
? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? ?public voidrun() {
? ? ? ? ? ? ? ? ? ? ?showToast("當(dāng)前處于沒有網(wǎng)絡(luò)的遠(yuǎn)古時(shí)代");
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? });
? ? ? ? ? }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ò),盡情爽吧");
? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ?});
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ?}
}