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

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

Solutions Collecting From Web of "如何使用后台作业find用户在Interval中访问的应用程序列表?"

更新:

在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类提供了两种返回这种信息的方法。 selectgetRecentTasks或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(); } 

过滤:此列表包括所有types的任务,包括系统任务。

代码示例:

 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 } 

这是长按主页button时将显示的相同列表。

抽象方法:(后面的解释)

在指定的时间内确定所需的清单,我们将调用(期间)。 最近的任务列表将在期间开始,并在每隔一段时间后,我们将要求间隔。

最近的应用程序。 在第一个时间间隔之后提取的列表将包含三种types的应用程序。 旧应用程序,这是不符合我们的兴趣,新推出和重新启动的应用程序。 select抽象方法的原因是检测重新启动的应用程序。

检测新推出的应用程序:

这些是应用程序。 那根本没有出现在第一个被提取的列表中。 (在期间之前)。

举例说明为什么这种方法:

  • 考虑任何应用程序将是一个好主意。 出现在您的应用程序 在稍后获取的列表中重新启动的应用程序。 因为当我们开始操作,这是从应用程序,您的应用程序。 位列榜首。

在这里输入图像说明

  • 但是,你的应用程序。 可能会从顶部下来,并在间隔时间内回到它。 (Facebook> Twitter>您的应用程序)。

在这里输入图像说明

  • 在稍后提取的列表中的另一个应用程序。 可能会在最上面。 把它作为参考也会失败,出于同样的原因你的应用程序。 未能作为参考。

获奖方法:

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

在这里输入图像说明

所有的应用程序。 在fosl重新启动之前,不仅是什么应用程序。 而且,它可以很容易地被certificate。 没有办法在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; } 

我为应用程序创build了一个GitHub项目 。 检查出来,并报告错误,如果有的话。

缺less检测一个或两个应用程序,我们提到的弱点真的会影响你从收集应用程序获得的研究结果。 从大量的用户获得启动。 如果那你在做什么呢。 否则,你的应用程序。 可以经常获得新的应用程序。 并通知用户。

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