我正在创建一个主屏幕启动器,希望它与Android 5.0, Lollipop兼容。我想在启动器上获取最近使用的应用程序列表。
但由于在API 21中ActivityManager.getRecentTasks()
不再起作用,我该怎么做呢?
我正在创建一个主屏幕启动器,希望它与Android 5.0, Lollipop兼容。我想在启动器上获取最近使用的应用程序列表。
但由于在API 21中ActivityManager.getRecentTasks()
不再起作用,我该怎么做呢?
String topPackageName ;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService("usagestats");
long time = System.currentTimeMillis();
// We get usage stats for the last 10 seconds
List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000*10, time);
// Sort the stats by the last time used
if(stats != null) {
SortedMap<Long,UsageStats> mySortedMap = new TreeMap<Long,UsageStats>();
for (UsageStats usageStats : stats) {
mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
}
if(mySortedMap != null && !mySortedMap.isEmpty()) {
topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
}
}
通过使用UsageStatsManager
,您可以获取当前正在运行的前台应用包名称。
我遇到了一个问题,因为安卓已经废弃了一些API,例如getRecentTasks
和getRunningTasks
在API21以上,他们说这些方法不再对第三方应用程序开放。当我在Lollipop以上的设备上调用这些API时,它只会返回null或我的应用程序:(。
然后我找到了一种方法来代替这些API,只要我们能够获取应用程序的packagename
,我们就可以做任何想做的事情。基于Linux的安卓系统,我发现了AndroidProcesses。它可以使用/proc
来获取安卓应用程序的pid
和processName
,而processName
就是com.xxx.xxx:remote
这样的格式。请注意,:
前面的部分是packageName :)
获取了packageName
之后,我想你知道该怎么做了。我认为我们可以启动一个Service
来统计根据正在后台运行的进程最近使用的应用程序。统计时间越长,结果越准确。