2016-06-28 4 views
2

저는 작업중인 약간의 취미 앱이 있습니다. 기본 레이아웃에서 웹 뷰를 사용합니다. webview 내부의 링크를 클릭하면 사용자가 webview 내에있게됩니다. 앱을 시작한 후에도 앱 내부에있는 동안 모든 것이 정상입니다. 그러나 휴대 전화가 잠시 잠자기 후 앱을 다시 열어 내가 중단했던 곳에서 서핑을하면 예기치 않은 동작이 발생합니다.긴 잠을 자면 Android webview가 응답하지 않습니다.

  1. 웹 페이지에는 텍스트가로드되지만 이미지는 표시되지 않습니다 (물음표 또는 예상되는 이미지의 빈 공간).
  2. webview에서 웹 페이지의 링크를 클릭하면 사용자가 webview에서 나가고 외부 브라우저가 열립니다. 참고로

는, 나는 이미 수행 한 :

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    webview.saveState(outState); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    webview.restoreState(savedInstanceState); 
} 

뿐만 아니라이 내부에서 onCreate 코드 :

if (savedInstanceState != null) { 
    webview.restoreState(savedInstanceState); 
}else{ 
    // this means my app is starting from scratch and do the necessary webview loading 
} 

을 내가 실종하지만 웹뷰하고있어 확실하지 않다 긴 잠을 자면 더 나은 용어가 결여되어 "깨진"것처럼 보입니다. 이 문제에 관해 더 많은 정보를 찾으려고 노력했지만 더 많은 사람들이이 문제를 접하게되는 것을 보지 못했습니다. 사람들은 webview가 이런 방식으로 사용될 것을 기대하지 않거나 잘못된 것을하고 있습니다. 나는 그것이 후자라고 생각한다.

의견을 보내 주셔서 감사합니다.

추가 정보 : webview는 앱의 루트 활동입니다. 문제를 복제하는 단계는 webview에서 메인 메뉴를 눌러 앱이 웹보기 활동을 일시 중지하거나 잠자기 상태로 두거나 전화를 켜고 앱을 열고 웹 페이지가로드 된 마지막 페이지에서 활동이 다시 시작되도록하는 것입니다. 충분히 오래 기다리면 webview 활동이 언급 한 동작을 나타냅니다. 나는 또한 설치 기본 라이프 사이클 기능 onResume, onPause, 중지시,들의 OnDestroy 모든 등 각각의 슈퍼 함수를 ​​호출 한

..

나는 또한 WebViewClient와 WebChromeClient를 사용합니까.

내 WebViewClient는 "onPageStarted", "onReceivedError", "shouldOverloadUrlLoading"및 "onPageFinished"만 처리합니다.

반면 WebChromeClient는 "onGeolocationPermissionShowPrompt"및 "onProgressChanged"만 수행합니다.

둘 모두 페이지로드 진행률을 표시하기 위해 웹보기 상단에 로딩 막대를 만드는 데 사용됩니다.

답변

1

나는 꽤 많은 테스트를 해왔지만 가장 유용한 것은 onResume, onPause, onStop, onDestroy 및 onSaveInstanceState 및 onRestoreInstanceState와 같은 라이프 사이클의 Toast 메시지입니다.

제가 너무 [상기 코드를 재 작성 (상태 복원)과 같은 코드의 블록을 사용 하였다 인해 내부에 디버깅을 위해, I 눈치 토스트 메시지

if(savedInstanceState!=null){ 
    webview.restoreState(savedInstanceState); 
}else{ 
    // do the webview getsettings such as setUseWideViewPort and setSupportZoom 
    // setInitialScale, setJavaScriptEnabled, etc.. 
    // as well as setting WebViewClient and WebChromeClient 
    // then preloading the webview with the default url 
} 

그 긴 슬립 후, 안드로이드는 분명 내 활동을 죽이고 onCreate가 다시 호출됩니다. 내가 설명하지 않은 것은 webview에 관한 모든 것을 복원하지 않는 webview.restoreState였습니다.

위의 "else"블록 내부에는 아무 것도 복원하지 않습니다. 결과적으로 그 시간 동안 설정 한 모든 것이 사라집니다. 따라서 웹 사이트 만 저장되고 WebView 및 WebChrome 클라이언트는 저장되지 않았습니다.

이로 인해 위에서 언급 한 문제가 발생했습니다.

외부의 "else"블록에서 설정 블록을 이동하면 웹보기가 필요한 설정으로 다시 설정 될 수있었습니다.

추가 정보 : onRestoreInstanceState() 보호 기능을 제거했는데 걱정스러운 부분에서는 아무 것도하지 않는 것 같습니다.

솔루션에서 간과 된 사항에 대해 의견이나 제안을 환영합니다. 감사.