diff options
| author | TreeHugger Robot <treehugger-gerrit@google.com> | 2021-10-01 09:39:55 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-10-01 09:39:55 +0000 |
| commit | ceed9751d3dc4c911a61058ad7bfc79f0031ddf2 (patch) | |
| tree | 48330928ed0149870d25e39ea946ff3c86fb59ce /core/java/android/inputmethodservice/AbstractInputMethodService.java | |
| parent | 01c65d86c29e027c0e4f9e073ba082bf2f98be24 (diff) | |
| parent | 1ab4cb2da6e33e2bf25c0e535e01233ce367331e (diff) | |
Merge "Fix InputMethodServiceInternal lifetime"
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); } /** |
