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

Android獲取應(yīng)用程序大小的方法

 更新時(shí)間:2014年01月16日 15:54:36   作者:  
這篇文章主要介紹了Android獲取應(yīng)用程序大小的方法,有需要的朋友可以參考一下

今天碰到個(gè)問題,想獲取某個(gè)已安裝的包的大小,沒找到合適的方法。搜索了一下,發(fā)現(xiàn)PackageManager里面有個(gè)getPackageSizeInfo方法,可惜是hide的,而且它執(zhí)行之后,會(huì)將結(jié)果回調(diào)給IPackageStatsObserver的onGetStatsCompleted方法。后來想直接計(jì)算/data/app和/system/app里面的apk大小,可是有時(shí)候會(huì)碰到權(quán)限問題,需要root才可以獲取大小。        再后來,我想起系統(tǒng)的設(shè)置里面有一個(gè)應(yīng)用程序管理,它里面列出了所有程序的占用空間大小、數(shù)據(jù)大小和緩存大小。恩,這個(gè)就是突破口。
以前寫過一篇獲取其他包的Context ,這個(gè)東西是真有用,這個(gè)結(jié)合反射,可以做很多神奇的事情,比如今天的這個(gè)。

上代碼:

Java代碼

復(fù)制代碼 代碼如下:

package chroya.demo; 

import java.lang.reflect.Constructor; 
import java.lang.reflect.Field; 
import java.lang.reflect.InvocationTargetException; 
import java.util.concurrent.CountDownLatch; 

import android.app.Activity; 
import android.content.Context; 
import android.content.pm.PackageStats; 
import android.content.pm.PackageManager.NameNotFoundException; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 

public class Main extends Activity { 
    private PackageStats ps; 

    public void getPackageStats(String packageName) { 
        try { 
            //獲取setting包的的Context 
            Context mmsCtx = createPackageContext("com.android.settings", 
                    Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); 
            //使用setting的classloader加載com.android.settings.ManageApplications類 
            Class<?> maClass = Class.forName("com.android.settings.ManageApplications", true, mmsCtx.getClassLoader()); 
            //創(chuàng)建它的一個(gè)對(duì)象 
            Object maObject = maClass.newInstance(); 

            /*
             * 將私有域mPm賦值。因?yàn)閙Pm在SizeObserver的invokeGetSize中用到了,
             * 卻因?yàn)闆]有執(zhí)行onCreate而沒有初始化,所以要在此處初始化。
             */ 
            Field f_mPm = maClass.getDeclaredField("mPm"); 
            f_mPm.setAccessible(true);             
            f_mPm.set(maObject, mmsCtx.getPackageManager()); 

            /*
             * 給mHandler賦值為重新定義的Handler,以便接收SizeObserver的
             * onGetStatsCompleted回調(diào)方法中dispatch的消息,從中取PackageStats對(duì)象。
             * */ 
            Field f_mHandler = maClass.getDeclaredField("mHandler"); 
            f_mHandler.setAccessible(true); 
            f_mHandler.set(maObject, new Handler() { 
                  public void handleMessage(Message msg) { 
                      if(msg.what == 1) { 
                          //此處獲取到PackageStats對(duì)象 
                          ps = (PackageStats) msg.getData().getParcelable("ApplicationPackageStats");                          
                          Log.d("", ""+ps.codeSize);                           
                      } 
                  } 
            }); 

            //加載內(nèi)部類SizeObserver 
            Class<?> sizeObserverClass = Class.forName("com.android.settings.ManageApplications$SizeObserver", true, mmsCtx.getClassLoader()); 
            Constructor sizeObserverConstructor = sizeObserverClass.getDeclaredConstructors()[0]; 
            sizeObserverConstructor.setAccessible(true); 
            /*
             * 創(chuàng)建SizeObserver對(duì)象,兩個(gè)參數(shù),第一個(gè)是外部類的對(duì)象,
             * 也就是ManageApplications對(duì)象,第二個(gè)是msgId,也就是
             * 分發(fā)消息的id,跟Handler接收的msgId一樣。
             * */ 
            Object soObject = sizeObserverConstructor.newInstance(maObject, 1); 
            //執(zhí)行invokeGetSize方法 
            sizeObserverClass.getMethod("invokeGetSize", String.class, 
                    CountDownLatch.class).invoke(soObject, packageName, new CountDownLatch(1));          
        } catch (NameNotFoundException e) { 
            e.printStackTrace(); 
        } catch (ClassNotFoundException e) { 
            e.printStackTrace(); 
        } catch (IllegalAccessException e) { 
            e.printStackTrace(); 
        } catch (IllegalArgumentException e) { 
            e.printStackTrace(); 
        } catch (SecurityException e) { 
            e.printStackTrace(); 
        } catch (InvocationTargetException e) { 
            e.printStackTrace(); 
        } catch (NoSuchMethodException e) { 
            e.printStackTrace(); 
        } catch (InstantiationException e) { 
            e.printStackTrace(); 
        } catch (NoSuchFieldException e) { 
            e.printStackTrace(); 
        } 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);   
        getPackageStats("chroya.demo");        
    } 

注釋都在代碼里面了,稍微理解一下應(yīng)該都能懂的。
獲取到PackageStats對(duì)象,就可以從中獲取到應(yīng)用程序的占用空間大小、數(shù)據(jù)大小和緩存大小。

另,這畢竟只是hack code,不可能通用。這段代碼的局限性是,只有1.5能用,而且如果別人把setting包去掉了,也沒法使用。要寫出各版本SDK通用的代碼,就必須查看每個(gè)版本的setting包,看代碼有何變化,然后根據(jù)上面給出的思路為每個(gè)版本寫一個(gè)方法,就ok了。

想要獲得成功,首先要自己相信自己,再者要贏得周圍朋友的信任!

相關(guān)文章

  • Android沉浸式狀態(tài)欄設(shè)計(jì)的實(shí)例代碼

    Android沉浸式狀態(tài)欄設(shè)計(jì)的實(shí)例代碼

    本篇文章主要介紹了Android沉浸式狀態(tài)欄設(shè)計(jì)的實(shí)例代碼,整理了詳細(xì)的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android徹底清除APP數(shù)據(jù)的兩種方案總結(jié)

    Android徹底清除APP數(shù)據(jù)的兩種方案總結(jié)

    大家在用Android手機(jī)的時(shí)候肯定都遇到過內(nèi)存剩余空間越來越小的情況,所以下面這篇文章主要給大家介紹了關(guān)于Android徹底清除APP數(shù)據(jù)的兩種方案,需要的朋友可以參考下
    2021-11-11
  • Android編程之SQLite數(shù)據(jù)庫操作方法詳解

    Android編程之SQLite數(shù)據(jù)庫操作方法詳解

    這篇文章主要介紹了Android編程之SQLite數(shù)據(jù)庫操作方法,簡單介紹了SQLite數(shù)據(jù)庫及Android操作SQLite數(shù)據(jù)庫的步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • android中用xml文件實(shí)現(xiàn)帶邊框背景效果的方法

    android中用xml文件實(shí)現(xiàn)帶邊框背景效果的方法

    這篇文章主要給大家介紹了在android中xml文件實(shí)現(xiàn)帶邊框背景效果的方法,其實(shí)實(shí)現(xiàn)的功能不是很難,僅作記錄,幫助需要的朋友們做個(gè)參考,需要的朋友們下面來一起看看吧。
    2017-06-06
  • Android Studio 利用Splash制作APP啟動(dòng)界面的方法

    Android Studio 利用Splash制作APP啟動(dòng)界面的方法

    這篇文章主要介紹了Android Studio 利用Splash制作APP啟動(dòng)界面,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Android開發(fā)實(shí)現(xiàn)布局幀布局霓虹燈效果示例

    Android開發(fā)實(shí)現(xiàn)布局幀布局霓虹燈效果示例

    這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)布局幀布局霓虹燈效果,涉及Android界面布局、資源文件操作及屬性設(shè)置等相關(guān)技巧,需要的朋友可以參考下
    2019-04-04
  • Flutter自定義彈窗Dialog效果

    Flutter自定義彈窗Dialog效果

    這篇文章主要為大家詳細(xì)介紹了Flutter自定義彈窗Dialog效果,含底部抽屜,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android LayoutParams使用案例詳解

    Android LayoutParams使用案例詳解

    這篇文章主要介紹了Android LayoutParams使用案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Android自定義View弧線進(jìn)度控件

    Android自定義View弧線進(jìn)度控件

    這篇文章主要為大家詳細(xì)介紹了Android自定義View弧線進(jìn)度控件,點(diǎn)擊開始按鈕時(shí),逐漸的出現(xiàn)進(jìn)度,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android利用Andserver搭建服務(wù)器的詳細(xì)教程

    Android利用Andserver搭建服務(wù)器的詳細(xì)教程

    這篇文章主要介紹了Android利用Andserver搭建服務(wù)器的教程,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論

延长县| 尖扎县| 巩义市| 栾城县| 连城县| 永靖县| 磴口县| 寻甸| 太保市| 彭山县| 普兰店市| 勐海县| 大方县| 长兴县| 岳西县| 库尔勒市| 苏尼特右旗| 宁津县| 手游| 禹城市| 阿城市| 博野县| 荥阳市| 阿拉善盟| 湾仔区| 会理县| 肃南| 淅川县| 中超| 安化县| 定襄县| 长岛县| 凤冈县| 洱源县| 措勤县| 讷河市| 东台市| 南安市| 安岳县| 鄂温| 云林县|