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

时间:2012-10-26 03:04:13

标签: android android-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();
    }
}

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

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

3 个答案:

答案 0 :(得分:7)

通过查看Android源代码来解决这个问题 - 这正是“近期任务”屏幕所做的,包括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);
        }
    }
}

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

答案 1 :(得分:1)

从Android L开始,getRecentTasks()返回应用程序自己的任务以及可能的其他一些非敏感任务(例如Home),因此您无法完成此类工作。

参考文献:https://developer.android.com/preview/api-overview.html#Behaviors

答案 2 :(得分:-1)

为什么不使用所有活动访问的全局静态变量及其onPause,只需将该变量设置为该活动值 例如 我正在放置一个名为ActivityName的静态变量

public static String ActivityName = "";

并且在每个活动的onPause中只为其分配活动pacakage名称

@Override
public void onPause() {
    super.onPause();
    // The static global variable 
    com.pacakagename.Utls.ActivityName = "com.pacakagename.Act1";
}

因此,当任何活动暂停时,该值将被激活,您将了解最近暂停的活动,并且可以使用Class.forName(ActivityName)重新启动它