Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get recent tasks on Android "L"?

Tags:

Background

My app allows to sort an apps list by the time they were recently launched .

The problem

As of Android "L" , the function getRecentTasks will just return the list of apps that the current app has launched, as written in the documentation:

If your app uses ActivityManager.getRecentTasks()...

With the introduction of the new concurrent documents and activities tasks feature in the upcoming release (see Concurrent documents and activities in Recents screen below), the ActivityManager.getRecentTasks() method is now deprecated to improve user privacy. For backward compatibility, this method still returns a small subset of its data, including the calling application’s own tasks and possibly some other non-sensitive tasks (such as Home). If your app is using this method to retrieve its own tasks, use android.app.ActivityManager.getAppTasks() instead to retrieve that information.

Same is written when using ADT to show the documentation of this function (not currently available on the Internet) :

This method is deprecated. As of L, this method is no longer available to third party applications: as the introduction of document-centric recents means it can leak personal information to the caller. For backwards compatibility, it will still return a small subset of its data: at least the caller's own tasks (though see getAppTasks() for the correct supported way to retrieve that information), and possibly some other tasks such as home that are known to not be sensitive.

I don't get why this act was taken, as it's easy to see which apps the user has, and even without any permission.

Thing is, this is a big restriction for this feature that I've added, so I hope there is a way to overcome this.

What I've tried

For now, I only used a heuristic way about which apps were recently launched - I get the list of running processes instead.

I could also use the importance value of the processes and maybe the "importanceReasonComponent" , but this is just all heuristics and guesses ...

The question

Is there a way to overcome this restriction? Any workaround I haven't thought of?

Maybe it's possible with root? Or BusyBox ?

like image 934
android developer Avatar asked Jul 05 '14 21:07

android developer


People also ask

What are tasks in Android?

A task is a collection of activities that users interact with when trying to do something in your app. These activities are arranged in a stack—the back stack—in the order in which each activity is opened.

How do I close all tasks in Android?

Close all apps: Swipe up from the bottom, hold, then let go. Swipe from left to right. On the left, tap Clear all. Close all apps on Android Go: Swipe up from the bottom, hold, then let go.


2 Answers

To get the top (Foreground) package name currently running you need to use the Usage Stats API in Android Lollipop.

But notice user has to approve the access to usage data in the settings for each Application. So you should prompt the user directly to the setting by launching setting action with

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); 

To get top packagename:

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.isEmpty()) {             topPackageName =  mySortedMap.get(mySortedMap.lastKey()).getPackageName();                                            }                                            } } 
like image 182
user3742392 Avatar answered Sep 30 '22 18:09

user3742392


If you Use UsageStats to get the current foreground package, you will get the wrong information when user opens the notification drawer or on a locked screen. (tested on both Android Lollipop and Marshmallow)

You have to use UsageStatsManager.queryEvents() and look for the latest event with MOVE_TO_FOREGROUND event type for deciding the current foreground package.

like image 33
Sam Lu Avatar answered Sep 30 '22 19:09

Sam Lu