diff options
| author | Dianne Hackborn <hackbod@google.com> | 2010-10-26 17:44:01 -0700 |
|---|---|---|
| committer | Dianne Hackborn <hackbod@google.com> | 2010-10-27 17:13:29 -0700 |
| commit | e829fef63957a23b61cdb01bb692a17a041ff2dc (patch) | |
| tree | 8e201bd9ef8648eb2d70f700205925f7b000d24f /core/java/android/app/LoadedApk.java | |
| parent | 162b689c5257d7e6a937cf734c0edde470c77969 (diff) | |
Add facility for broadcasts receives to do work asynchronously.
You can now call goAsync() and move your work to a background thread.
If you are that kind of receiver. You weirdo.
Also allows SharedPreferences.apply() to be committed off the main
thread after returning from onReceive().
Change-Id: I27f975910e28f230ababcaeb551eb9a78ec4fc76
Diffstat (limited to 'core/java/android/app/LoadedApk.java')
| -rw-r--r-- | core/java/android/app/LoadedApk.java | 95 |
1 files changed, 35 insertions, 60 deletions
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index 0644f96e44e5..7f24d277149c 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -660,37 +660,40 @@ final class LoadedApk { final IntentReceiverLeaked mLocation; RuntimeException mUnregisterLocation; - final class Args implements Runnable { + final class Args extends BroadcastReceiver.PendingResult implements Runnable { private Intent mCurIntent; - private int mCurCode; - private String mCurData; - private Bundle mCurMap; - private boolean mCurOrdered; - private boolean mCurSticky; - + private final boolean mOrdered; + + public Args(Intent intent, int resultCode, String resultData, Bundle resultExtras, + boolean ordered, boolean sticky) { + super(resultCode, resultData, resultExtras, + mRegistered ? TYPE_REGISTERED : TYPE_UNREGISTERED, + ordered, sticky, mIIntentReceiver.asBinder()); + mCurIntent = intent; + mOrdered = ordered; + } + public void run() { - BroadcastReceiver receiver = mReceiver; + final BroadcastReceiver receiver = mReceiver; + final boolean ordered = mOrdered; + if (ActivityThread.DEBUG_BROADCAST) { int seq = mCurIntent.getIntExtra("seq", -1); Slog.i(ActivityThread.TAG, "Dispatching broadcast " + mCurIntent.getAction() + " seq=" + seq + " to " + mReceiver); Slog.i(ActivityThread.TAG, " mRegistered=" + mRegistered - + " mCurOrdered=" + mCurOrdered); + + " mOrderedHint=" + ordered); } - IActivityManager mgr = ActivityManagerNative.getDefault(); - Intent intent = mCurIntent; + final IActivityManager mgr = ActivityManagerNative.getDefault(); + final Intent intent = mCurIntent; mCurIntent = null; if (receiver == null) { - if (mRegistered && mCurOrdered) { - try { - if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG, - "Finishing null broadcast to " + mReceiver); - mgr.finishReceiver(mIIntentReceiver, - mCurCode, mCurData, mCurMap, false); - } catch (RemoteException ex) { - } + if (mRegistered && ordered) { + if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG, + "Finishing null broadcast to " + mReceiver); + sendFinished(mgr); } return; } @@ -698,24 +701,14 @@ final class LoadedApk { try { ClassLoader cl = mReceiver.getClass().getClassLoader(); intent.setExtrasClassLoader(cl); - if (mCurMap != null) { - mCurMap.setClassLoader(cl); - } - receiver.setOrderedHint(true); - receiver.setResult(mCurCode, mCurData, mCurMap); - receiver.clearAbortBroadcast(); - receiver.setOrderedHint(mCurOrdered); - receiver.setInitialStickyHint(mCurSticky); + setExtrasClassLoader(cl); + receiver.setPendingResult(this); receiver.onReceive(mContext, intent); } catch (Exception e) { - if (mRegistered && mCurOrdered) { - try { - if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG, - "Finishing failed broadcast to " + mReceiver); - mgr.finishReceiver(mIIntentReceiver, - mCurCode, mCurData, mCurMap, false); - } catch (RemoteException ex) { - } + if (mRegistered && ordered) { + if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG, + "Finishing failed broadcast to " + mReceiver); + sendFinished(mgr); } if (mInstrumentation == null || !mInstrumentation.onException(mReceiver, e)) { @@ -724,17 +717,9 @@ final class LoadedApk { + " in " + mReceiver, e); } } - if (mRegistered && mCurOrdered) { - try { - if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG, - "Finishing broadcast to " + mReceiver); - mgr.finishReceiver(mIIntentReceiver, - receiver.getResultCode(), - receiver.getResultData(), - receiver.getResultExtras(false), - receiver.getAbortBroadcast()); - } catch (RemoteException ex) { - } + + if (receiver.getPendingResult() != null) { + finish(); } } } @@ -798,23 +783,13 @@ final class LoadedApk { Slog.i(ActivityThread.TAG, "Enqueueing broadcast " + intent.getAction() + " seq=" + seq + " to " + mReceiver); } - Args args = new Args(); - args.mCurIntent = intent; - args.mCurCode = resultCode; - args.mCurData = data; - args.mCurMap = extras; - args.mCurOrdered = ordered; - args.mCurSticky = sticky; + Args args = new Args(intent, resultCode, data, extras, ordered, sticky); if (!mActivityThread.post(args)) { if (mRegistered && ordered) { IActivityManager mgr = ActivityManagerNative.getDefault(); - try { - if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG, - "Finishing sync broadcast to " + mReceiver); - mgr.finishReceiver(mIIntentReceiver, args.mCurCode, - args.mCurData, args.mCurMap, false); - } catch (RemoteException ex) { - } + if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG, + "Finishing sync broadcast to " + mReceiver); + args.sendFinished(mgr); } } } |
