Various fixes.
Bug #7132226: Can't start instrumentation due to ActivityManagerService crash
Bug #6912004: tap on gmail notification sends me to home screen
Change-Id: I824128b01f368de95dee288f8e49039b84479a7e
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 895b52a..bc835b6 100755
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -725,7 +725,7 @@
+ ", giving up", e);
mService.appDiedLocked(app, app.pid, app.thread);
requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
- "2nd-crash");
+ "2nd-crash", false);
return false;
}
@@ -1092,7 +1092,7 @@
if (prev != null) {
if (prev.finishing) {
if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev);
- prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE);
+ prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE, false);
} else if (prev.app != null) {
if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev);
if (prev.waitingVisible) {
@@ -1504,7 +1504,7 @@
Slog.d(TAG, "no-history finish of " + last + " on new resume");
}
requestFinishActivityLocked(last.appToken, Activity.RESULT_CANCELED, null,
- "no-history");
+ "no-history", false);
}
}
@@ -1726,7 +1726,7 @@
// activity and try the next one.
Slog.w(TAG, "Exception thrown during resume of " + next, e);
requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null,
- "resume-exception");
+ "resume-exception", true);
return true;
}
@@ -2080,7 +2080,7 @@
continue;
}
if (finishActivityLocked(p, srcPos,
- Activity.RESULT_CANCELED, null, "reset")) {
+ Activity.RESULT_CANCELED, null, "reset", false)) {
replyChainEnd--;
srcPos--;
}
@@ -2143,7 +2143,7 @@
continue;
}
if (finishActivityLocked(p, srcPos,
- Activity.RESULT_CANCELED, null, "reset")) {
+ Activity.RESULT_CANCELED, null, "reset", false)) {
taskTopI--;
lastReparentPos--;
replyChainEnd--;
@@ -2200,7 +2200,7 @@
}
if (p.intent.getComponent().equals(target.intent.getComponent())) {
if (finishActivityLocked(p, j,
- Activity.RESULT_CANCELED, null, "replace")) {
+ Activity.RESULT_CANCELED, null, "replace", false)) {
taskTopI--;
lastReparentPos--;
}
@@ -2270,7 +2270,7 @@
continue;
}
if (finishActivityLocked(r, i, Activity.RESULT_CANCELED,
- null, "clear")) {
+ null, "clear", false)) {
i--;
}
}
@@ -2284,7 +2284,7 @@
int index = indexOfTokenLocked(ret.appToken);
if (index >= 0) {
finishActivityLocked(ret, index, Activity.RESULT_CANCELED,
- null, "clear");
+ null, "clear", false);
}
return null;
}
@@ -2313,7 +2313,7 @@
continue;
}
if (!finishActivityLocked(r, i, Activity.RESULT_CANCELED,
- null, "clear")) {
+ null, "clear", false)) {
i++;
}
}
@@ -2579,6 +2579,7 @@
mDismissKeyguardOnNextActivity = false;
mService.mWindowManager.dismissKeyguard();
}
+ Slog.i(TAG, "DONE STARTING!");
return err;
}
@@ -3319,7 +3320,7 @@
Slog.d(TAG, "no-history finish of " + r);
}
requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
- "no-history");
+ "no-history", false);
} else {
if (DEBUG_STATES) Slog.d(TAG, "Not finishing noHistory " + r
+ " on stop because we're just sleeping");
@@ -3531,7 +3532,7 @@
ActivityRecord r = (ActivityRecord)stops.get(i);
synchronized (mService) {
if (r.finishing) {
- finishCurrentActivityLocked(r, FINISH_IMMEDIATELY);
+ finishCurrentActivityLocked(r, FINISH_IMMEDIATELY, false);
} else {
stopActivityLocked(r);
}
@@ -3585,7 +3586,7 @@
* some reason it is being left as-is.
*/
final boolean requestFinishActivityLocked(IBinder token, int resultCode,
- Intent resultData, String reason) {
+ Intent resultData, String reason, boolean oomAdj) {
int index = indexOfTokenLocked(token);
if (DEBUG_RESULTS || DEBUG_STATES) Slog.v(
TAG, "Finishing activity @" + index + ": token=" + token
@@ -3596,7 +3597,7 @@
}
ActivityRecord r = mHistory.get(index);
- finishActivityLocked(r, index, resultCode, resultData, reason);
+ finishActivityLocked(r, index, resultCode, resultData, reason, oomAdj);
return true;
}
@@ -3613,10 +3614,11 @@
if ((r.resultWho == null && resultWho == null) ||
(r.resultWho != null && r.resultWho.equals(resultWho))) {
finishActivityLocked(r, i,
- Activity.RESULT_CANCELED, null, "request-sub");
+ Activity.RESULT_CANCELED, null, "request-sub", false);
}
}
}
+ mService.updateOomAdjLocked();
}
final boolean finishActivityAffinityLocked(IBinder token) {
@@ -3639,7 +3641,8 @@
if (cur.taskAffinity != null && !cur.taskAffinity.equals(r.taskAffinity)) {
break;
}
- finishActivityLocked(cur, index, Activity.RESULT_CANCELED, null, "request-affinity");
+ finishActivityLocked(cur, index, Activity.RESULT_CANCELED, null,
+ "request-affinity", true);
index--;
}
return true;
@@ -3677,16 +3680,16 @@
* list, or false if it is still in the list and will be removed later.
*/
final boolean finishActivityLocked(ActivityRecord r, int index,
- int resultCode, Intent resultData, String reason) {
- return finishActivityLocked(r, index, resultCode, resultData, reason, false);
+ int resultCode, Intent resultData, String reason, boolean oomAdj) {
+ return finishActivityLocked(r, index, resultCode, resultData, reason, false, oomAdj);
}
/**
* @return Returns true if this activity has been removed from the history
* list, or false if it is still in the list and will be removed later.
*/
- final boolean finishActivityLocked(ActivityRecord r, int index,
- int resultCode, Intent resultData, String reason, boolean immediate) {
+ final boolean finishActivityLocked(ActivityRecord r, int index, int resultCode,
+ Intent resultData, String reason, boolean immediate, boolean oomAdj) {
if (r.finishing) {
Slog.w(TAG, "Duplicate finish request for " + r);
return false;
@@ -3730,7 +3733,7 @@
if (immediate) {
return finishCurrentActivityLocked(r, index,
- FINISH_IMMEDIATELY) == null;
+ FINISH_IMMEDIATELY, oomAdj) == null;
} else if (mResumedActivity == r) {
boolean endTask = index <= 0
|| (mHistory.get(index-1)).task != r.task;
@@ -3754,7 +3757,7 @@
// it is done pausing; else we can just directly finish it here.
if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r);
return finishCurrentActivityLocked(r, index,
- FINISH_AFTER_PAUSE) == null;
+ FINISH_AFTER_PAUSE, oomAdj) == null;
} else {
if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r);
}
@@ -3767,17 +3770,17 @@
private static final int FINISH_AFTER_VISIBLE = 2;
private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
- int mode) {
+ int mode, boolean oomAdj) {
final int index = indexOfActivityLocked(r);
if (index < 0) {
return null;
}
- return finishCurrentActivityLocked(r, index, mode);
+ return finishCurrentActivityLocked(r, index, mode, oomAdj);
}
private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
- int index, int mode) {
+ int index, int mode, boolean oomAdj) {
// First things first: if this activity is currently visible,
// and the resumed activity is not yet visible, then hold off on
// finishing until the resumed one becomes visible.
@@ -3796,7 +3799,9 @@
if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
+ " (finish requested)");
r.state = ActivityState.STOPPING;
- mService.updateOomAdjLocked();
+ if (oomAdj) {
+ mService.updateOomAdjLocked();
+ }
return r;
}
@@ -3816,7 +3821,8 @@
|| prevState == ActivityState.INITIALIZING) {
// If this activity is already stopped, we can just finish
// it right now.
- boolean activityRemoved = destroyActivityLocked(r, true, true, "finish-imm");
+ boolean activityRemoved = destroyActivityLocked(r, true,
+ oomAdj, "finish-imm");
if (activityRemoved) {
resumeTopActivityLocked(null);
}
@@ -4008,9 +4014,8 @@
ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG);
}
if (r.app.activities.size() == 0) {
- // No longer have activities, so update location in
- // LRU list.
- mService.updateLruProcessLocked(r.app, oomAdj, false);
+ // No longer have activities, so update oom adj.
+ mService.updateOomAdjLocked();
}
}