国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中wifi與數據流量的切換監聽詳解

2019-12-12 04:04:05
字體:
來源:轉載
供稿:網友

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

網絡封裝類ConnectivityManager:

ConnectivityManager 是一個網絡連接的管理類,里面封裝了網絡請求的詳細信息,包括WiFi與移動數據流量的開關狀態,正在開啟與關閉的狀態,連接狀態等等,很適合做網絡監聽。還有一個類WifiManager ,這個類專門用來做WiFi的監聽,他的監聽效果比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"))  { //移動數據連接上時 if (gprs.isConnected()){ } //wifi連接上時 if (wifi.isConnected()) { // 切換網絡,關閉wifi,開啟流量 if (isShow) {//做一個標記,避免多次彈窗的疊加bug,初始值為true,重要 switchNetwork(context); }  } //斷網時 if (!netManager.getGRPS().isConnected() || !netManager.getGRPS().isConnected()) { }   } 

二、彈窗

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

1、使用popupwindow

2、使用dialog

3、WindowManager

4、系統彈窗

一般的彈窗需要依附于activity,在activity中彈窗,但是在服務中,不能簡單的使用這種方式,一般是采用系統的彈窗,他的優先級很高,覆蓋于應用界面的最高層,并且要設置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("請關閉wifi,打開移動網絡"); builder.setCancelable(false); builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 控制網絡的開關 controlNetWork(context); isShow = true; } }); AlertDialog dialog = builder.create(); // 需要把對話框的類型設為TYPE_SYSTEM_ALERT,否則對話框無法在廣播接收器里彈出 dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); dialog.show(); isShow = false; } 

三、網絡切換

wifi的網絡切換比較容易,直接設置setWifiEnabled就可以完成切換,而數據流量的切換比較麻煩,他的方法是私有的,無法調用,我們可以通過反射,找到他的方法進行調用:具體看代碼

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表示連接網絡           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> 

添加權限:

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

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

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三门县| 岳阳市| 黎城县| 图们市| 连州市| 阳东县| 深水埗区| 禄劝| 东山县| 景洪市| 娄烦县| 菏泽市| 沾益县| 太白县| 墨江| 凌海市| 扬中市| 从江县| 伊宁县| 黄平县| 抚松县| 兰州市| 淮阳县| 元氏县| 马山县| 论坛| 平阳县| 潮安县| 金乡县| 普宁市| 鄂托克前旗| 错那县| 达州市| 井研县| 吉水县| 甘谷县| 视频| 宣化县| 敦煌市| 乌拉特中旗| 弋阳县|