android – 如何在使用后台工作的间隔中查找用户访问的应用程序列表?

前端之家收集整理的这篇文章主要介绍了android – 如何在使用后台工作的间隔中查找用户访问的应用程序列表?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从后台工作中找出用户特定时间间隔(例如:5分钟)访问的应用程序列表?
这是否可以在无根的 Android手机上?如果可能,我非常有兴趣知道答案,因为这将是一个伟大的学习关于android.

解决方法

更新:

In android 5.0 an alternative of getRecentTasks() method is getAppTasks.

代码示例:

private void listTasks() throws PackageManager.NameNotFoundException {
  ActivityManager mgr = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
  List<ActivityManager.AppTask>  tasks = mgr.getAppTasks();
  String packagename;
  String label;
  for (ActivityManager.AppTask task: tasks){
    packagename = task.getTaskInfo().baseIntent.getComponent().getPackageName();
    label = getPackageManager().getApplicationLabel(getPackageManager().getApplicationInfo(packagename,PackageManager.GET_Meta_DATA)).toString();
    Log.v(TAG,packagename + ":" + label);
  }
}

原始答案:

介绍

ActivityManager类提供了两种返回此类信息的方法.选择getRecentTasks或getRunningTasks方法是合适的,因为返回的任务列表不是我们的目标.但是,它将被用作确定所需列表的路上的参考点.

代码示例:

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<RecentTaskInfo> activitys = activityManager.getRecentTasks(Integer.MAX_VALUE,ActivityManager.RECENT_IGNORE_UNAVAILABLE);
for (int i = 0; i < activitys.size(); i++) {
    RecentTaskInfo activity = activitys.get(i);
    activity.baseIntent.getComponent().getPackageName();
}

过滤:此列表包括所有类型的任务,包括系统任务.

代码示例:

if (activity.baseIntent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) {
    // This is an application.
    getPackageManager()
        .getApplicationLabel(getPackageManager()
        .getApplicationInfo(activity.baseIntent.getComponent()
        .getPackageName(),PackageManager.GET_Meta_DATA)); // application name
}

这是与长按主屏幕按钮相同的列表.

抽象方法:(说明稍后)

To determine the desired list within the specified time that we will
call (period). The recent tasks list will be asked for in the
beginning of the period and after each smaller period within the
period that we will call interval.

The recent apps. list fetched after the first interval will contain
three type of apps. Old-apps,which are not in our interest,
New-launched and Re-launched apps. The reason behind choosing the
abstract approach is detecting the Re-launched apps.

Detecting New-launched Apps:

Those are the apps. that simply didn’t appear in the very first
fetched list. (before the period).

为例说明这个方法

>考虑任何应用程序将是一个好主意.出现在你的应用程序之前在稍后提取的列表中重新启动应用程序.因为当我们开始运行时,这是从应用程序的内部,你的应用程序.列在名单上.

>但是,你的应用程序可以从顶部下来,并在间隔时间内恢复. (Facebook> Twitter>您的应用程式).

>在以后获取的列表中,另一个应用程序.可能会上升.将其作为参考,也将因您的应用程序出现同样的原因而失败.失败作为参考.

获奖方式:

The list fetched before an interval will be the reference for the list
fetched after the interval. the re-launched apps. would be the apps.
appeared before the first-ordered-sub-list(fosl).

所有的应用程序在fosl重新启动之前,不仅是什么是应用程序.而且,可以很容易地证明.没有办法重新排列fosl之上的应用程序,其中一些可能在没有fosl被改变的情况下被重新启动(更大的包括更多的应用程序).你可以锻炼身体

即使用户删除了一些应用程序,fosl方法也会起作用.从列表中手动在间隔内.只有在以前的时间间隔内没有检测到删除的应用程序才会被检测到.但是,它不会影响列表中其余部分的fosl方法.如果用户清除所有列表,只有清除的应用程序,同样的事情.将不会检测到,而不是在相同的间隔内启动的.

为什么间隔?因为这么长时间的用户可以打开并重新启动应用程序.然后,清除列表或删除一些.

较小的间隔也会使用户难以打开任何顶级子列表,同样的顺序,这是fosl方法的唯一弱点.

示例代码:(fosl)

public int getIndexOfFirstAppBeforeFOSL(ArrayList<App> recentApps) {
    int i=prevIoUsRecentApps.size()-1,j = recentApps.size()-1;
    for (; i>=0 && j>=0 ; i--) {
        App app = prevIoUsRecentApps.get(i);
        if (app.equals(recentApps.get(j))) {
            j--;
        } else {
            // this application got re-launched and therefore it changed it place in list.
            // or removed manually by user.
        }
    }

    return j;
}

我为应用程序创建了一个GitHub project.检查出来,并报告错误(如果有的话).

缺少检测一个或两个应用程序,我们提到的弱点真的会影响您收集应用程序的研究结果.从大量用户发布.如果你还在干什么呢否则,你的应用程序.可以经常得到新推出的应用程序并通知用户它.

猜你在找的Android相关文章