일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 리틀포레스트
- FirebaseAuth
- 보늬밤
- WebView
- Dokka
- 피보나치
- 제곱근
- 동적프로그래밍
- DynamicProgramming
- LRU
- darkmode
- 형변환
- devicedriver
- 피요모리2
- MFC
- QoS
- 코인거스름돈
- Dialog
- Collection
- DataStructure
- 쌓기게임
- Java
- AfxMessageBox
- android
- memory
- SPI
- stack
- math
- synergy
- Kotlin
- Today
- Total
퉁탕퉁탕 만들어보자
Activity 화면 전환 시 onConfigurationChanged에서 처리하기 본문
화면을 회전하자 activity가 죽었다가 재시작을 하게된다.
어떻게 하면 Activity가 onDestroy -> onCreate하며 재시작하지 않게 할 수 있을까?
화면 orientation(세로/가로) 변경 시 configuration이 change되었을 때 activity는 destory -> create가 되는 것은 resource를 다시 로드해서 올바르게 화면을 표시하게 할 수 있도록 framework가 의도한 동작이다.
보통 layout파일을 layout-land, layout-port 두가지로 파일을 유지한다.
하지만 layout이 거의 비슷하면 파일 두개로 쓰지않고 하나로 쓰면서, 달라지는 부분만 dimen값을 values-land 에만 따로 정의한다.
--> 이렇게 사용하면 재시작이 필요하다
하지만 리소스 업데이트 없이 java코드에서 직접! 가로/세로 layout 길이 등등을 변경하고자한다면 매니페스트 파일에서 configChanges되었을때 재시작되지 않게 하는 옵션을 추가해준다.
AndroidManifest.xml
<activity
android:name=".PolicyActivity"
android:configChanges="orientation"|"screenSize"|"screenLayout">
</activity>
* 주의! 애플리케이션이 Android 3.2(API 레벨 13) 이상을 대상으로 하는 경우 "screenLayout"및 "screenSize"구성도 선언필요. 이는 장치가 세로 및 가로 방향으로 전환될 때 화면 레이아웃과 화면 크기가 변경될 수 있기 때문입니다.
참고: https://developer.android.com/guide/topics/manifest/activity-element#config
이렇게 하면 Activity가 재시작되지 않는다. 대신 onConfigurationChaged()라는 콜백이 불리게 되고,
우리가 onConfigurationChanged()를 override하여 해당 config의 변경시 처리해줄 내용들을 직접 처리하면 된다.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// 가로일때 직접 textview의 width 변경
ViewGroup.LayoutParams params = mTextView.getLayoutParams();
params.width = getResoureces().getDimensionPixelSize(R.dimen.text_width);
mTextView.setLayoutParams(params);
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// 세로일때 처리
}
}
장점은, 잦은 회전에도 메모리 사용이 절약된다. Activity가 재시작된다고 해서 기존 instance가 바로 메모리에서 삭제되지는 않기 때문이다.
하지만 개인적으로는 onConfigurationChanged는 남용하지 않고 꼭 필요한경우에만 사용하는것을 추천한다.
resource처리가 까다롭기 때문에 대체로 재시작하는게 나은 경우가 많다.
화면 전환말고도 다양한 config change 는 다음을 참고하도록 한다.
https://developer.android.com/guide/topics/manifest/activity-element#config
'Computer > Android' 카테고리의 다른 글
Android 시스템 Setting의 값 읽기/쓰기 (0) | 2022.04.16 |
---|---|
내 Activity에서 볼륨 변경을 어떻게 알 수 있을까?(System content observer) (0) | 2022.04.15 |
onSaveInstanceState 는 어떻게 사용하지? (0) | 2022.04.15 |
Activity Lifecycle (0) | 2022.04.10 |
Android WebView에 Darkmode 적용하기 (0) | 2021.06.28 |