通过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;
}
分享到:
相关推荐
在XML布局文件中,你可以像使用其他布局一样使用`com.google.android.material.chip.ChipGroup`作为FlowLayout,它是Material Design中实现FlowLayout功能的组件: ```xml ...
有些平板缺失加载webview所依赖的内核apk的资源文件,会导致应用加载webview报错。需要自己安装webview的apk。 webview全称叫做Android ...包名:com.google.android.webview MD5:A69B924CBF90302DD58F50D9D96D0942
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....
android system webview 适配系统>=5.0
包含以下java源文件: ...com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class ...
总的来说,通过反射调用加载和卸载外置SD卡是一种深入Android系统层面的操作,需要对系统内部机制有深入理解,并且需要注意安全性和权限问题。在实际开发中,除非有特殊需求,否则不推荐频繁使用这种方式。
java 工具包, async-...com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class ...
一种常见的解决方案是使用`android.os.Environment`类的私有字段`EXTERNAL_STORAGE`,并通过反射访问它。以下代码示例展示了如何实现这一过程: ```java try { Class<?> envClass = Class.forName("android.os....
在Java编程中,有时我们可能会遇到一些意想不到的问题,如标题所描述的“关于引入com.sun.org.apache.xpath.internal.operations.String后右键RUN选项消失”。这个问题的出现主要是由于误导入了一个JDK内部使用的类...
SpringBoot是一种广泛使用的Java开发框架,它简化了基于Spring的应用开发。其中,将SpringBoot应用打包成WAR...总之,通过上述步骤和方法,通常可以解决SpringBoot打包WAR时com.sun.istack.internal包不存在的问题。
android sdk -26 带 com.android.internal.telephony 包的 jar, 下载后 将名称改为 android.jar 替换 anroid-sdk -> platform -> android-26 文件下的 android.jar 即可直接找到 telephony 下的类, 不会报错
com.tencent.qnet.internal.v2.ipa
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_...
Class<?> iTelephonyClass = Class.forName("com.android.internal.telephony.ITelephony"); ITelephony iTelephony = iTelephonyClass.newInstance(); iTelephonyClass.cast(iTelephony).asBinder().linkToDeath...
在使用IntelliJ IDEA(IDEA)开发Java项目时,我们可能会遇到与Gradle相关的编译错误,如“`No signature of method: org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.DefaultVersionComparator....
在Android开发中,布局管理器是构建用户界面的关键部分,它们负责组织和定位屏幕上的各个组件。LinearLayout是最常见的布局之一,它按照垂直或水平方向排列其子视图。然而,当需要在一个容器中动态地展示数量不定且...
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传递自定义对象,特别关注实现`IParcelable`接口的方法。 首先,让我们理解Intent的基本概念。Intent是用来表示应用程序的意图,它可以携带数据并指定目标组件。在...
### Android虚拟机详解 #### 一、概述 Android虚拟机是Android系统中负责运行应用程序的核心组件之一,它的设计目的是为了确保应用程序能够在各种不同的硬件平台上高效、稳定地运行。本篇文章将深入探讨Android...
com.sun.net.ssl.jar ,