Google从 API 21 新增了接口 android.app.usage , 通过这个api我们可以统计到每个app的使用情况,启动次数,启动时间等,也可以判断是否运行在前后台,比较方便,也可以用作埋点,统计框架中,今天就来深入的学习一下。
获取前后台
5.0以前做法是这样的:
代码如下 | 复制代码 |
publicStringgetForegroundApp(Context context) { Listlr=context.getRunningAppProcesses();if(lr ==null) {returnnull; }for(RunningAppProcessInfo ra : lr) {if(ra.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE || ra.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {returnra.processName; } }returnnull; } |
突然从5.0就不能用了。这就有点eggs pain, 很多人通过检查当前自己应用的界面做标记, 在可见和不可见的生命周期中分别做记录,来判断是否前台。 getRecentTasks( ) 也废弃使用了,我们在清单注册getTask权限已经被收回了,那怎么办,android api其实已经想好了替代品,那就是 AppUsageStatistics
需要用户授权才可以,好,就学学姿势吧。
5.0以后用AppUsageStatistics来获取
代码如下 | 复制代码 |
privateStringgetForegroundApp() {longts = System.currentTimeMillis(); ListqueryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,ts-2000, ts);if(queryUsageStats ==null|| queryUsageStats.isEmpty()) {returnnull; } UsageStats recentStats =null;for(UsageStats usageStats : queryUsageStats) {if(recentStats ==null|| recentStats.getLastTimeUsed() < usageStats.getLastTimeUsed()) { recentStats = usageStats; } }returnrecentStats.getPackageName; } |
看是不是 很简单,或许你都没听过吧!好 follow me!
AppUasgeStatistics
1 首先清单申请权限
2 获取UsageStatsManager
接着通过context GET到UsageStatsManager。
代码如下 | 复制代码 |
UsageStatsManager mUsageStatsManager = (UsageStatsManager) getActivity() .getSystemService("usagestats");//Context.USAGE_STATS_SERVICE |
3 使用
我通过这个api获取一下每个app的使用情况, intervalType是统计的周期,是统计区间,UsageStatsManager 内部提供四个原则,有:年,月,周,日。
代码如下 | 复制代码 |
DAILY("Daily", UsageStatsManager.INTERVAL_DAILY), WEEKLY("Weekly", UsageStatsManager.INTERVAL_WEEKLY), MONTHLY("Monthly", UsageStatsManager.INTERVAL_MONTHLY), YEARLY("Yearly", UsageStatsManager.INTERVAL_YEARLY); |
为了拓展我定义一个CustomUsageStats, UsageStats是谷歌提供一个统计类,里面可以获取app的使用情况。
代码如下 | 复制代码 |
publicclassCustomUsageStats {publicUsageStats usageStats;publicDrawable appIcon; } |
下面这段代码就是获取每个app的使用情况的。
代码如下 | 复制代码 |
public ListgetUsageStatistics(int intervalType) { // Get the app statistics since one year ago from the current time. Calendar cal = Calendar.getInstance();cal.add(Calendar.YEAR, -1);ListqueryUsageStats = mUsageStatsManager.queryUsageStats(intervalType, cal.getTimeInMillis(), System.currentTimeMillis()); if (queryUsageStats.size() == 0) {Log.i(TAG,"The user may not allow the access to apps usage. ");Toast.makeText(getActivity(), getString(R.string.explanation_access_to_appusage_is_not_enabled), Toast.LENGTH_LONG).show();mOpenUsageSettingButton.setVisibility(View.VISIBLE);mOpenUsageSettingButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));} });} return queryUsageStats;} |
当然上面代码只是获取app的使用情况,来写个列表,用适配器用来展现app的包名,最后使用的时间,以及图标icon。
代码如下 | 复制代码 |
publicclassUsageListAdapter extends RecyclerView.Adapter{privateListmCustomUsageStatsList =newArrayList<>();privateDateFormat mDateFormat =newSimpleDateFormat();/** * Provide a reference to the type of views that you are using (custom ViewHolder) */publicstaticclassViewHolder extends RecyclerView.ViewHolder {privatefinal TextView mPackageName;privatefinal TextView mLastTimeUsed;privatefinal ImageView mAppIcon;publicViewHolder(View v) { super(v); mPackageName = (TextView) v.findViewById(R.id.textview_package_name); mLastTimeUsed = (TextView) v.findViewById(R.id.textview_last_time_used); mAppIcon = (ImageView) v.findViewById(R.id.app_icon); }publicTextViewgetLastTimeUsed() {returnmLastTimeUsed; }publicTextViewgetPackageName() {returnmPackageName; }publicImageViewgetAppIcon() {returnmAppIcon; } }publicUsageListAdapter() { } @OverridepublicViewHolderonCreateViewHolder(ViewGroup viewGroup,intviewType) { View v = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.usage_row, viewGroup,false);returnnewViewHolder(v); } @OverridepublicvoidonBindViewHolder(ViewHolder viewHolder, finalintposition) { viewHolder.getPackageName().setText( mCustomUsageStatsList.get(position).usageStats.getPackageName());longlastTimeUsed = mCustomUsageStatsList.get(position).usageStats.getLastTimeUsed(); viewHolder.getLastTimeUsed().setText(mDateFormat.format(newDate(lastTimeUsed))); viewHolder.getAppIcon().setImageDrawable(mCustomUsageStatsList.get(position).appIcon); } @OverridepublicintgetItemCount() {returnmCustomUsageStatsList.size(); }publicvoidsetCustomUsageStatsList(ListcustomUsageStats) { mCustomUsageStatsList = customUsageStats; } } |
后记
这个api不是说想用就能用,必须用户授权了才能统计到。所以我们在做移动端埋点时可以加入这个api,方便我们更精确的搜集app的使用情况。