Clear reference to the IIntentReceiver in order to avoid memory leak

When using sendOrderedBroadcast(..) with a BroadcastReceiver the
BroadcastReceiver instance was not released. The reason for this was that
the resultTo field in the BroadcastRecord kept a reference until it was pushed
out of the mBroadcastHistory. This reference in turn kept a reference to the
process side IIntentReceiver (implemented in ReceiverDispatcher$InnerReceiver).
This in turn had a strong reference (through mStrongRef) to the Context.

In order to keep the debug output the resultTo is also kept as a String in the
new resultToString variable.

Change-Id: I4382a22a541c27b3694fb2b78a04ee820b235f8f
This commit is contained in:
Johannes Carlsson
2010-10-27 10:08:10 +02:00
committed by Dianne Hackborn
parent c91f9fe542
commit b5a8654dea
2 changed files with 4 additions and 1 deletions

View File

@@ -11009,6 +11009,9 @@ public final class ActivityManagerService extends ActivityManagerNative
performReceiveLocked(r.callerApp, r.resultTo,
new Intent(r.intent), r.resultCode,
r.resultData, r.resultExtras, false, false);
// Set this to null so that the reference
// (local and remote) isnt kept in the mBroadcastHistory.
r.resultTo = null;
} catch (RemoteException e) {
Slog.w(TAG, "Failure sending broadcast result of " + r.intent, e);
}

View File

@@ -45,7 +45,7 @@ class BroadcastRecord extends Binder {
final boolean initialSticky; // initial broadcast from register to sticky?
final String requiredPermission; // a permission the caller has required
final List receivers; // contains BroadcastFilter and ResolveInfo
final IIntentReceiver resultTo; // who receives final result if non-null
IIntentReceiver resultTo; // who receives final result if non-null
long dispatchTime; // when dispatch started on this set of receivers
long receiverTime; // when current receiver started for timeouts.
long finishTime; // when we finished the broadcast.