diff --git a/core/java/android/appwidget/AppWidgetHost.java b/core/java/android/appwidget/AppWidgetHost.java index 8e86824761e27..1af4953658253 100644 --- a/core/java/android/appwidget/AppWidgetHost.java +++ b/core/java/android/appwidget/AppWidgetHost.java @@ -16,6 +16,7 @@ package android.appwidget; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; @@ -58,18 +59,28 @@ public class AppWidgetHost { private DisplayMetrics mDisplayMetrics; private String mContextOpPackageName; - Handler mHandler; - int mHostId; - Callbacks mCallbacks = new Callbacks(); - final HashMap mViews = new HashMap(); + private final Handler mHandler; + private final int mHostId; + private final Callbacks mCallbacks; + private final HashMap mViews = new HashMap<>(); private OnClickHandler mOnClickHandler; - class Callbacks extends IAppWidgetHost.Stub { + static class Callbacks extends IAppWidgetHost.Stub { + private final WeakReference mWeakHandler; + + public Callbacks(Handler handler) { + mWeakHandler = new WeakReference<>(handler); + } + public void updateAppWidget(int appWidgetId, RemoteViews views) { if (isLocalBinder() && views != null) { views = views.clone(); } - Message msg = mHandler.obtainMessage(HANDLE_UPDATE, appWidgetId, 0, views); + Handler handler = mWeakHandler.get(); + if (handler == null) { + return; + } + Message msg = handler.obtainMessage(HANDLE_UPDATE, appWidgetId, 0, views); msg.sendToTarget(); } @@ -77,20 +88,36 @@ public class AppWidgetHost { if (isLocalBinder() && info != null) { info = info.clone(); } - Message msg = mHandler.obtainMessage(HANDLE_PROVIDER_CHANGED, + Handler handler = mWeakHandler.get(); + if (handler == null) { + return; + } + Message msg = handler.obtainMessage(HANDLE_PROVIDER_CHANGED, appWidgetId, 0, info); msg.sendToTarget(); } public void providersChanged() { - mHandler.obtainMessage(HANDLE_PROVIDERS_CHANGED).sendToTarget(); + Handler handler = mWeakHandler.get(); + if (handler == null) { + return; + } + handler.obtainMessage(HANDLE_PROVIDERS_CHANGED).sendToTarget(); } public void viewDataChanged(int appWidgetId, int viewId) { - Message msg = mHandler.obtainMessage(HANDLE_VIEW_DATA_CHANGED, + Handler handler = mWeakHandler.get(); + if (handler == null) { + return; + } + Message msg = handler.obtainMessage(HANDLE_VIEW_DATA_CHANGED, appWidgetId, viewId); msg.sendToTarget(); } + + private static boolean isLocalBinder() { + return Process.myPid() == Binder.getCallingPid(); + } } class UpdateHandler extends Handler { @@ -132,6 +159,7 @@ public class AppWidgetHost { mHostId = hostId; mOnClickHandler = handler; mHandler = new UpdateHandler(looper); + mCallbacks = new Callbacks(mHandler); mDisplayMetrics = context.getResources().getDisplayMetrics(); bindService(); } @@ -251,10 +279,6 @@ public class AppWidgetHost { } } - private boolean isLocalBinder() { - return Process.myPid() == Binder.getCallingPid(); - } - /** * Stop listening to changes for this AppWidget. */