在我的应用中,我想以编程方式将最近使用的第三方活动带到前面。在这里查看其他答案后,我尝试使用从最近任务列表返回的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个任务 - 首先是当前任务,第二个是振铃电话的任务。我能够将任务调用到前面,但它并不总是处于相同状态(例如,进入浏览器页面而不是浏览器中的设置屏幕)。最近的任务列表如何做到这一点?
答案 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)重新启动它