`
andy_叶
  • 浏览: 69269 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

如何通过反射方法获取com.android.internal.os.PkgUsageStats

 
阅读更多

通过com.android.internal.os.PkgUsageStats这个类可以得到一个应用程序的启动次数,运行时间等信息,功能很强大。但是google并没有将这个类作为API接口提供给开发者,如果在android源码下开发,可以通过以下代码来使用这个类:

import com.android.internal.app.IUsageStats;
import com.android.internal.os.PkgUsageStats;

//比较两个应用程序的启动次数和运行时间
public final int compare(ApplicationInfo a, ApplicationInfo b) {
            ComponentName aName = a.intent.getComponent();
            ComponentName bName = b.intent.getComponent();
            int result = 0;
//get usagestats service
            IUsageStats mUsageStatsService = IUsageStats.Stub
                        .asInterface(ServiceManager.getService("usagestats"));
            try {
//get PkgUsageStats
                PkgUsageStats aStats = mUsageStatsService
                        .getPkgUsageStats(aName);
                PkgUsageStats bStats = mUsageStatsService
                        .getPkgUsageStats(bName);
                if(aStats!=null && bStats!=null) {
                    if ((aStats.launchCount > bStats.launchCount)
                        || ((aStats.launchCount == bStats.launchCount) && (aStats.usageTime > bStats.usageTime)))
                    result = -1;
                    else if ((aStats.launchCount < bStats.launchCount)
                        || ((aStats.launchCount == bStats.launchCount) && (aStats.usageTime < bStats.usageTime)))
                    result = 1;
                    else {
                    result = 0;
                    }
                }else if(aStats!=null && bStats ==null) {
                    result = -1;
                } else if(aStats==null && bStats !=null) {
                    result = 1;
                }
            } catch (RemoteException e) {
                Log.i("TAG", "get package usage stats fail");
            }

            return result;
        }

那么如果想在sdk中使用这个 类要如果作呢--可以使用反射 的方法,代码如下:
 public final int compare(ApplicationInfo a, ApplicationInfo b) {
           
             ComponentName aName = a.intent.getComponent();
             ComponentName bName = b.intent.getComponent();
             int aLaunchCount,bLaunchCount;
             long aUseTime,bUseTime;
             int result = 0;
             
              try {
                 
                  //获得ServiceManager类
                  Class<?> ServiceManager = Class
                     .forName("android.os.ServiceManager");
                 
                  //获得ServiceManager的getService方法
                  Method getService = ServiceManager.getMethod("getService", java.lang.String.class);
                 
                  //调用getService获取RemoteService
                  Object oRemoteService = getService.invoke(null, "usagestats");
                 
                  //获得IUsageStats.Stub类
                  Class<?> cStub = Class
                     .forName("com.android.internal.app.IUsageStats$Stub");
                  //获得asInterface方法
                  Method asInterface = cStub.getMethod("asInterface", android.os.IBinder.class);
                  //调用asInterface方法获取IUsageStats对象
                  Object oIUsageStats = asInterface.invoke(null, oRemoteService);
                  //获得getPkgUsageStats(ComponentName)方法
                  Method getPkgUsageStats = oIUsageStats.getClass().getMethod("getPkgUsageStats", ComponentName.class);
                  //调用getPkgUsageStats 获取PkgUsageStats对象
                  Object aStats = getPkgUsageStats.invoke(oIUsageStats, aName);
                  Object bStats = getPkgUsageStats.invoke(oIUsageStats, bName);
                 
                  //获得PkgUsageStats类
                  Class<?> PkgUsageStats = Class.forName("com.android.internal.os.PkgUsageStats");
                 
                  aLaunchCount = PkgUsageStats.getDeclaredField("launchCount").getInt(aStats);
                  bLaunchCount = PkgUsageStats.getDeclaredField("launchCount").getInt(bStats);
                  aUseTime = PkgUsageStats.getDeclaredField("usageTime").getLong(aStats);
                  bUseTime = PkgUsageStats.getDeclaredField("usageTime").getLong(bStats);
                 
                  if((aLaunchCount>bLaunchCount)||
                          ((aLaunchCount == bLaunchCount)&&(aUseTime>bUseTime)))
                      result = 1;
                  else if((aLaunchCount<bLaunchCount)||((aLaunchCount ==
                      bLaunchCount)&&(aUseTime<bUseTime)))
                      result = -1;
                  else {
                      result = 0;
                  }

                  } catch (Exception e) {
                   Log.e("###", e.toString(), e);
                  }

             return result;
         }

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Android Material FlowLayout简单使用

    在XML布局文件中,你可以像使用其他布局一样使用`com.google.android.material.chip.ChipGroup`作为FlowLayout,它是Material Design中实现FlowLayout功能的组件: ```xml ...

    com.google.android.webview.apk

    有些平板缺失加载webview所依赖的内核apk的资源文件,会导致应用加载webview报错。需要自己安装webview的apk。 webview全称叫做Android ...包名:com.google.android.webview MD5:A69B924CBF90302DD58F50D9D96D0942

    org.eclipse.swt.win32

    org.eclipse.swt.internal.image.OS2BMPFileFormat.class org.eclipse.swt.internal.image.PNGFileFormat.class org.eclipse.swt.internal.image.PngChunk.class org.eclipse.swt.internal.image.PngChunkReader....

    com.google.android.webview

    android system webview 适配系统&gt;=5.0

    googleGson JsonObject json转换包

    包含以下java源文件: ...com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class ...

    Android 下通过反射调用加载/卸载(mount/unmount) 外置SD卡

    总的来说,通过反射调用加载和卸载外置SD卡是一种深入Android系统层面的操作,需要对系统内部机制有深入理解,并且需要注意安全性和权限问题。在实际开发中,除非有特殊需求,否则不推荐频繁使用这种方式。

    async-http-client-1.6.3.jar com.ning.http.client.jar

    java 工具包, async-...com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class ...

    Android 通过反射调用获取内置存储和外置sd卡根路径(适用于各个版本)

    一种常见的解决方案是使用`android.os.Environment`类的私有字段`EXTERNAL_STORAGE`,并通过反射访问它。以下代码示例展示了如何实现这一过程: ```java try { Class&lt;?&gt; envClass = Class.forName("android.os....

    关于引入com.sun.org.apache.xpath.internal.operations.String后右键RUN选项消失

    在Java编程中,有时我们可能会遇到一些意想不到的问题,如标题所描述的“关于引入com.sun.org.apache.xpath.internal.operations.String后右键RUN选项消失”。这个问题的出现主要是由于误导入了一个JDK内部使用的类...

    springBoot 打war包 程序包com.sun.istack.internal不存在的问题及解决方案

    SpringBoot是一种广泛使用的Java开发框架,它简化了基于Spring的应用开发。其中,将SpringBoot应用打包成WAR...总之,通过上述步骤和方法,通常可以解决SpringBoot打包WAR时com.sun.istack.internal包不存在的问题。

    android-26-带internal-telephony包.jar

    android sdk -26 带 com.android.internal.telephony 包的 jar, 下载后 将名称改为 android.jar 替换 anroid-sdk -&gt; platform -&gt; android-26 文件下的 android.jar 即可直接找到 telephony 下的类, 不会报错

    com.tencent.qnet.internal.v2.ipa

    com.tencent.qnet.internal.v2.ipa

    resolver_java_wsdl.jar

    Caused by: java.lang.NoClassDefFoundError: com.sun.org.apache.xml.internal.resolver.CatalogManager at com.sun.xml.ws.util.xml.XmlUtil.createEntityResolver(XmlUtil.java:266) at org.jvnet.jax_ws_...

    android 通过反射自动拨打电话和挂断电话

    Class&lt;?&gt; iTelephonyClass = Class.forName("com.android.internal.telephony.ITelephony"); ITelephony iTelephony = iTelephonyClass.newInstance(); iTelephonyClass.cast(iTelephony).asBinder().linkToDeath...

    IDEA编译Gradle报错No signature of method Possible solutions asVersio

    在使用IntelliJ IDEA(IDEA)开发Java项目时,我们可能会遇到与Gradle相关的编译错误,如“`No signature of method: org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.DefaultVersionComparator....

    Android Flowlayout:LinearLayout内部控件自动换行

    在Android开发中,布局管理器是构建用户界面的关键部分,它们负责组织和定位屏幕上的各个组件。LinearLayout是最常见的布局之一,它按照垂直或水平方向排列其子视图。然而,当需要在一个容器中动态地展示数量不定且...

    Android Studio 3.0后出现AAPT2与“android.enableAapt2”问题的解决方法

    Error: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details The option ‘android.enableAapt2’ is deprecated and should ...

    Xamarin.Android之Intent传递对象简单实例

    本文将深入探讨如何在Xamarin.Android中通过Intent传递自定义对象,特别关注实现`IParcelable`接口的方法。 首先,让我们理解Intent的基本概念。Intent是用来表示应用程序的意图,它可以携带数据并指定目标组件。在...

    Android虚拟机

    ### Android虚拟机详解 #### 一、概述 Android虚拟机是Android系统中负责运行应用程序的核心组件之一,它的设计目的是为了确保应用程序能够在各种不同的硬件平台上高效、稳定地运行。本篇文章将深入探讨Android...

    com.sun.net.ssl.jar

    com.sun.net.ssl.jar ,

Global site tag (gtag.js) - Google Analytics