如何使用后台作业在Interval中查找用户访问的应用程序列表?

时间:2014-12-03 10:37:02

标签: android android-activity android-background

我想从后台工作中找出用户在特定时间间隔(例如:5分钟)访问的apps列表? 这是否可以在非root android手机上使用?如果可能的话,我非常有兴趣了解答案,因为这将是一个关于android的很好的学习。

2 个答案:

答案 0 :(得分:7)

<强>更新

  

在android 5.0中,getRecentTasks()方法的替代方法是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
}

这与长按主页按钮时显示的列表相同。

抽象方法:(后来解释)

  

在我们指定的时间内确定所需的列表   电话(期间)。最近的任务列表将被要求在   期间的开始和之后的每个较小的期间   我们称之为间隔期。

     

最近的应用。在第一个间隔后将包含的列表   三种类型的应用程序。旧应用程序,不符合我们的利益,   新推出和重新推出的应用程序。选择背后的原因   抽象方法正在检测重新启动的应用程序。

     

检测新推出的应用

     

这些是应用程序。这根本就没有出现在第一个   获取列表。 (在此之前)。

通过示例解释为什么采用这种方法:

  • 考虑任何应用都是个好主意。出现在您的应用之前。在稍后提取的列表中重新启动的应用程序。从我们开始操作时开始,这是来自应用内部的应用程序。是最重要的。

enter image description here

  • 但是,你的应用。可以从顶部退出并在间隔时间内返回到它。 (Facebook&gt; Twitter&gt;您的应用程序)。

enter image description here

  • 在稍后提取的列表中另一个应用。可能会在顶部。将它作为参考也会因为你的应用程序的原因而失败。失败作为参考。

获胜方法:

  

在间隔之前获取的列表将是列表的引用   间隔后取出。重新启动的应用程序。将是应用程序。   出现在第一个有序子列表(fosl)之前。

enter image description here

所有应用。在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。检查出来,并报告错误。

因为我们提到的弱点而无法检测到一个或两个应用程序,因此希望真正影响您从收集应用程序中获得的研究结果。从大量用户发布。如果你还在做什么呢。否则,你的应用程序。可以经常获得新推出的应用程序并通知用户。

答案 1 :(得分:-1)

是的。这是可能的。您的服务需要每5秒运行一次。在该服务中,您必须为用户访问的任何应用程序编写逻辑。您必须使用ActivityManager类来获取正在运行的应用程序。