summaryrefslogtreecommitdiff
path: root/core/java/android/app/LoadedApk.java
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2010-10-26 17:44:01 -0700
committerDianne Hackborn <hackbod@google.com>2010-10-27 17:13:29 -0700
commite829fef63957a23b61cdb01bb692a17a041ff2dc (patch)
tree8e201bd9ef8648eb2d70f700205925f7b000d24f /core/java/android/app/LoadedApk.java
parent162b689c5257d7e6a937cf734c0edde470c77969 (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.java95
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);
}
}
}