금융프로젝트(하이브리드앱) 하면서 폴더블 폰 넓은화면 <-> 접을경우 바깥 화면으로 전환시 웹뷰 상태가 유지가 안되는 문제가 발생했다.

찾아보니 간단하면서도 오묘한? 설정이 필요했다.

 

MainActivity.java

/*
onSaveInstanceState 함수는 앱이 종료되기 직전 OnDestroy 이전에 호출된다.
폴더블 폰을 접는 행위를 할경우 호출되면서 웹뷰의 상태값을 저장한다.
*/
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {

    Bundle webViewState = new Bundle();
    WebView webView = mIWebview.getWebview(mIWebview.getWebviewListIndex());
    webView.saveState(webViewState);
	
    // 웹뷰 번들 상태값 저장
    outState.putBundle("webview_state", webViewState);
    // 스플레시 UI가 다시 뜨지않게 상태값 저장
    outState.putBoolean("splash_state", mIsSplash);
    super.onSaveInstanceState(outState);
}

/*
폴더블 폰이 완전 접힐 경우 앱의 라이플 사이클이 다시 동작하기 때문에
onCreate 에서 saveInstanceState를 확인해서 웹뷰에 적용하면 된다.
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
	 if (savedInstanceState != null) {
         // 저장된
         mIWebview.getWebview(mIWebview.getWebviewListIndex()).restoreState(savedInstanceState.getBundle("webview_state"));
         mIsSplash = savedInstanceState.getBoolean("splash_state");
     } else {
         mIWebview.setLoadUrl(App.getInstance().getMain_url());
     }
}

 

AndroidManifest.xml

<!--
웹뷰가 화면 전환시 reload 되지 않고 그대로 짠~~ 하고 유지된 상태로 나타나게 하려면 configChanges 옵션을 주목해야된다.
configChanges="screenLayout|screenSize|smallestScreenSize" 이 3가지 옵션이 있어야만
웹뷰상태가 온전히 유지되면 reload 없이 깔끔하게 화면이 전환된다.
-->

<!--android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"-->
<activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"
    android:screenOrientation="portrait"
    android:exported="true">
    
                           .... 생략 ....

+ Recent posts