欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中wifi與數(shù)據(jù)流量的切換監(jiān)聽(tīng)詳解

 更新時(shí)間:2017年01月10日 10:55:54   作者:一杯清泉  
本文主要介紹了Android中wifi與數(shù)據(jù)流量的切換監(jiān)聽(tīng)的方法步驟。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧

最近在做一個(gè)wifi和移動(dòng)數(shù)據(jù)的監(jiān)控功能,來(lái)來(lái)回回折騰了一陣子,這個(gè)模塊的主要功能是監(jiān)聽(tīng)整個(gè)APP的wifi與數(shù)據(jù)流量的切換,讓用戶使用專用流量,而不是用wifi,給一個(gè)彈窗,點(diǎn)擊確認(rèn),自動(dòng)切換數(shù)據(jù)流量,關(guān)閉wifi。我的思路是寫(xiě)一個(gè)靜態(tài)廣播,監(jiān)聽(tīng)在廣播里面進(jìn)行監(jiān)聽(tīng),啟用系統(tǒng)彈窗,點(diǎn)擊確認(rèn),自動(dòng)切換網(wǎng)絡(luò),這里面有一個(gè)坑就是彈窗會(huì)在廣播中多次被調(diào)用,其實(shí)只調(diào)用了一次,但是實(shí)際上多次調(diào)用系統(tǒng)的彈窗會(huì)一個(gè)疊加一個(gè),搞了好久,終于搞好了,原來(lái)是系統(tǒng)廣播導(dǎo)致的疊加,詳情看代碼:

網(wǎng)絡(luò)封裝類ConnectivityManager:

ConnectivityManager 是一個(gè)網(wǎng)絡(luò)連接的管理類,里面封裝了網(wǎng)絡(luò)請(qǐng)求的詳細(xì)信息,包括WiFi與移動(dòng)數(shù)據(jù)流量的開(kāi)關(guān)狀態(tài),正在開(kāi)啟與關(guān)閉的狀態(tài),連接狀態(tài)等等,很適合做網(wǎng)絡(luò)監(jiān)聽(tīng)。還有一個(gè)類WifiManager ,這個(gè)類專門用來(lái)做WiFi的監(jiān)聽(tīng),他的監(jiān)聽(tīng)效果比ConnectivityManager更加詳細(xì)豐富,可以檢測(cè)但是對(duì)流量沒(méi)法生效。這里使用ConnectivityManager 就足夠了。

一、注冊(cè)廣播

1、寫(xiě)一個(gè)類繼承自BroadcastReceiver。

@Override 
public void onReceive(Context context, Intent intent) { 
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
 NetworkInfo gprs = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
NetworkInfo wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
if (intent.getAction().equals("Android.net.conn.CONNECTIVITY_CHANGE"))  { 
//移動(dòng)數(shù)據(jù)連接上時(shí) 
if (gprs.isConnected()){ 
} 
//wifi連接上時(shí) 
if (wifi.isConnected()) { 
// 切換網(wǎng)絡(luò),關(guān)閉wifi,開(kāi)啟流量 
if (isShow) {//做一個(gè)標(biāo)記,避免多次彈窗的疊加bug,初始值為true,重要 
switchNetwork(context); 
}  
} 
//斷網(wǎng)時(shí) 
if (!netManager.getGRPS().isConnected() || !netManager.getGRPS().isConnected()) { 
}   
} 

二、彈窗

彈窗一般用四種常用的方式:

1、使用popupwindow

2、使用dialog

3、WindowManager

4、系統(tǒng)彈窗

一般的彈窗需要依附于activity,在activity中彈窗,但是在服務(wù)中,不能簡(jiǎn)單的使用這種方式,一般是采用系統(tǒng)的彈窗,他的優(yōu)先級(jí)很高,覆蓋于應(yīng)用界面的最高層,并且要設(shè)置setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT),要不然會(huì)崩潰的。

private void switchNetwork(final Context context) { 
AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.AlertDialog); 
builder.setTitle("提示"); 
builder.setMessage("請(qǐng)關(guān)閉wifi,打開(kāi)移動(dòng)網(wǎng)絡(luò)"); 
builder.setCancelable(false); 
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { 
@Override 
public void onClick(DialogInterface dialog, int which) { 
// 控制網(wǎng)絡(luò)的開(kāi)關(guān) 
controlNetWork(context); 
isShow = true; 
} 
}); 
AlertDialog dialog = builder.create(); 
// 需要把對(duì)話框的類型設(shè)為TYPE_SYSTEM_ALERT,否則對(duì)話框無(wú)法在廣播接收器里彈出 
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
dialog.show(); 
isShow = false; 
} 

三、網(wǎng)絡(luò)切換

wifi的網(wǎng)絡(luò)切換比較容易,直接設(shè)置setWifiEnabled就可以完成切換,而數(shù)據(jù)流量的切換比較麻煩,他的方法是私有的,無(wú)法調(diào)用,我們可以通過(guò)反射,找到他的方法進(jìn)行調(diào)用:具體看代碼

private void controlNetWork(Context context) { 
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
      // 允許流量,阻止wifi 
      wifiManager.setWifiEnabled(false);//false表示斷開(kāi)WiFi 
      NetManager netManager = new NetManager(context); 
      if (!netManager.getGRPS().isConnected()) { 
        ConnectivityManager gprsCM = (ConnectivityManager) context 
            .getSystemService(Context.CONNECTIVITY_SERVICE); 
        Class conmanClass; 
        try { 
          conmanClass = Class.forName(gprsCM.getClass().getName()); 
          final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService"); 
iConnectivityManagerField.setAccessible(true); 
          final Object iConnectivityManager = iConnectivityManagerField.get(gprsCM); 
          final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName()); 
          final Method setMobileDataEnabledMethod = iConnectivityManagerClass 
              .getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE); 
setMobileDataEnabledMethod.setAccessible(true);//true表示連接網(wǎng)絡(luò) 
          setMobileDataEnabledMethod.invoke(iConnectivityManager, true); 
        } catch (Exception e) { 
          e.printStackTrace(); 
        } 
      } 
    } 
  } 

2、在清單文件中注冊(cè)廣播

<receiver 
      android:name=".NetChangeReceiver" 
      android:label="NetChangeReceiver" > 
      <intent-filter> 
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      </intent-filter> 
</receiver> 

添加權(quán)限:

<uses-permission Android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

以上代碼很詳細(xì)的描述了網(wǎng)絡(luò)切換的實(shí)時(shí)檢測(cè),更加詳細(xì)豐富的就不在這里寫(xiě)出來(lái)了。

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • Android進(jìn)程間大數(shù)據(jù)通信LocalSocket詳解

    Android進(jìn)程間大數(shù)據(jù)通信LocalSocket詳解

    這篇文章主要為大家介紹了Android進(jìn)程間大數(shù)據(jù)通信LocalSocket詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Android快遞物流信息布局開(kāi)發(fā)

    Android快遞物流信息布局開(kāi)發(fā)

    這篇文章主要為大家詳細(xì)介紹了Android快遞物流信息布局開(kāi)發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android 仿微信聊天時(shí)間格式化顯示功能

    Android 仿微信聊天時(shí)間格式化顯示功能

    這篇文章主要介紹了Android 仿微信聊天時(shí)間格式化顯示功能,本文中還給大家簡(jiǎn)單介紹了在同一年的顯示規(guī)則和不在同一年的顯示規(guī)則。需要的朋友可以參考下
    2017-02-02
  • 詳解Android Studio 3.0的新特性與適配

    詳解Android Studio 3.0的新特性與適配

    這篇文章主要介紹了詳解Android Studio 3.0的新特性與適配,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Android編程之電池電量信息更新的方法(基于BatteryService實(shí)現(xiàn))

    Android編程之電池電量信息更新的方法(基于BatteryService實(shí)現(xiàn))

    這篇文章主要介紹了Android編程之電池電量信息更新的方法,主要基于BatteryService實(shí)現(xiàn)該功能,以實(shí)例形式分析了Android獲取電池電量的具體步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-11-11
  • Android?常見(jiàn)獲取設(shè)備標(biāo)識(shí)方法總結(jié)

    Android?常見(jiàn)獲取設(shè)備標(biāo)識(shí)方法總結(jié)

    隨著Android系統(tǒng)版本更新,Google對(duì)用戶隱私保護(hù)增強(qiáng),限制獲取設(shè)備標(biāo)識(shí),文中測(cè)試DeviceID、ANDROID_ID、Serial、MAC地址等方法在不同API級(jí)別的表現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Android開(kāi)發(fā)必備:秒殺真機(jī)超快模擬器Genymotion介紹

    Android開(kāi)發(fā)必備:秒殺真機(jī)超快模擬器Genymotion介紹

    這篇文章主要介紹了Android開(kāi)發(fā)必備:秒殺真機(jī)超快模擬器Genymotion介紹,本文直接用圖片說(shuō)明Genymotion的安裝和模擬效果,并提供官網(wǎng),需要的朋友可以參考下
    2015-04-04
  • 使用WEB工具快速提高Android開(kāi)發(fā)效率

    使用WEB工具快速提高Android開(kāi)發(fā)效率

    正所謂工欲善其事,必先利其器。學(xué)習(xí)并應(yīng)用優(yōu)秀的輪子,可以讓我們跑的更快,走的更遠(yuǎn)。這里所指的工具是廣義的,泛指能幫助我們開(kāi)發(fā)的東西,或者能提高我們效率的東西,包括:開(kāi)發(fā)工具,監(jiān)測(cè)工具,第三方代碼庫(kù)等
    2016-02-02
  • Android自定義View實(shí)現(xiàn)選座功能

    Android自定義View實(shí)現(xiàn)選座功能

    這篇文章主要介紹了Android自定義View實(shí)現(xiàn)選座功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 學(xué)習(xí)Android Material Design(RecyclerView代替ListView)

    學(xué)習(xí)Android Material Design(RecyclerView代替ListView)

    Android Material Design越來(lái)越流行,以前很常用的 ListView 現(xiàn)在也用RecyclerView代替了,實(shí)現(xiàn)原理還是相似的,感興趣的小伙伴們可以參考一下
    2016-01-01

最新評(píng)論