안드로이드 블루투스 키보드 연결시 웹뷰(액티비티) 재생성 현상 방지하기

황씨·2024년 10월 8일
post-thumbnail

나는 웹뷰로 된 앱을 관리 중에 있다. 처음보는 현상이 일어났고 그것을 해결했기에 까먹지 않게 해결 과정을 정리는 해놓을려고 한다.

우선 해당 현상은 블루투스 키보드 연결시 액티비티가 재생성되는 현상이다. 이는 액티비티가 파괴되어서 다시 재생성 되는 것으로 보인다. 그 이유는 블루투스 키보드를 연결시 액티비티의 구성변경이 일어나기 때문에 재생성 되는 것으로 보인다.

재생성에 대해서 자세하게 사이클을 한번 보자면

  • onSaveInstanceState(Bundle) : 화면 상태를 저장한다.
  • onPause()
  • onStop()
  • onDestroy()
  • onCreate(Bundle)
  • onStart()
  • onRestoreInstanceState(Bundle) : 아까 저장했던 화면 상태를 복원시킨다
  • onResume()

이런식으로 흘러간다.

하지만 그냥 다른 작업 필요없이 재생성시키지 않고 유지만 시키면 되기 때문에

AndroidMainfest.xml 파일에 있는

<activity
     android:name=".MainActivity"
     android:configChanges="keyboard|keyboardHidden|orientation|screenSize"/>

configChanges 에 변경될 수 있는 설정들을 지정해주기로 하였다.
이런식으로 설정을 하면 재생성 대신에 onConfigurationChange() 만을 호출한다.


그래서 편하게 저것만 수정해서 시스템에서 자동으로 흘러갈 수 있도록 해결을 할려했지만,
왠걸 configChanges 에 keyboard|keyboardhidden 을 넣어도 액티비티가 재생성되는 현상이 계속 발생한다.

도저히 이유를 찾을 수가 없었다. 심지어 다른 키보드마다 먹히는게 있었고 안먹히는게 있어서 이유를 모른상태로 onSaveInstanceState() onRestoreInstanceState() 을 쓰는 등 여러가지 방법들을 시도하였는데, 특정 키보드는 아무리해도 해결이 되지 않았다. 2일~3일정도 방법을 계속 찾았지만 해결을 못하던 찰나,

혹시 얘를 이 키보드를 블루투스 키보드로 인식하지 못하는 건 아닐까?..

라는 생각이 머리속을 스쳐가고,,,

혹시 몰라서 configChanges 에 넣을 수 있는것들을 하나씩 전부 넣어보면서 찾았는데

<activity
     android:name=".MainActivity"
     android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode|mcc|mnc|locale|fontScale|density|navigation"/>

문제는 바로 이놈

navigation

이놈이다.

“navigation”: Navigation Type ( 트랙볼 / DPad ) 가 변경되었을 때 ( 보통 절대 일어나지 않는 Case )

후,, 나는 하드웨어에 대해 잘 알지 못하지만,,
이 키보드 녀석을 DPAD 로 인식을 하고 있는거 같았다.

구글링을 했을때도 보통 절대 일어나지 않은 CASE 라고 봤었기에 간과하고 있었는데
이 녀석을 넣으니 아무일도 없었다는듯이 모든게 해결되었다.

혹시 나같은 현상을 겪은 사람들은 configChanges에 하나씩 넣으면서 어떤것으로 인식을 하고 있는지 확인하기 바란ㄷ...ㅠ

profile
성격존나급한 개발자

0개의 댓글