2013-11-24 96 views
4

我想實現一個顯示Android應用程序與他們的互聯網使用的列表視圖。杉木這一點,首先我必須列出所有的應用程序,我已經做到了這一點使用PackageManager,像這樣:連接到互聯網的Android應用程序的列表

packageManager = getPackageManager(); 
    List<PackageInfo> packageList = packageManager 
      .getInstalledPackages(PackageManager.GET_META_DATA); 

apkList = (ListView) findViewById(R.id.applist); 
    apkList.setAdapter(new ApkAdapter(this, packageList, packageManager)); 

但這代碼列出所有的系統應用程序,以及像:安卓系統正,計算器,日曆,狀態欄,動態壁紙等,看起來不合適。我試圖使用過濾系統應用:

/*To filter out System apps*/ 
    for(PackageInfo pi : packageList) { 
     boolean b = isSystemPackage(pi); 
     if(!b) { 
      packageList1.add(pi); 
     } 
    } 

但隨後的代碼僅顯示安裝的應用程序,例如WhatsApp,探戈,方正等它不顯示,如Gmail,臉譜,瀏覽器,地圖應用程序。 任何人都可以建議我應該如何編寫只顯示實際使用互聯網的應用程序列表的代碼。提前致謝!

+0

由於Gmail,Facebook,瀏覽器,地圖都是系統應用程序,因此您將其過濾掉了。一種可能的解決方案是從過濾中排除特定的系統包。 – Nizam

回答

4

我想要實現展示與他們 互聯網使用Android應用程序列表視圖過濾掉那些應用程序。 一個人建議我應該怎麼寫,僅顯示應用程序的列表 實際使用互聯網

一個解決方案的代碼(也許只有一個效果最好,來到我的頭)是使用TrafficStats類計算數據(TCP,UDP)通過網絡傳輸。就你而言,你需要爲每個UID獲取數據(每個應用程序都有自己的UID)。

所有你需要知道的是,如果應用程序通過網絡傳輸了更多的零字節,並且知道這一點,你可以知道「這個應用程序使用網絡」

這裏是僞代碼,你可以使用:

List<Application> collection = new ArrayList<Application>(); 
Application app = null; // some custom object is good approach 
PackageManager pm = getActivity().getPackageManager(); 
for (ApplicationInfo info: pm.getInstalledApplications(
               PackageManager.GET_META_DATA)) { 

    // received data by application 
    long downloaded = TrafficStats.getUidRxBytes(info.uid); 

    // transmitted data by application 
    long uploaded = TrafficStats.getUidTxBytes(info.uid); 

    // filter system applications only 
    if ((info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 

     // check if application has network usage 
     if (downloaded > 0 || uploaded > 0) { 

     // it's application you want 
     } 
    } 
    // non-system application 
    else { 
     if (downloaded > 0 || uploaded > 0) { 

     // it's application you want 
     } 
    } 
} 

它說TrafficStats可從API 8JELLY_BEAN_MR2之前,這可能會返回設備上不支持地方統計大家還不是很重要的t可用。我使用這種方法,從來沒有遇到過問題。

注:我也想提一提,也許有例如一些系統文件中讀取另一種可能的方法(ES),但這是(至少對我來說)硬編碼的做法,我不建議使用它(也可以在各種設備中的文件可以在不同的地方,具有不同的內容和不同的文件名)。

我希望它能幫助你解決你的問題。

相關問題