在項目的開發(fā)過程中 , 我們的應用程序都是在有網(wǎng)絡(luò)的情況下進行處理的 , 但我們也要考慮到在沒有網(wǎng)絡(luò)的情況下,應用會出現(xiàn)什么樣的情況 , 所以我們需要獲取到當前的網(wǎng)絡(luò)信息.
在神池等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計 網(wǎng)站設(shè)計制作定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計,營銷型網(wǎng)站,外貿(mào)網(wǎng)站建設(shè),神池網(wǎng)站建設(shè)費用合理。
獲取網(wǎng)絡(luò)信息需要在AndroidManifest.xml文件中加入相應的權(quán)限。
1)判斷是否有網(wǎng)絡(luò)連接
2)判斷WIFI網(wǎng)絡(luò)是否可用
3)判斷MOBILE網(wǎng)絡(luò)是否可用
4)獲取當前網(wǎng)絡(luò)連接的類型信息
在開發(fā)android應用時,涉及到要進行網(wǎng)絡(luò)訪問,時常需要進行網(wǎng)絡(luò)狀態(tài)的檢查,以提供給用戶必要的提醒。一般可以通過ConnectivityManager來完成該工作。
當我們要在程序中監(jiān)聽網(wǎng)絡(luò)狀態(tài)時,只要一下幾個步驟即可:
1、定義一個Receiver重載其中的onReceive函數(shù),在其中完成所需要的功能,如根據(jù)WIFI和GPRS是否斷開來改變空間的外觀
2、在適當?shù)牡胤阶訰eceiver,可以在程序中注冊,在onCreate中調(diào)用如下函數(shù)即可:
3、在適當時取消注冊Receiver,可以在程序中取消,在onDestroye中調(diào)用如下函數(shù)即可:
很多朋友在android開發(fā)中,都會遇到手機網(wǎng)絡(luò)類型判斷,因為就目前的android平臺手機來說:可能會存在4種狀態(tài):
這四種狀態(tài),如果沒有網(wǎng)絡(luò),肯定是無法請求Internet了,如果是wap就需要為手機添加中國移動代理.
下面是網(wǎng)絡(luò)判斷的方法:
因為獲取的是服務對象,所以這個網(wǎng)絡(luò)狀態(tài)都是時時刷新的,所以我們只需要得到網(wǎng)絡(luò)狀態(tài)就可以了!
最后總結(jié):
工具類:
BaseActivity:
MainActivity
Log日志
獲取android系統(tǒng)的連接服務可判斷網(wǎng)絡(luò)連接狀態(tài),代碼如下
public class NetUtils{
public static boolean isNetworkConnected(Context context){
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] infos = cm.getAllNetworkInfo();
for(NetworkInfo info:infos){
if(info.isAvailable()info.isConnected()){
return true;
}
}
return false;
}
}
NetworkInfo的isAvailable()和isConnected()有以下5種狀態(tài):
在WLAN設(shè)置界面
1,顯示連接已保存,但標題欄沒有,即沒有實質(zhì)連接上:isConnected()==false,isAvailable()=true
2,顯示連接已保存,標題欄也有已連接上的圖標:isConnected()==true,isAvailable()=true
3,選擇不保存后:isConnected()==false,isAvailable()=true
4,選擇連接,在正在獲取IP地址時:isConnected()==false,isAvailable()=false
5,連接上后:isConnected()==true,isAvailable()=true
1、首先先用usb線連接android手機,然后輸入指令:adbtcpip,端口號默認為5555。
2、設(shè)置端口號后,然后查看設(shè)置中手機的ip地址。
3、通過adb連接ip地址adbconnectip地址。
4、打開androidstudio,可以看到手機已經(jīng)連接上了。
我們做項目的時候,不可避免的要做網(wǎng)絡(luò)狀態(tài)的監(jiān)聽,一般我們都是抽取出一個工具類來實現(xiàn),比如:
細致的你當然還會再寫一個判斷網(wǎng)絡(luò)類型的方法,反手再來一個例:
然后就可以在相應的操作前進行判斷網(wǎng)絡(luò)的判斷:
但是這樣做也有些問題:
接下來就是本文的重點,如何通過 NetStatusBus 這個庫來解決以上問題,讓你的網(wǎng)絡(luò)狀態(tài)監(jiān)聽變得前所未有的簡單粗暴。
到這里就已經(jīng)結(jié)束了,你的所有網(wǎng)絡(luò)操作已經(jīng)都可以清晰優(yōu)雅的在訂閱方法中進行處理了,當然你也可以繼續(xù)往下看。
訂閱方法必須填寫一個NetType參數(shù),可以通過NetType的值來判斷當前網(wǎng)絡(luò)類型。
@NetSubscribe中 netType為可選值,可以設(shè)置訂閱的類型,可選值類型如下:
NetType.AUTO
這是默認值,任何網(wǎng)絡(luò)狀態(tài)發(fā)生變化,該類型訂閱者都會被回調(diào)。同時會傳入NetType參數(shù)告知你當前的網(wǎng)絡(luò)類型,示例如下:
只要當前是由 WIFI 改變引發(fā)的網(wǎng)絡(luò)狀態(tài)變化,該類型訂閱者都會被回調(diào)。同時會傳入NetType參數(shù)告知你當前的網(wǎng)絡(luò)類型,示例如下:
只要當前是由移動網(wǎng)絡(luò)改變引發(fā)的網(wǎng)絡(luò)狀態(tài)變化,該類型訂閱者都會被回調(diào)。同時會傳入NetType參數(shù)告知你當前的網(wǎng)絡(luò)類型,示例如下:
NetType.NONE
只有當網(wǎng)絡(luò)丟失時,該類型訂閱者才會被回調(diào)。
有人會覺得,我用個庫爽就行了管它的原理干什么?
你放心,我只是小小的描述一下實現(xiàn)方式。
原理簡單來說,就是在全局初始化的時候就綁定對網(wǎng)絡(luò)的變化監(jiān)聽。然后將進行注冊的父類所有的訂閱方法保存至集合中,這里涉及到一些方法的校驗,最后在網(wǎng)絡(luò)狀態(tài)發(fā)生改變時利用 Java 反射機制遍歷執(zhí)行所有訂閱方法。熟悉 EventBus 的小伙伴已經(jīng)看出來了這里借鑒了一小部分 EventBus 的思想。
回到第一步,那么具體是如何綁定對網(wǎng)絡(luò)狀態(tài)變化的監(jiān)聽呢?
以前我們是通過注冊廣播來實現(xiàn)綁定網(wǎng)絡(luò)變更的監(jiān)聽,在Android 7.0 以后,Google 基于性能和安全原因?qū)V播進行了很多限制,比如監(jiān)聽網(wǎng)絡(luò)變更的廣播 android.net.conn.CONNECTIVITY_CHANGE 使用靜態(tài)注冊的方式則無法生效,而動態(tài)注冊的方式雖然可以生效但畢竟不是最優(yōu)解。
同樣出于性能和安全,以及擁抱變化的角度,最終我們還是使用官方推薦的方式,利用 ConnectivityManager.NetworkCallback 來進行網(wǎng)絡(luò)變化的監(jiān)聽,這是在Android 5.0即android api 21推出的API,目前Android 5.0以上的市場占有率在 85%以上,隨著國內(nèi)各大廠商正在積極的推進適配普及Android Q,這個比例還會進一步增大,所以個人人認為無需過于擔心低版本適配。
使用的時候出現(xiàn)這個問題是由于少添加了權(quán)限。
Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
java.lang.RuntimeException: Unable to create application com.jiyun.wanandroid.WanApplication: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
加上這幾個權(quán)限就好了:
附上原文地址: