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.