diff options
| author | 2016-04-07 17:29:36 -0700 | |
|---|---|---|
| committer | 2016-04-07 17:29:36 -0700 | |
| commit | 0796e9fb3dc2dd03fa5ff2053c63f14861cffa2f (patch) | |
| tree | 20c95f553af2cc5f721fcda54e481550a3434796 | |
| parent | d30606575783acd8689cfac604cba51e537b6b77 (diff) | |
Fix issue #28075893: Don't hold strong refs on to JobService
Change-Id: I822adaee953be9b14213def001b174d5c348fa14
| -rw-r--r-- | core/java/android/app/job/JobService.java | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/core/java/android/app/job/JobService.java b/core/java/android/app/job/JobService.java index 95a8ccf7caf3..77307b73fe5a 100644 --- a/core/java/android/app/job/JobService.java +++ b/core/java/android/app/job/JobService.java @@ -27,6 +27,8 @@ import android.util.Log; import com.android.internal.annotations.GuardedBy; +import java.lang.ref.WeakReference; + /** * <p>Entry point for the callback from the {@link android.app.job.JobScheduler}.</p> * <p>This is the base class that handles asynchronous requests that were previously scheduled. You @@ -62,15 +64,15 @@ public abstract class JobService extends Service { * Identifier for a message that will result in a call to * {@link #onStartJob(android.app.job.JobParameters)}. */ - private final int MSG_EXECUTE_JOB = 0; + private static final int MSG_EXECUTE_JOB = 0; /** * Message that will result in a call to {@link #onStopJob(android.app.job.JobParameters)}. */ - private final int MSG_STOP_JOB = 1; + private static final int MSG_STOP_JOB = 1; /** * Message that the client has completed execution of this job. */ - private final int MSG_JOB_FINISHED = 2; + private static final int MSG_JOB_FINISHED = 2; /** Lock object for {@link #mHandler}. */ private final Object mHandlerLock = new Object(); @@ -82,21 +84,36 @@ public abstract class JobService extends Service { @GuardedBy("mHandlerLock") JobHandler mHandler; - /** Binder for this service. */ - IJobService mBinder = new IJobService.Stub() { + static final class JobInterface extends IJobService.Stub { + final WeakReference<JobService> mService; + + JobInterface(JobService service) { + mService = new WeakReference<>(service); + } + @Override - public void startJob(JobParameters jobParams) { - ensureHandler(); - Message m = Message.obtain(mHandler, MSG_EXECUTE_JOB, jobParams); - m.sendToTarget(); + public void startJob(JobParameters jobParams) throws RemoteException { + JobService service = mService.get(); + if (service != null) { + service.ensureHandler(); + Message m = Message.obtain(service.mHandler, MSG_EXECUTE_JOB, jobParams); + m.sendToTarget(); + } } + @Override - public void stopJob(JobParameters jobParams) { - ensureHandler(); - Message m = Message.obtain(mHandler, MSG_STOP_JOB, jobParams); - m.sendToTarget(); + public void stopJob(JobParameters jobParams) throws RemoteException { + JobService service = mService.get(); + if (service != null) { + service.ensureHandler(); + Message m = Message.obtain(service.mHandler, MSG_STOP_JOB, jobParams); + m.sendToTarget(); + } + } - }; + } + + IJobService mBinder; /** @hide */ void ensureHandler() { @@ -194,6 +211,9 @@ public abstract class JobService extends Service { /** @hide */ public final IBinder onBind(Intent intent) { + if (mBinder == null) { + mBinder = new JobInterface(this); + } return mBinder.asBinder(); } |