最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

一、注冊廣播

1、寫一個類繼承自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"))  { 
//移動數(shù)據(jù)連接上時 
if (gprs.isConnected()){ 
} 
//wifi連接上時 
if (wifi.isConnected()) { 
// 切換網(wǎng)絡(luò),關(guān)閉wifi,開啟流量 
if (isShow) {//做一個標記,避免多次彈窗的疊加bug,初始值為true,重要 
switchNetwork(context); 
}  
} 
//斷網(wǎng)時 
if (!netManager.getGRPS().isConnected() || !netManager.getGRPS().isConnected()) { 
}   
} 

二、彈窗

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

1、使用popupwindow

2、使用dialog

3、WindowManager

4、系統(tǒng)彈窗

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

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

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

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

private void controlNetWork(Context context) { 
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
      // 允許流量,阻止wifi 
      wifiManager.setWifiEnabled(false);//false表示斷開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、在清單文件中注冊廣播

<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"/>

以上代碼很詳細的描述了網(wǎng)絡(luò)切換的實時檢測,更加詳細豐富的就不在這里寫出來了。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

最新評論

汝城县| 大理市| 新营市| 互助| 涟源市| 绥阳县| 张北县| 龙岩市| 广宗县| 辛集市| 沿河| 张家川| 卫辉市| 新兴县| 临夏市| 凤冈县| 石阡县| 揭阳市| 舒城县| 浦城县| 梁山县| 聊城市| 阿城市| 太谷县| 沭阳县| 英吉沙县| 南城县| 即墨市| 兴文县| 德江县| 舟山市| 富阳市| 永登县| 河源市| 丹阳市| 晋宁县| 建始县| 延庆县| 广元市| 芮城县| 胶南市|