diff --git a/core/java/android/inputmethodservice/AbstractInputMethodService.java b/core/java/android/inputmethodservice/AbstractInputMethodService.java index a6e77023790c6..4ecd15e002efd 100644 --- a/core/java/android/inputmethodservice/AbstractInputMethodService.java +++ b/core/java/android/inputmethodservice/AbstractInputMethodService.java @@ -66,7 +66,17 @@ import java.io.PrintWriter; public abstract class AbstractInputMethodService extends WindowProviderService implements KeyEvent.Callback { private InputMethod mInputMethod; - + + /** + * Keep the strong reference to {@link InputMethodServiceInternal} to ensure that it will not be + * garbage-collected until {@link AbstractInputMethodService} gets garbage-collected. + * + *
This is necessary because {@link RemoteInputConnection} internally uses + * {@link java.lang.ref.WeakReference} to hold {@link InputMethodServiceInternal}.
+ */ + @Nullable + private InputMethodServiceInternal mInputMethodServiceInternal; + final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState(); @@ -225,7 +235,10 @@ public abstract class AbstractInputMethodService extends WindowProviderService if (mInputMethod == null) { mInputMethod = onCreateInputMethodInterface(); } - return new IInputMethodWrapper(createInputMethodServiceInternal(), mInputMethod); + if (mInputMethodServiceInternal == null) { + mInputMethodServiceInternal = createInputMethodServiceInternal(); + } + return new IInputMethodWrapper(mInputMethodServiceInternal, mInputMethod); } /**