如何将最近使用过的第三方活动带到前面?

Eri*_*old 4 android android-activity

在我的应用程序中,我想以编程方式将最近使用的第三方Activity带到前面.在看了这里的其他答案之后,我尝试使用从最近任务列表返回的baseIntent重新启动活动,但这似乎并没有将活动带到前面而不管其他任何事情发生.

我的最终目标是创建一个应用程序,用一个小覆盖替换来电屏幕,这样用户就不会完全退出他们接到电话时使用的任何应用程序.我发现你无法替换默认的来电屏幕(如果不是这样,请让我知道,因为我宁愿这样做)所以作为一种解决方法,我试图调用最近使用的应用程序屏幕的正面(覆盖来电屏幕),然后在其上方显示我的叠加层.

这是我正在使用的代码(活动是从广播接收器发起的)

public class BringMRUAppToFront extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        ActivityManager activityManager = (ActivityManager) getSystemService("activity");
        List<RecentTaskInfo> recentTasks = activityManager.getRecentTasks(1, ActivityManager.RECENT_WITH_EXCLUDED);
        if(recentTasks.size() > 2) {
            RecentTaskInfo recentTask = recentTasks.get(2);
            Intent testIntent = recentTask.baseIntent;
            Log.i("MyApp", "Recent task - " + recentTask.baseIntent.getComponent().getPackageName());

            testIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
            startActivity(testIntent);
        }
        finish();
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有可靠的方法将任何第三方活动带到前线?保证活动在内存中(如果一个不在内存中,那么我只显示主屏幕),所以那里不应该有问题.在这种情况下,我也不相信这会是一个安全问题,因为它只会显示一个在电话响起之前可见的应用程序 - 尽管我确实知道在SDK中打开这一点可能会带来风险. ..仍然希望它是可能的.

编辑:略微修改代码以反映我正在做的事情.所需任务几乎总是列表中的第3个任务 - 首先是当前任务,第二个是振铃电话的任务.我能够将任务调用到前面,但它并不总是处于相同状态(例如,进入浏览器页面而不是浏览器中的设置屏幕).最近的任务列表如何做到这一点?

Eri*_*old 7

通过查看Android源代码来计算出来 - 这正是Recent Tasks屏幕所做的,包括Honeycomb之前和之后:

RecentTaskInfo recentTask = recentTasks.get(1); // task 0 is current task
// maintains state more accurately - only available in API 11+ (3.0/Honeycomb+)
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
    final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    am.moveTaskToFront(recentTask.id, ActivityManager.MOVE_TASK_WITH_HOME);
} else { // API 10 and below (Gingerbread on down)
    Intent restartTaskIntent = new Intent(recentTask.baseIntent);
    if (restartTaskIntent != null) {
        restartTaskIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
        try {
            startActivity(restartTaskIntent);
        } catch (ActivityNotFoundException e) {
            Log.w("MyApp", "Unable to launch recent task", e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

权限android.permission.REORDER_TASKS是正常工作所必需的.