summaryrefslogtreecommitdiff
path: root/core/java/android/inputmethodservice/AbstractInputMethodService.java
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2021-10-01 09:39:55 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2021-10-01 09:39:55 +0000
commitceed9751d3dc4c911a61058ad7bfc79f0031ddf2 (patch)
tree48330928ed0149870d25e39ea946ff3c86fb59ce /core/java/android/inputmethodservice/AbstractInputMethodService.java
parent01c65d86c29e027c0e4f9e073ba082bf2f98be24 (diff)
parent1ab4cb2da6e33e2bf25c0e535e01233ce367331e (diff)
Merge "Fix InputMethodServiceInternal lifetime"
Diffstat (limited to 'core/java/android/inputmethodservice/AbstractInputMethodService.java')
-rw-r--r--core/java/android/inputmethodservice/AbstractInputMethodService.java17
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);
}
/**