2010-07-21 6 views
79

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

Activities에 대한 참조가 완전히 정리되지 않아 (따라서 가비지 수집기를 방해하지 않음) 해당 용도에 해당하는 onDestroy이 있으므로 생성자를 사용해서는 안됩니다. 이 올바른지?

+2

Android가 언제든지 활동을 파괴 할 수 있다는 사실은 어떻습니까? 생성자가 호출 될 지 여부와 생성자가 호출되는지 여부는 알 수 없습니다. (Fragments에도 동일하게 적용되므로 모든 Fragment가 빈 기본 생성자를 구현해야하는 이유입니다). –

답변

31

나는 생성자에서 아무 것도 할 이유가 없다고 생각한다. 직접 액티비티를 구성하지 않으므로 매개 변수를 전달하는 데 액티비티를 사용할 수 없습니다. 일반적으로 onCreate에서 일을하십시오.

+65

onCreate()는 최종 필드를 사용할 수 없도록합니다. – Gili

+6

테스트 중입니까? ' 개인 최종 InterfaceDep dep; public MyActivity() {dep = new DepImpl(); } MyActivity (InterfaceDep dep) {this.dep = dep; } ... @Mock private InterfaceDep dep; @InjectMocks 개인 MyActivity myActivity; ' – saiyancoder

+1

하지만 OnCreate는 한 번만 호출되지 않습니다. 틀렸습니까? 화면 방향을 변경하고 손으로 다시 움직이면 활동이 다시로드 될 때마다 onfreate가 – fercis

1

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

+1

당신은 이것에 대해 더 자세히 설명 할 수 있습니까? 당신이 묘사하는 것은 흥미로운 것 같지만 약간 애매합니다. 감사! – idolize

+3

두 개 이상의 매개 변수를 사용하는 사용자 지정 Activity 클래스를 만들어야한다고 가정 해보십시오. 생성자를 사용하기 만하면 onCreate와 extras를 통해이를 수행 할 수 없습니다. 도움이 되나요? – Pentium10

+4

하지만 명시 적으로 활동을 만들지 않으면 의도를 만들 수 있습니다. – idolize

7

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

두 단어로, 생성자는 상속에 의해 재사용 될 수있는 "마스터 액티비티"를 시뮬레이트하게합니다!

+14

나는 이것이 오래되었음을 알고 있지만 여기에 super field 인스턴스를 onCreate()를 구현하는 것 이상의 이점은 무엇인가. 어쨌든 super.onCreate()를 호출 할 것입니다. –

+0

활동을 실행하는 동안 번들 또는 의도에있는 동일한 KEY에 다른 값을 전달하여 동일한 활동을 사용하면받은 값에 따라 활동에 표시 할 내용을 결정할 수 있습니다. 당신이 강제 수용소에 간 이유는 무엇입니까? 그렇지 않으면 Activity의 공통적이지 않은 부분을 유지하고 나머지 변경 부분은 Fragments를 만들 수 있습니다. –

+0

이 먼저 호출됩니다. 생성자 또는 생성자. 내 생각에 생성자 – Nepster

6

길리 (Gili)의 의견에서 말한 것처럼 생성자에 물건을 넣을 좋은 이유는 최종 필드를 사용했기 때문입니다.

그러나 생성자에서 작업을 초기화하면 객체의 수명이 조금 더 길어 지지만 onCreate이 곧 호출 될 것이기 때문에별로 생각하지 않습니다.

내 생각에 반해서도 액티비티 멤버를 초기화하는 데는 생성자가 필요하지 않으며 내 응용 프로그램이 처리하는 리소스는 onResume()onPause()에 의존합니다.

onCreate()의 경우 보통 로컬 변수에 대한 뷰 매핑을 위해이 변수를 사용합니다. 비록 android-annotations가 이미 저를 위해 그런 일을하기 때문에 나는 나의 활동을 위해 onCreate() 메소드를 거의 가지고 있지 않습니다. 나는 아직도 서비스에서 그것을 사용한다. 당신이 회원 보면

그러나

  • 그들은 당신이 적절한 시간에 호출 할 필요가 「클로우즈」방법 (onResume 또는 onPause)을했을 초기화 될 수있다

  • 그것들은 초기화 될 필요가 있음을 의미하는 뷰의 일부일 것입니다. onCreate는 호출 될 필요가 있습니다. 어쨌든 정적 final만으로는 생성자에 넣을 필요가없는 상수 인 상수 인

  • 입니다. 여기에는 정적 블록으로 초기화 할 수있는 페인트 및 경로 상수가 포함됩니다.

+0

개체의 수명이 조금 더 길다는 것은 무엇을 의미합니까? 나는 어떤 방법으로? 예를 들어 이러한 초기화를 onCreate로 옮긴 경우에도 동일한 시간이 소요됩니다. 내가 결정할 수있는 수명에는 차이가 없습니다. 친척이되어서 여기 뭔가 중요한 것을 놓칠 수도 있습니다. – RichieHH

+2

Archimedes가 @RichieHH를 작성한 것은 생성자가 onCreate() 전에 호출되기 때문에 수행 한 작업이 활동이 파괴 될 때까지 (약간) 오래 유지됩니다. – pho79

+0

감사의 말을 알 수 없었습니다 작년. 귀하의 대답은 정확합니다. –