항상 android : configChanges =“keyboardHidden | orientation”을 사용하지 않는 이유는 무엇입니까?


178

android:configChanges="keyboardHidden|orientation"모든 (거의 모든;) 활동에 사용하지 않는지 궁금했습니다 .

상품:

  • 당신의 활동이 회전에 대해 걱정할 필요가 없습니다
  • 더 빠르다

그렇게 좋지 않다 :

  • 화면 크기에 따라 레이아웃을 변경해야합니다 (예 : 열이 두 개인 레이아웃)

나쁜:

  • 다른 방향으로 다른 레이아웃을 갖는 유연한 방법이 없음
  • 조각을 사용할 때 그렇게 좋지 않습니다

그러나 다른 레이아웃을 사용하지 않는다면 왜 안됩니까?


6
당신은 또한 당신의 keyboardHidden | orientation
가하고

지정된 구성 변경 사항의 기본 처리를 사용하지 못하고 응용 프로그램이 처리 할 수 ​​있습니까?
Mikooos

2
그렇기 때문에이 옵션이있는 이유는 무엇을하고 있는지 (리소스에 아무런 변화가 없음) 알고 있다면 사용하십시오.
포인터 널

왜 ScreenSize를 사용하는 것보다 더 빠릅니까?
batmaci

답변:


334

빠른 배경

기본적으로 Android에서 특정 키 구성 변경이 발생하는 경우 (일반적인 예는 방향 변경), Android는 실행중인 활동을 완전히 다시 시작하여 해당 변경에 맞게 조정합니다.

android:configChanges="keyboardHidden|orientation"AndroidManifest에서 정의 할 때 Android에 다음과 같이 말합니다. "키보드를 뽑거나 휴대 전화를 회전 할 때 기본 재설정을 수행하지 마십시오.이 문제를 직접 처리하고 싶습니다. 예, 내가하는 일을 알고 있습니다 "

이것이 좋은가요? 곧 보자 ...

걱정 마?

당신이 시작하는 전문가 중 하나는 다음과 같습니다.

당신의 활동이 회전에 대해 걱정할 필요가 없습니다

많은 경우에 사람들은 방향 변경 ( "회전")으로 인해 오류가 발생하면 간단히 입력하여 문제를 해결할 수 있다고 잘못 믿습니다. android:configChanges="keyboardHidden|orientation" .

그러나 android : configChanges = "keyboardHidden | orientation"은 반창고에 지나지 않습니다. 실제로 구성 변경을 트리거 할 수있는 여러 가지 방법이 있습니다. 예를 들어 사용자가 새 언어를 선택하면 (예 : 로캘이 변경됨) 방향 변경과 같은 방식으로 활동이 다시 시작됩니다. 원하는 경우 모든 다른 유형의 구성 변경 목록을 볼 수 있습니다 .

편집 : 더 중요한 것은 hackbod 가 의견에서 지적했듯이 앱이 백그라운드에 있고 안드로이드가 메모리를 제거하여 메모리를 확보하기로 결정하면 활동이 다시 시작됩니다. 사용자가 앱으로 돌아 오면 Android는 다른 구성 변경이있을 때와 동일한 방식으로 활동을 다시 시작하려고 시도합니다. 당신이 그것을 처리 할 수 ​​없다면-사용자는 행복하지 않을 것입니다 ...

다시 말해, 사용 android:configChanges="keyboardHidden|orientation"은 "걱정"에 대한 해결책이 아닙니다. 올바른 방법은 활동을 코딩하여 다시 시작하는 Android에 만족하도록 활동을 코딩하는 것입니다. 이것은 길 아래로 도움이되는 좋은 습관이므로 익숙해 지십시오.

언제 사용해야합니까?

언급했듯이 뚜렷한 이점이 있습니다. 회전을 직접 처리하여 기본 구성 변경 사항을 덮어 쓰면 작업 속도가 빨라집니다. 그러나이 속도에는 편의가 제공됩니다.

간단히 말해 세로 및 가로 모두에 동일한 레이아웃을 사용하는 경우 덮어 쓰기를 수행하는 것이 좋습니다. 액티비티를 완전히 새로 고침하는 대신 나머지 공간을 채우기 위해 뷰가 이동합니다.

그러나 어떤 이유로 기기가 가로 방향 일 때 다른 레이아웃을 사용하는 경우 Android에서 액티비티를 다시로드한다는 사실은 올바른 레이아웃을로드하기 때문에 좋습니다. [그런 액티비티에서 재정의를 사용하고 런타임에 마법의 재 레이아웃을하고 싶다면 ... 행운을 빌어 요-간단하지는 않습니다.]

빠른 요약

android:configChanges="keyboardHidden|orientation"맞다 면 꼭 사용하십시오. 하지만 제발 테스트해야 무슨 일 때 뭔가 변경, 방향 변경이 전체 활동을 다시 시작 트리거 할 수있는 유일한 방법이 아니기 때문에.


50
다시 시작되는 활동을 처리하지 않으면 덜 일반적인 구성 변경을 처리하지 않는 것보다 더 큰 문제가 있음을 추가하는 것이 좋습니다. 여기에서 사용 된 활동 다시 시작은 백그라운드에서 앱이 종료 될 때 Android가 활동을 이전 상태로 복원하는 방법과 정확히 동일한 메커니즘입니다. 따라서이 작업을 올바르게 수행하지 않으면 사용자는 프로세스가 종료되었는지 여부에 따라 백그라운드에서 앱을 반환 할 때 앱이 무작위로 올바르게 돌아 오지 않습니다. 큰 이점 : 앱이 올바르게 다시 시작되도록합니다.
hackbod

14
Android 3.x에서 "screenSize"----------를 추가하는 것을 놓치지 마십시오. android : configChanges = [ "mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navigation", "screenLayout", "fontScale", "uiMode", "orientation", "screenSize", "smallestScreenSize"]
Michael Biermann

1
configChanges 속성을 사용하면 앱이 방향 잠금 기능도 무시한다는 것을 알았습니다. 어떻게 해결할 수 있습니까? 답변을 알고 있다면 여기에 적어주십시오. stackoverflow.com/questions/24000361/…
Android 개발자

4
Please don't do the default reset when the keyboard is pulled out나는 키보드 풀을 위한 활동 재시작을 본 적이 없다 !
Muhammad Babar '

제 생각에는 가끔 재시동해도 괜찮습니다 ... configChanges는 대부분의 경우를 처리합니다 ... 응용 프로그램의 다른 유형에서는 문제가 될 수 있지만 실제로는 다릅니다 ....
Renetik

2

내 관점에서 : 가로 및 세로 모드에서 레이아웃이 동일하면 앱에서 두 가지 중 하나를 비활성화 할 수도 있습니다.

내가 말한 이유는 사용자가 방향을 바꿀 때 앱이 나에게 어떤 이점을 제공 할 것으로 기대하기 때문입니다. 휴대 전화를 들고있는 방법이 중요하지 않으면 선택할 필요가 없습니다.

예를 들어 ListView가있는 앱을 사용하고 ListItem을 클릭하면 해당 항목에 대한 상세보기가 표시됩니다. 가로 방향으로 화면을 두 개로 나누면 왼쪽에 ListView가 있고 오른쪽에 자세한보기가 표시됩니다. Portrait에서는 하나의 화면에 목록을 표시 한 다음 ListItem을 선택하면 화면을 상세보기로 변경합니다. 이 경우 다른 레이아웃뿐만 아니라 방향 변경도 의미가 있습니다.


4
예, 우리는 Apple 버전과 일치하도록 앱 1.0 버전에서 그와 함께갔습니다. 그것은 초상화로만 제시되었다. 내 Droid X에서 멋지게 보였으므로 IOS 버전의 팝업 키보드 동작과 정확히 일치했습니다. 그런 다음 CFO가 Droid에 앱을 설치하고 측면으로 돌리고 키보드를 밀어서 엽니 다. 죄송합니다. 안드로이드에 대한 것은 오픈 플랫폼이며 하드웨어 구성이나 사용자가 할 일을 실제로 예측할 수 없으므로 경우에 따라 두 가지 방향을 모두 지원해야 할 것입니다.
Tevo D

1
기본적으로 하드웨어에 있었기 때문에 가로 방향이 번갈아 가며 일반적인 방향이 아니기 때문에 세로 전용 설정을 우연히 발견했습니다.
RELAYY

1
왜 iOS와 똑같이 동작하도록 만들려고 했습니까? :(
FunkTheMonk

7
@FunkTheMonk 불행하게도 우리는 사업가들이 기술적 인 결정을 내리는 세상에 살고 있습니다. 당신이 그것에 대해 논쟁하더라도, 절반은 그들이 옳다고 생각합니다. 그리고 그들은 당신의 월급을 통제합니다.
StackOverflowed

2
하나의 레이아웃 만 사용한다고해서 회전했을 때 화면이 동일하게 표시되는 것은 아닙니다. 잘 구조화 된 XML 레이아웃은 합리적인 차원에서 잘 작동하도록 자동으로 이동되도록하며 사용자는이를 이해하게 될 것입니다.
Melinda Green

-1

왜 그런지 모르겠습니다 .... 가끔 재시작이 괜찮습니다 ... configChanges는 대부분의 경우를 처리합니다 ... 어쩌면 일부 유형의 응용 프로그램에서는 문제가 될 수 있지만 실제로는 응용 프로그램 유형과 복원 방법에 따라 다릅니다 앱이 다시 시작될 때 상태 ... 내 앱 중 하나가 다시 시작되면 사용자가 다시 로그인하고 내 코드에 의해 마지막 활동이 열리고 사용자 jus는 자신이 있었지만 큰 일이 아닌 곳으로 되돌아 갈 몇 가지 단계를 잃습니다. 다시 시작하면 일부 상태는 항상 복원됩니다. 활동이 다시 시작되면 앱이 사용되지 않았거나 무언가가 없어야했습니다. 그래서 전혀 문제가 없습니다 ... 예를 들어 게임에서 문제가 될 수도 있고 모르는 다른 유형의 앱에있을 수도 있습니다 ...

이 방법으로 응용 프로그램을 정상적인 상황에서 제대로 작동한다고 말합니다. 그리고 코드는 새로운 버그를 만들고 항상 유지 해야하는 저장 및 복원에 필요한 많은 논리없이 훨씬 더 읽을 수 있습니다 ... 안드로이드 전원이 꺼져 응용 프로그램 창을 죽이면 컨텍스트와 다시 시작하지만 이것은 특별한 상황에서만 발생하며 최신 장치에서는 이것이 점점 더 드 rare니다 ...

그래서 나를 죽여라. 그러나 나는 응용 프로그램에서 이것을 꽤 성공적으로 사용한다 ... android : configChanges = "locale | keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize"그러나 어떤 종류의 응용 프로그램에서는 그렇지 않을 수도 있음을 이해합니다 좋은 방법이지만 대부분의 앱은 이대로도 살 수 있습니다.


안녕하세요,이 주제에 대해 잘 아는 사람이 내 스레드를 살펴보십시오. stackoverflow.com/questions/35941585/…? 절실히 도움이 필요합니다.
Luke Allison

당신은 활동에 대한 저장 / 다시 시작을 완전히 지원해야합니다 ... 회전을위한 처리는 다르지 않습니다 ... 당신은 몇 단계를 잃었다 고 말하면 ... 몇 단계를 잃었다 고 말하면 ... ... 장치를 다시 시작한 후에도.
HaMMeReD

망치고 난 당신이 무슨 말을하는지 모르겠지만 당신이 그렇게 할 때 응용 프로그램은 정상적인 상황에서 잘 작동한다고 말합니다. 그리고 코드는 새로운 버그를 만들고 항상 유지 해야하는 저장 및 복원에 필요한 많은 논리없이 훨씬 더 읽을 수 있습니다 ... 안드로이드 전원이 꺼져 응용 프로그램 창을 죽이면 컨텍스트와 다시 시작하지만 이것은 특별한 상황에서만 발생하며 최신 장치에서는 이것이 더욱 드물게
믿습니다

활동 계약 (저장 / 복원 상태)을 준수하지 않는 것은 나쁜 습관이며 이는 전반적으로 끔찍한 조언입니다. 프로세스 종료에 대한 테스트를 시도하고 앱의 위치를 ​​확인하십시오. 사용자가 휴대 전화에서 2-3 개 이상의 앱을 사용하고 앱간에 전환하는 경우이 동작은 완전히 표준적인 "정상 상황"입니다.
EpicPandaForce

-3

그래, 일시 정지하면 플레이어를 놓는 것보다 빠를 것이라고 생각합니다. 그래도 여전히 일시 중지가 있습니다.

노래를 일시 중지하지 않는 솔루션을 찾았습니다.

화면 방향에 대한 구성 변경을 처리 한 다음 onConfigurationChanged 메소드를 사용하여 레이아웃 파일을로드 할 매니페스트의 상태입니다. logCat 에서이 작업을 수행하면 onPause, onCreate & onResume이 호출되지 않아 노래가 일시 중지되지 않은 것을 볼 수 있습니다.

  1. 방향을 처리하도록 매니페스트를 업데이트하십시오.

    android:configChanges="orientation|screenSize"
  2. 이 코드를 추가

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }

음악을 재생하려면 서비스를 사용해야합니다. 진심으로, "// TODO Auto-generated method stub"가있는 코드를 사람들에게 추가하라고 말하고있다. 조잡한 솔루션. 그것은 잘 작동하지 않을 것입니다. 모든 참조를 리 바인드해야하며, 그렇지 않으면 기껏해야 예측할 수 없습니다.
HaMMeReD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.