Android-활동 생성자 대 onCreate


88

Android Activities에는 특정 수명주기 onCreate가 있으며이를 재정의하고 초기화에 사용해야한다는 것을 알고 있지만 생성자에서 정확히 어떤 일이 발생합니까? Activity생성자를 재정의 할 수 있거나 재정의 해야하는 경우가 있습니까? 아니면 절대 건드리지 않아야합니까?

에 대한 참조가 Activities완전히 정리되지 않았기 때문에 (따라서 가비지 수집기를 방해 하기 때문에) 생성자를 사용해서는 안된다고 가정하고 있습니다 onDestroy. 이 올바른지?


2
Android가 언제든지 활동을 파괴 / 재 작성할 수 있다는 사실은 어떻습니까? 생성자가 호출되는지 여부와 어떤 생성자가 호출되는지 여부는 알 수 없습니다.
Marian Paździoch

답변:


34

생성자에서 어떤 작업을 수행해야하는 이유를 생각할 수 없습니다. 활동을 직접 구성하지 않으므로 매개 변수를 전달하는 데 사용할 수 없습니다. 일반적으로 onCreate에서 작업을 수행하십시오.


74
onCreate ()는 최종 필드를 사용하지 못하게합니다.
Gili

2
그러나 OnCreate는 한 번만 호출되지 않습니다. 내 손으로 화면 방향과 뒷면을 변경하면, 한 OnCreate 호출 될 때마다 활동 재로드는
fercis

2
@fercis onCreate는 내가 믿는 인스턴스 당 한 번만 호출됩니다. 장치를 회전 할 때 Activity의 해당 인스턴스가 파괴되고 onCreate를 호출하는 새 인스턴스가 생성됩니다. 즉, Java가 onCreate가 한 번만 호출 될 것이라는 것을 모르기 때문에 onCreate에서 최종 필드를 인스턴스화 할 수 없다고 확신합니다 (실제로 코드에서 직접 다시 호출 할 수 있습니다. 나쁜 일이 발생할 것입니다. 그러나 여전히 컴파일됩니다) 따라서 최종 필드를 인스턴스화하는 유일한 방법은 생성자에 있습니다.
Harvey Adcock

OnCreate 이벤트는 언제 정확히 실행되기 시작합니까? OnCreate 이벤트 시작 부분에 중단 점을 설정하면 앱이 실행되고 활동이 화면에로드 된 다음 중단 점이 활성화되고 앱이 일시 중지됩니다. 활동이 초기화되고 시작되기 직전에 활성화되는 활동에 대한 이벤트가 필요합니다.
Mohammad Afrashteh

@Cheryl Simon, 활동을 직접 만들지 않는다고했는데 누가 활동을 만들었나요?
Sreekanth Karumanaghat

7

Gili의 의견에서 언급했듯이 생성자에 항목을 넣는 좋은 이유는 최종 필드를 사용하기 때문입니다.

그러나 생성자에서 초기화하면 객체의 수명이 조금 더 길어 지지만 나중에 onCreate곧 호출 되기 때문에 많이 생각하지는 않습니다 .

내 이상적인에 대해 비록, 나는 활동 회원의 초기화를 위해 생성자를 방지하고 의지 할 onResume()onPause()내 응용 프로그램이 처리되는 자원.

들어 onCreate()난 보통 지역 변수에보기 매핑을 수행하는 데 사용합니다. android-annotations가 이미 나를 위해 그렇게 onCreate()하기 때문에 활동에 대한 방법이 거의 없습니다 . 그래도 여전히 서비스에서 사용합니다.

단, 멤버를 보면 초기화 중일 수 있습니다.

  • 적절한 시간 (onResume 또는 onPause)에 호출해야하는 "close"메소드가 있습니다.

  • 그것들은 뷰의 일부가 될 것입니다. 즉, 초기화되어야하고 onCreate가 호출되어야합니다.

  • 그것들은 어쨌든 생성자에 넣을 필요가없는 상수입니다. 여기에는 정적 블록으로 초기화 할 수있는 페인트 및 경로 상수가 포함됩니다.


1
물체의 수명이 조금 더 길다는 것은 무엇을 의미합니까? 나는 어떻게? 예를 들어 이러한 초기화를 onCreate로 옮긴 경우에도 여전히 같은 시간이 걸립니다. 내가 결정할 수있는 수명의 차이는 없습니다. 상대적으로 새로 온 사람으로서 여기에서 중요한 것을 놓치고있을 수 있다고 느낍니다.
RichieHH

2
@RichieHH by long Archimedes는 생성자가 onCreate () 전에 호출되기 때문에 활동이 파괴 될 때까지 (약간) 더 오래
지속될 것이라고 말하고 있습니다.

6

이제 생성자를 재정의해야하는 경우에 있습니다. 사실, 동일한 구조를 가진 활동이 있습니다. 따라서 많은 활동을 만드는 대신 하나의 "마스터"활동을 만들고 다른 활동은이 활동을 상속합니다. 따라서 oncreate 메서드에서 사용할 일부 변수를 초기화 할 수 있도록 자식 활동의 생성자를 재정의해야합니다.

즉, 생성자는 상속으로 재사용 할 수있는 "마스터 활동"을 시뮬레이션하게합니다!


15
나는 이것이 오래되었다는 것을 알고 있지만 여기에서 슈퍼 필드 인스턴스화를 onCreate ()에서 구현하는 것보다 이점은 무엇입니까? 어쨌든 자식에서 super.onCreate ()를 호출 할 것입니다.
Andrew G

따라서 액티비티를 시작하는 동안 번들 또는 인 텐트의 동일한 KEY에 다른 값을 전달하고 동일한 액티비티를 사용하여 수신 된 값에 따라 액티비티에 표시 할 내용을 결정할 수 있습니다. 건설사를 선택한 구체적인 이유는 무엇입니까? 또는 활동의 변경되지 않는 부분을 공통으로 유지하고 나머지 변경 부분에 대해 조각을 만들 수 있습니다.
Nayanesh Gupte 2014-06-17

0

활동에 사용자 지정 매개 변수가 있거나 상속 된 클래스의 호출을 추적하려는 경우 생성자를 재정의해야합니다.


1
이것에 대해 더 자세히 설명해 주시겠습니까? 당신이 묘사하는 것은 흥미로울 것 같지만 약간 모호합니다. 감사!
idolize

3
2 개 이상의 매개 변수를 사용하는 사용자 지정 활동 클래스를 만들어야한다고 가정합니다. 생성자를 사용하기 만하면됩니다. onCreate 및 추가 기능을 통해 수행 할 수 없습니다. 도움이 되나요?
Pentium10

1
사적인 것이 필요할 수도 있습니다. 예를 들어 사용자 지정 연락처 선택기와 같은 사용자 지정 구성 요소를 만들고 싶다고 가정합니다. 이하기 위해서는 startActivityForResult그 활동이 시작되고 더 공개 대상 요소가되지 않습니다 경우에도, 나는 내 사용자 지정 구성 요소의 개인 생성자를 포함해야, 난 그냥 결과 물건의를 사용합니다.
Pentium10

6
코드 예제 없이는 @Pentium이 나에게 의미가 없다고 말할 것입니다.
Blundell

생성자를 통해 작업을 수행하는 한 가지 장점은 상속 된 클래스가 활용할 수있는 매개 변수를 취할 수있는 "템플릿"활동을 갖는 것입니다. 예를 들어 R.id.cameraSurface, R.id.videoSurface와 같이 일부 속성에서만 다른 두 개의 활동이있는 경우 매개 변수를 가져 오는 생성자를 AbstractResourceActivity라고 부르고 등록 된 CameraActivity를 가질 수 있습니다. 리소스 ID를 전달하는 AbstractResourceActivity를 확장하는 매니페스트에서.
Archimedes Trajano
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.