android5.0用UsageStatsManager来获取程序运行时间
本来想用PkgUsageStats来获取的,后来看到有人说5.0以后可以直接用UsageStatsManager来获取信息,而不用之前麻烦的反射了,所以试着用了一下。
不多说了,直接贴主要代码
- Calendar beginCal = Calendar.getInstance();
- beginCal.add(Calendar.HOUR_OF_DAY, -1);
- Calendar endCal = Calendar.getInstance();
- UsageStatsManager manager=(UsageStatsManager)getApplicationContext().getSystemService(USAGE_STATS_SERVICE);
- List<UsageStats> stats=manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,beginCal.getTimeInMillis(),endCal.getTimeInMillis());
这里直接调用了USageStatsManager的queryUsageStas()的方法,里面3个参数,分别是:
- 为int的字段,时间的统计的单位,即小时,天,月,年这类的
- 开始的时间
- 结束的时间
然后我们就能得到UsageStats的list,UsageStats可以提供几个方法给我们,可以得到运行的总时长,最后运行的时间,应用的包名。
- StringBuilder sb=new StringBuilder();
- for(UsageStats us:stats){
- try {
- <span style="white-space:pre"> </span>PackageManager pm=getApplicationContext().getPackageManager();
- ApplicationInfo applicationInfo=pm.getApplicationInfo(us.getPackageName(),PackageManager.GET_META_DATA);
- if((applicationInfo.flags&applicationInfo.FLAG_SYSTEM)<=0){
- SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
- String t=format.format(new Date(us.getLastTimeUsed()));
- sb.append(pm.getApplicationLabel(applicationInfo)+"\t"+t+"\t"+getTimeFromInt(us.getTotalTimeInForeground())+"\n");
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
这里还用到的就是PackageManager,这里能用这个类能通过包名来得到应用的信息,我这里只是简单的获得应用的名称,没有获得其他的信息。
然后在AndroidManifest.xml里加上一句
- <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
- tools:ignore="ProtectedPermissions"/>
就可以运行了。
但是运行时会发现并没有应用,因为我们需要打开对应的权限。可以在代码里加一句
- startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
跳转到对应的权限设置界面,将我们的运用打开就行了。
下面就是完成图
重要的事情多说一遍:只是针对5.0以上的系统
权限一定要给:不给没得玩