修改路径在frameworks下
frameworks\base\services\core\java\com\android\server\wm\ActivityStarter.java
在ActivityStarter.java文件下:找到下面的函数
startActivityInner(final ActivityRecord r, ActivityRecord sourceRecord,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
int startFlags, ActivityOptions options, Task inTask,
TaskFragment inTaskFragment, @BalCode int balCode,
NeededUriGrants intentGrants, int realCallingUid)
在此函数内几处代码添加判断:
1)
if (startResult != START_SUCCESS) {
++ reusedWindowingMode(sourceRecord, options);//此处添加判断
if (r.resultTo != null) {
r.resultTo.sendResult(INVALID_UID, r.resultWho, r.requestCode, RESULT_CANCELED,
null /* data /, null / dataGrants */);
}
return startResult;
}
2)
if (targetTaskTop != null) {
if (LAUNCH_SINGLE_INSTANCE == mLaunchMode && mSourceRecord != null
&& targetTask == mSourceRecord.getTask()) {
final ActivityRecord activity = mRootWindowContainer.findActivity(mIntent,
mStartActivity.info, false);
if (activity != null && activity.getTask() != targetTask) {
activity.destroyIfPossible(“Removes redundant singleInstance”);
}
}
startResult = recycleTask(targetTask, targetTaskTop, reusedTask, intentGrants);
if (startResult != START_SUCCESS) {
++ reusedWindowingMode(sourceRecord, options);//此处添加判断
return startResult;
}
} else {
mAddingToTask = true;
}
3)
++ reusedWindowingMode(sourceRecord, options);//此处添加判断
if (newTask) {
final Task taskToAffiliate = (mLaunchTaskBehind && mSourceRecord != null)
? mSourceRecord.getTask() : null;
setNewTask(taskToAffiliate);
} else if (mAddingToTask) {
addOrReparentStartingActivity(targetTask, “adding to task”);
}
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import android.graphics.Rect;
private void reusedWindowingMode(ActivityRecord sourceRecord, ActivityOptions options){
if (mTargetRootTask != null && mTargetRootTask.getWindowingMode() != WINDOWING_MODE_FREEFORM){
if (options != null){
if(options.getLaunchWindowingMode() == WINDOWING_MODE_FREEFORM){
mTargetRootTask.setWindowingMode(options.getLaunchWindowingMode());
mTargetRootTask.setBounds(options.getLaunchBounds());
mTargetRootTask.setAlwaysOnTop(true);
}
}else{
if(sourceRecord != null && sourceRecord.getWindowingMode() == WINDOWING_MODE_FREEFORM){
mTargetRootTask.setWindowingMode(sourceRecord.getWindowingMode());
final Rect appBounds = sourceRecord.getConfiguration().windowConfiguration.getAppBounds();
Rect rect = new Rect(appBounds.left + 50, appBounds.top + 50, appBounds.left + 1920 + 50, appBounds.top + 1080 + 50);
mTargetRootTask.setBounds(rect);
mTargetRootTask.setAlwaysOnTop(true);
}
}
}else{
if(sourceRecord != null && sourceRecord.getWindowingMode() == WINDOWING_MODE_FREEFORM){
mTargetRootTask.setWindowingMode(sourceRecord.getWindowingMode());
final Rect appBounds = sourceRecord.getConfiguration().windowConfiguration.getAppBounds();
Rect rect = new Rect(appBounds.left + 50, appBounds.top + 50, appBounds.left + 1920 + 50, appBounds.top + 1080 + 50);
mTargetRootTask.setBounds(rect);
mTargetRootTask.setAlwaysOnTop(true);
}
}
}