android4.4\frameworks\base\packages\SystemUI\src\com\android\systemui\recent\RecentsActivity.java

此函数是打开最近应用点击空闲地方跳转

public void dismissAndGoHome() {

if (mRecentsPanel != null) {

Intent homeIntent = new Intent(Intent.ACTION_MAIN, null);

homeIntent.addCategory(Intent.CATEGORY_HOME);

homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK

| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

startActivityAsUser(homeIntent, new UserHandle(UserHandle.USER_CURRENT));//这里是跳转到系统最高Launch 里面

}

}

//记录最近应用在这里面

android4.4\frameworks\base\packages\SystemUI\src\com\android\systemui\recent\RecentTasksLoader.java

protected Void doInBackground(Void... params) {

// We load in two stages: first, we update progress with just the first screenful

// of items. Then, we update with the rest of the items

final int origPri = Process.getThreadPriority(Process.myTid());

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

final PackageManager pm = mContext.getPackageManager();

final ActivityManager am = (ActivityManager)

mContext.getSystemService(Context.ACTIVITY_SERVICE);

final List recentTasks =

am.getRecentTasks(MAX_TASKS, ActivityManager.RECENT_IGNORE_UNAVAILABLE);

int numTasks = recentTasks.size();

ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN)

.addCategory(Intent.CATEGORY_HOME).resolveActivityInfo(pm, 0);

boolean firstScreenful = true;

ArrayList tasks = new ArrayList();

// skip the first task - assume it‘s either the home screen or the current activity.

final int first = 0;

for (int i = first, index = 0; i < numTasks && (index < MAX_TASKS); ++i) {

if (isCancelled()) {

break;

}

final ActivityManager.RecentTaskInfo recentInfo = recentTasks.get(i);

Intent intent = new Intent(recentInfo.baseIntent);

if (recentInfo.origActivity != null) {

intent.setComponent(recentInfo.origActivity);

}

//关键代码

// Don‘t load the current home activity.

if (isCurrentHomeActivity(intent.getComponent(), homeInfo)) {//这里是屏蔽了系统最高launch 不记录在最近应用的栈中

continue;

}

// Don‘t load ourselves

if (intent.getComponent().getPackageName().equals(mContext.getPackageName())) {

continue;

}

TaskDescription item = createTaskDescription(recentInfo.id,

recentInfo.persistentId, recentInfo.baseIntent,

recentInfo.origActivity, recentInfo.description);

if (item != null) {

while (true) {

try {

tasksWaitingForThumbnails.put(item);

break;

} catch (InterruptedException e) {

}

}

tasks.add(item);

if (firstScreenful && tasks.size() == mNumTasksInFirstScreenful) {

publishProgress(tasks);

tasks = new ArrayList();

firstScreenful = false;

//break;

}

++index;

}

}

if (!isCancelled()) {

publishProgress(tasks);

if (firstScreenful) {

// always should publish two updates

publishProgress(new ArrayList());

}

}

while (true) {

try {

tasksWaitingForThumbnails.put(new TaskDescription());

break;

} catch (InterruptedException e) {

}

}

Process.setThreadPriority(origPri);

return null;

}

};

mTaskLoader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

loadThumbnailsAndIconsInBackground(tasksWaitingForThumbnails);

}

原文:http://blog.csdn.net/wang2470198567/article/details/39549141

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐