4

在我的应用程序中,我想以编程方式将最近使用的第三方 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 中打开它可能会带来风险。 ..仍然希望这是可能的。

编辑:稍微修改了代码以反映我在做什么。所需的任务几乎总是列表中的第三个任务 - 第一个是当前任务,第二个是响铃电话的任务。我可以将任务调用到前面,但它并不总是处于相同的状态(例如,转到浏览器的页面而不是浏览器中的设置屏幕)。最近的任务列表是如何做到这一点的?

4

3 回答 3

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 才能正常工作。

于 2012-11-02T02:50:10.083 回答
1

从 Android L 开始,getRecentTasks() 返回应用程序自己的任务,可能还有其他一些非敏感任务(如 Home),所以你不能做这样的工作。

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

于 2014-07-03T04:27:41.313 回答
-1

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

public static String ActivityName = "";

并在每个活动的 onPause 中为其分配活动包名称

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

因此,当任何活动暂停时,都会分配值,您将了解最近暂停的活动,您可以使用 Class.forName(ActivityName) 重新启动它

于 2012-10-26T05:28:15.750 回答