2013-08-04 93 views
8

我有一個很奇怪的問題。即使沒有使用服務,也會漏出窗口異常

我一直在我的logcat出現這個崩潰,但奇怪的是這是我的應用程序與Text To Speech沒有任何關係。不只是這個活動,我的整個應用程序根本不使用它。

08-04 03:47:19.321: E/ActivityThread(24755): Activity com.lablabla.similarsearch.WebViewActivity has leaked ServiceConnection [email protected] that was originally bound here 
08-04 03:47:19.321: E/ActivityThread(24755): android.app.ServiceConnectionLeaked: Activity com.lablabla.similarsearch.WebViewActivity has leaked ServiceConnection [email protected] that was originally bound here 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:974) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:868) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ContextImpl.bindServiceAsUser(ContextImpl.java:1452) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ContextImpl.bindService(ContextImpl.java:1440) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.content.ContextWrapper.bindService(ContextWrapper.java:496) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.speech.tts.TextToSpeech.connectToEngine(TextToSpeech.java:685) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.speech.tts.TextToSpeech.initTts(TextToSpeech.java:655) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:608) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.webkit.AccessibilityInjector$TextToSpeechWrapper.<init>(AccessibilityInjector.java:682) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.webkit.AccessibilityInjector.addTtsApis(AccessibilityInjector.java:483) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.webkit.AccessibilityInjector.addAccessibilityApisIfNecessary(AccessibilityInjector.java:168) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.webkit.AccessibilityInjector.updateJavaScriptEnabled(AccessibilityInjector.java:418) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.webkit.WebViewClassic.updateJavaScriptEnabled(WebViewClassic.java:1682) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.webkit.WebSettingsClassic.setJavaScriptEnabled(WebSettingsClassic.java:1125) 
08-04 03:47:19.321: E/ActivityThread(24755): at com.lablabla.similarsearch.WebViewActivity.onCreate(WebViewActivity.java:24) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.Activity.performCreate(Activity.java:5133) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.os.Looper.loop(Looper.java:137) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ActivityThread.main(ActivityThread.java:5103) 
08-04 03:47:19.321: E/ActivityThread(24755): at java.lang.reflect.Method.invokeNative(Native Method) 
08-04 03:47:19.321: E/ActivityThread(24755): at java.lang.reflect.Method.invoke(Method.java:525) 
08-04 03:47:19.321: E/ActivityThread(24755): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
08-04 03:47:19.321: E/ActivityThread(24755): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-04 03:47:19.321: E/ActivityThread(24755): at dalvik.system.NativeStart.main(Native Method) 

下面是該活動的代碼(它所做的就是從Intent得到一個URL,並將其加載到WebView

public class WebViewActivity extends Activity { 

    public static final String EXTRA_URL = "extra_url"; 

    private WebView webView; 
    private String baseUrl; 

    @SuppressLint("SetJavaScriptEnabled") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.webview); 
     webView = (WebView) findViewById(R.id.webView); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.setWebViewClient(new WebViewClient()); 
     webView.getSettings().setUserAgentString(
      "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/20 Safari/537.31"); 
     baseUrl = getIntent().getStringExtra(EXTRA_URL); 
     webView.loadUrl(baseUrl); 
    } 
} 
+0

你有沒有想過這是什麼?使用TalkBack測試我的應用時,我看到了同樣的情況。當我點擊後退按鈕退出我的一項活動時,話語提示會發出相同的錯誤。我的活動也啓用了JavaScript的webview。我的活動不主動使用TTS服務。我只是測試它與TalkBack的效果。我在Google網上論壇上發現了一個討論相同問題的線索,但顯然它自己已經解決了問題。 https://groups.google.com/forum/#!topic/eyes-free/b_3OJI8h4tQ –

+0

我沒有。 它似乎並不影響應用程序本身,我不能發現任何跡象表明它會導致與其他應用程序或服務相關的任何問題影響手機的正常功能。我剛開始了這個賞金,也許它會以這種方式解決。 –

回答

13

我一直在我的logcat得到這個崩潰,但奇怪的是,我的 應用程序與文字轉語音無關。不只是這個 活動,我的整個應用程序根本不使用它。

您的應用程序確實與它無關。

除此之外,當你撥打:

webView.getSettings().setJavaScriptEnabled(true); 

方法WebViewClassic.updateJavaScriptEnabled(布爾)執行:

void updateJavaScriptEnabled(boolean enabled) { 
    if (isAccessibilityInjectionEnabled()) { 

==>>>> // Call placed to AccessibilityInjector.updateJavaScriptEnabled(boolean) 
     getAccessibilityInjector().updateJavaScriptEnabled(enabled); 
    } 
} 

這裏,isAccessibilityInjectionEnabled()回報true在設備的情況下。它檢索當前啓用的輔助功能服務列表,並提供/支持AccessibilityServiceInfo.FEEDBACK_SPOKEN。如果此列表非空,則返回true

向上移動堆棧跟蹤:

android.webkit.AccessibilityInjector.addTtsApis()

最終創建一個TextToSpeech對象。

問題:TextToSpeech.connectToEngine()使用Context調用bindService()。上下文是您的Activity的上下文(從WebView傳遞)。我相信logcat的顯示時WebViewActivity啓動本(或類似的東西):

成功地綁定到com.google.android.tts

假說:當你的活動被破壞並重新創建在屏幕上旋轉,當上下文無效時,TTS服務仍然綁定。這是例外引用的內容。

我嘗試了以下測試我的假設:

而是在XML定義的WebView,我創造了它動態地的onCreate():我使用的應用程序上下文代替

webView = new WebView(getApplicationContext()); 

公告活動的(這)。上下文在方向更改中保持有效,因此不會拋出異常。

要確認一個(或多個)無障礙服務的功能,這個代碼添加到您的活動的onCreate():

AccessibilityManager am = (AccessibilityManager) 
            getSystemService(ACCESSIBILITY_SERVICE); 

List<AccessibilityServiceInfo> listOfServices = 
           am.getEnabledAccessibilityServiceList(
            AccessibilityServiceInfo.FEEDBACK_ALL_MASK); 

for (AccessibilityServiceInfo asi : listOfServices) { 
    Log.i("", "Accessibility Service >>>>>>>>: " + asi.getSettingsActivityName()); 
Log.i("", "Accessibility Service >>>>>>>>: " + 
           asi.loadDescription(getPackageManager())); 

} 

注:我不得不打開TalkBack(在設置>輔助功能)複製問題。另外,我不確定爲什麼在強制停止應用程序之後不會拋出異常。

根據用戶Robert Nekic的評論:後退行爲:使用活動的上下文時引發異常。應用程序的環境仍然有效。

有用的信息:Link

+0

當Talkback針對Android 4.4啓用時,我得到了AccessibilityInjector的logcat錯誤。你可以在這裏提出任何問題的解決方法:http://stackoverflow.com/q/29434063/1263215 –

+0

webview =(WebView)findViewById(R.id.webview_wv);我通過查找獲得了webview,那麼如何避免此異常? – thecr0w

+1

@ thecr0w我發現使用'Application'上下文是規避這種異常的唯一方法。明顯的副作用是你不能在xml中定義'WebView'。您必須在運行時創建它並將其添加到您的佈局。有一件事你可以嘗試:在xml中定義你的'WebView'並使用通過'LayoutInflater.fromContext(getApplicationContext())'獲得的'LayoutInflater'來擴充該佈局。我不能說它會起作用。 – Vikram

2

您可以添加此代碼段來避免這種服務連接泄露例外:

class YourActivity extends Activity { 
WebView yourWebView; 

    @Override 
    public void onDestroy() { 

     if (yourWebView != null) { 
      yourWebView.getSettings().setJavaScriptEnabled(false); 
     } 
} 

yourWebView.getSettings()setJavaScriptEnabled(假)。將觸發調用AccessibilityInjector。 updateJavaScriptEnabled(),其中 :

private void removeTtsApis() { 
    if (mTextToSpeech != null) { 
     mTextToSpeech.stop(); 
     mTextToSpeech.shutdown(); 
     mTextToSpeech = null; 
    } 

    mWebView.removeJavascriptInterface(ALIAS_TTS_JS_INTERFACE); 
} 

mTextToSpeech.shutdown()僅僅是關鍵點。

相關問題