android 获得一个应用程序的启动次数,运行时间等信息

转载声明,原文出自:http://androidkaifa.com/thread-1036-1-1.html

 
通过com.android.internal.os.PkgUsageStats这个类可以得到一个应用程序的启动次数,运行时间等信息,功能很强大。但是google并没有将这个类作为API接口提供给开发者,如果在android源码下开发,可以通过以下代码来使用这个类:
 1 import com.android.internal.app.IUsageStats;
 2  import com.android.internal.os.PkgUsageStats;
 3  
 4 //比较两个应用程序的启动次数和运行时间
 5  public final int compare(ApplicationInfo a, ApplicationInfo b) {
 6              ComponentName aName = a.intent.getComponent();
 7              ComponentName bName = b.intent.getComponent();
 8              int result = 0;
 9  //get usagestats service
10              IUsageStats mUsageStatsService = IUsageStats.Stub
11                          .asInterface(ServiceManager.getService("usagestats"));
12              try {
13  //get PkgUsageStats
14                  PkgUsageStats aStats = mUsageStatsService
15                          .getPkgUsageStats(aName);
16                  PkgUsageStats bStats = mUsageStatsService
17                          .getPkgUsageStats(bName);
18                  if(aStats!=null && bStats!=null) {
19                      if ((aStats.launchCount > bStats.launchCount)
20                          || ((aStats.launchCount == bStats.launchCount) && (aStats.usageTime > bStats.usageTime)))
21                      result = -1;
22                      else if ((aStats.launchCount < bStats.launchCount)
23                          || ((aStats.launchCount == bStats.launchCount) && (aStats.usageTime < bStats.usageTime)))
24                      result = 1;
25                      else {
26                      result = 0;
27                      }
28                  }else if(aStats!=null && bStats ==null) {
29                      result = -1;
30                  } else if(aStats==null && bStats !=null) {
31                      result = 1;
32                  }
33              } catch (RemoteException e) {
34                  Log.i("TAG", "get package usage stats fail");
35              }
36  
37             return result;
38          }
39  

那么如果想在sdk中使用这个 类要如果作呢--可以使用反射 的方法,代码如下:

 1 public final int compare(ApplicationInfo a, ApplicationInfo b) {
 2              
 3               ComponentName aName = a.intent.getComponent();
 4               ComponentName bName = b.intent.getComponent();
 5               int aLaunchCount,bLaunchCount;
 6               long aUseTime,bUseTime;
 7               int result = 0;
 8               
 9               try {
10                    
11                    //获得ServiceManager类
12                    Class<?> ServiceManager = Class
13                       .forName("android.os.ServiceManager");
14                    
15                    //获得ServiceManager的getService方法
16                    Method getService = ServiceManager.getMethod("getService", java.lang.String.class);
17                    
18                    //调用getService获取RemoteService
19                    Object oRemoteService = getService.invoke(null, "usagestats");
20                    
21                    //获得IUsageStats.Stub类
22                    Class<?> cStub = Class
23                       .forName("com.android.internal.app.IUsageStats$Stub");
24                    //获得asInterface方法
25                    Method asInterface = cStub.getMethod("asInterface", android.os.IBinder.class);
26                    //调用asInterface方法获取IUsageStats对象
27                    Object oIUsageStats = asInterface.invoke(null, oRemoteService);
28                    //获得getPkgUsageStats(ComponentName)方法
29                    Method getPkgUsageStats = oIUsageStats.getClass().getMethod("getPkgUsageStats", ComponentName.class);
30                    //调用getPkgUsageStats 获取PkgUsageStats对象
31                    Object aStats = getPkgUsageStats.invoke(oIUsageStats, aName);
32                    Object bStats = getPkgUsageStats.invoke(oIUsageStats, bName);
33                    
34                    //获得PkgUsageStats类
35                    Class<?> PkgUsageStats = Class.forName("com.android.internal.os.PkgUsageStats");
36                    
37                    aLaunchCount = PkgUsageStats.getDeclaredField("launchCount").getInt(aStats);
38                    bLaunchCount = PkgUsageStats.getDeclaredField("launchCount").getInt(bStats);
39                    aUseTime = PkgUsageStats.getDeclaredField("usageTime").getLong(aStats);
40                    bUseTime = PkgUsageStats.getDeclaredField("usageTime").getLong(bStats);
41                    
42                    if((aLaunchCount>bLaunchCount)||
43                            ((aLaunchCount == bLaunchCount)&&(aUseTime>bUseTime)))
44                        result = 1;
45                    else if((aLaunchCount<bLaunchCount)||((aLaunchCount ==
46                        bLaunchCount)&&(aUseTime<bUseTime)))
47                        result = -1;
48                    else {
49                        result = 0;
50                    }
51  
52                   } catch (Exception e) {
53                     Log.e("###", e.toString(), e);
54                    }
55  
56              return result;
57           }
58  

如何看自己的android的详细使用信息
我们使用Andoroid手机时想看看自己的手机的使用情况,那么我们又如何去操作呢?也是必需得像程序这样要自己写一个程序才能查看吧,如果用户不是编程的,那得怎么办,呵,其实我们查看自己的手机使用详情是没有那么复杂的,今天androidkaifa.com就会大家说一下如何查询自己的手机的使用情况,下面是具体的查看方法,
其实查看方法非常简单,直接进入Android的工程模式即可,操作步骤如下:(笔者的android手机系统是4.0)
1、首先进入Android手机操作系统的拨号界面,直接输入“*#*#4636#*#*”(不加引号)即可以快速进入Android操作系统的工程测试模式。
2、在“测试”模式菜单中有手机信息“Phone information”、电池信息“Battery information”、WI-FI信息“WI-FI information”、使用状态“Usage statistics”四个选项。
3、我们点击选择第二项“Battery information”进入电池信息,然后就可以看到手机电池的详细信息了,其中包括电量等级、电池状态、温度、电池材质、电压等等信息。
4: 我们相应点击其实的选择就可以看到其实的相应的使用详细信息

posted @ 2013-01-19 20:35  王世桢  阅读(1153)  评论(0编辑  收藏  举报