summaryrefslogtreecommitdiff
path: root/core/java/android/inputmethodservice/AbstractInputMethodService.java
diff options
context:
space:
mode:
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);
}
/**