diff options
Diffstat (limited to 'core/java/android/inputmethodservice/AbstractInputMethodService.java')
| -rw-r--r-- | core/java/android/inputmethodservice/AbstractInputMethodService.java | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/core/java/android/inputmethodservice/AbstractInputMethodService.java b/core/java/android/inputmethodservice/AbstractInputMethodService.java index a6e77023790c..4ecd15e002ef 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. + * + * <p>This is necessary because {@link RemoteInputConnection} internally uses + * {@link java.lang.ref.WeakReference} to hold {@link InputMethodServiceInternal}.</p> + */ + @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); } /** |
