Android監(jiān)聽網(wǎng)絡(luò)狀態(tài)

幾乎所有的安卓應(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ò),盡情爽吧");

? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ?});

? ? ? ? ? ? ? ? ? }

? ? ? ? ? ?}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容