Android 手机 应用管理 中是如何获取到 应用信息的

Android对这种方法进行了封装,我们没有权限去调用这个方法,所以我们只能通过AIDL,然后利用Java的反射机制去调用系统级的方法。

下面上代码:(注释比较详细)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
   * 作用:-----获取包的大小-----
   * @param context 上下文
   * @param pkgName app的包名
   * @param appInfo 实体类,用于存放App的某些信息
   */
  public static void getPkgSize( final Context context, String pkgName, final PhoneAppInfo appInfo) {
   // getPackageSizeInfo是PackageManager中的一个private方法,所以需要通过反射的机制来调用
   Method method;
   try {
    method = PackageManager. class .getMethod( "getPackageSizeInfo" ,
      new Class[]{String. class , IPackageStatsObserver. class });
    // 调用 getPackageSizeInfo 方法,需要两个参数:1、需要检测的应用包名;2、回调
    method.invoke(context.getPackageManager(), pkgName,
      new IPackageStatsObserver.Stub() {
       @Override
       public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {
        if (succeeded && pStats != null ) {
         synchronized (PhoneAppInfo. class ) {
          appInfo.setCatchSize(pStats.cacheSize); //缓存大小
          appInfo.setDataSize(pStats.dataSize); //数据大小
          appInfo.setCodeSize(pStats.codeSize); //应用大小
          appInfo.setAppSize(pStats.cacheSize + pStats.codeSize + pStats.dataSize); //应用的总大小
          Log.d( "asdasdxx" ,appInfo.getAppSize()+ "" );
         }
        }
       }
      });
   } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
    e.printStackTrace();
   }
  }

下面是两个AIDL文件的代码。。。

步骤(Android Studio):

1、在main文件夹下,建立一个aidl文件夹的文件夹

2、建立一个包,包名为android.content.pm

3、结构图

   *******PackageStats.aidl文件***************

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* //device/java/android/android/view/WindowManager.aidl
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
package android.content.pm;
parcelable PackageStats;

****************IPackageStatusObserver.aidl******************




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
package android.content.pm;
import android.content.pm.PackageStats;
/**
  * API for package data change related callbacks from the Package Manager.
  * Some usage scenarios include deletion of cache directory, generate
  * statistics related to code, data, cache usage(TODO)
  * {@hide}
  */
oneway interface IPackageStatsObserver {
  void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}
  1. 添加权限
  2. <uses-permission android:name="android.permission.GET_PACKAGE_SIZE"></uses-permission> 

  1. 使用方法


  1.  public void  queryPacakgeSize(String pkgName) throws Exception{  
  2.         if ( pkgName != null){  
  3.             //使用放射机制得到PackageManager类的隐藏函数getPackageSizeInfo  
  4.             PackageManager pm = getPackageManager();  //得到pm对象  
  5.             try {  
  6.                 //通过反射机制获得该隐藏函数  
  7.                 Method getPackageSizeInfo = pm.getClass().getDeclaredMethod("getPackageSizeInfo", String.class,IPackageStatsObserver.class);  
  8.                 //调用该函数,并且给其分配参数 ,待调用流程完成后会回调PkgSizeObserver类的函数  
  9.                 getPackageSizeInfo.invoke(pm, pkgName,new PkgSizeObserver());  
  10.             }   
  11.             catch(Exception ex){  
  12.                 Log.e(TAG, "NoSuchMethodException") ;  
  13.                 ex.printStackTrace() ;  
  14.                 throw ex ;  // 抛出异常  
  15.             }   
  16.         }  
  17.     }  
  18.      
  19.     //aidl文件形成的Bindler机制服务类  
  20.     public class PkgSizeObserver extends IPackageStatsObserver.Stub{  
  21.         /*** 回调函数, 
  22.          * @param pStatus ,返回数据封装在PackageStats对象中 
  23.          * @param succeeded  代表回调成功 
  24.          */   
  25.         @Override  
  26.         public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)  
  27.                 throws RemoteException {  
  28.             // TODO Auto-generated method stub  
  29.            cachesize = pStats.cacheSize  ; //缓存大小  
  30.             datasize = pStats.dataSize  ;  //数据大小   
  31.             codesize = pStats.codeSize  ;  //应用程序大小  
  32.             totalsize = cachesize + datasize + codesize ;  
  33.             Log.i(TAG, "cachesize--->"+cachesize+" datasize---->"+datasize+ " codeSize---->"+codesize)  ;  
  34.         }  
  35.     }  
  36.     //系统函数,字符串转换 long -String (kb)  
  37.     private String formateFileSize(long size){  
  38.         return Formatter.formatFileSize(MainActivity.this, size);   
  39.     } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值