これは少し遅れていますが、次のことを提案します。もしかしたら参考になるかもしれません。. .
あなたの質問は、のコールバックの使用について特に言及していませんが、WebChromeClientJSについて言及しているため、以下が役立つ場合があります。SDK レベル 16 以下では、特に「クリア」しなくてもコールバックを使用できます。ただし、SDK レベル 17 以降では、イベントをクリアするために行動する必要があることがわかりalert()ましonJSAlert()たWebChromeClient。私が SDK レベル 16 以下でテストしたすべてのデバイスで、コールバックを軽々しく無視しても、すべてが計画通りに進みます。
ただし、onJSAlertオーバーライドさJSResultれると、最後のパラメーターでオブジェクトが配信されることに注意してください。
boolean onJsAlert( WebViewビュー、文字列URL、文字列メッセージ、JsResult結果)
JsResult オブジェクトには 2 つのメソッドが公開されていることがわかります。
公開メソッド
最終無効 キャンセル()
Handle the result if the user cancelled the dialog.
最終ボイド 確認()
Handle a confirmation response from the user
コールバックでtrueが返されると仮定すると(コールバックが onJsAlert イベントを消費したことを示します)、SDK 16 以前を使用していると仮定するとWebView.destroy()、期待どおりのことが行われます。
ただし、SDK 17 (4.2.x) では、コールバックが実際にイベントを処理したことをさらに証明する必要があるようです。result.cancel()またはの呼び出しに失敗するとresult.confirm()、あなたのWebView(または、より正確には、WebViewCore) が永久にスタックしたままになります。私が試したことは何もありWebViewCoreません. (試みられた説明:は単に のラッパー クラスであり、これは次にオブジェクトをインスツルメントします。すべての作業を行うのは最後の仲間です。ソース コードをさまよったり、リフレクションを行ったりすることで、そのオブジェクトに自分の道を掘り下げることができます。もしあなたがそうしたいと思っているなら. はです.WebViewWebViewWebViewProviderWebViewCoreWebViewCoreWebViewCorestaticWebViewCoreあなたのアプリケーション全体のために。したがって、唯一無二の WebViewCore が動かなくなった場合WebView、アプリケーションの no はその後動作しません。たとえば、JSResultメソッドが呼び出されるのを待ってスタックすると、アプリケーションが破棄されるまでスタックします (つまり、アプリを一時停止/再開しても効果はありません)。リフレクションによって得られたアクセスを介してdestroy()、直接呼び出しても効果はありません。WebViewCore注意: を呼び出すdestroy()と、WebViewを呼び出す副作用がありますがdestroy()、WebViewCoreこれも役に立ちません)。
つまり、その症状は
- あなたは
WebView
- いくつかの巧妙な JS の実行、おそらくalert()の呼び出し
- オーバーライド メソッドでalert()を処理します
onJsAlert
result.confirm()あなたはどちらかを呼び出すことができませんresult.cancel()
- あなたは破壊する
WebView
- その後、
WebViewアプリケーションの no は何もロードしません。
良いニュースは、適切な JsResult メソッドを呼び出してオーバーライドするコールバックのイベントを確実に「クリア」する場合、WebViewCoreが永久に停止することはなく、アプリケーションが満足することです。