2012-10-12 4 views
6

super.onDestroy() 앞뒤에 명령을 놓을까요? ondestroy 활동을 덮어 쓸 때 사용할 수 있습니까?Android 초보자 : onDestroy

protected void onDestroy() { 

    //option 1: callback before or ... 

    super.onDestroy(); 

    //option 2: callback after super.onDestroy(); 
} 

는 (지금은 두려움 : super.onDestroy가 너무 빠른 경우, 옵션 2에 도착하지 않습니다) super.onDestroy() 호출하기 전에해야 활동 자원 사용과 관련된 수 있습니다

+0

내가 도달하지 못하게 할 수있는 것이 보이지 않습니다. 2 – njzk2

+0

이 질문은 http://stackoverflow.com/q/18821481/53974의 dup이며, 실제로 잘 연구 된 대답이 있습니다. http://stackoverflow.com/a/18874519/53974 – Blaisorblade

답변

3
이 링크를 확인하시기

이것은 super.onDestroy()를 호출 할 때 발생합니다.

Android Source

protected void onDestroy() { 
    mCalled = true; 

    // dismiss any dialogs we are managing. 
    if (mManagedDialogs != null) { 

     final int numDialogs = mManagedDialogs.size(); 
     for (int i = 0; i < numDialogs; i++) { 
      final Dialog dialog = mManagedDialogs.valueAt(i); 
      if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 
     } 
    } 

    // also dismiss search dialog if showing 
    // TODO more generic than just this manager 
    SearchManager searchManager = 
     (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    searchManager.stopSearch(); 

    // close any cursors we are managing. 
    int numCursors = mManagedCursors.size(); 
    for (int i = 0; i < numCursors; i++) { 
     ManagedCursor c = mManagedCursors.get(i); 
     if (c != null) { 
      c.mCursor.close(); 
     } 
    } 
} 

는 본질적으로 이것은 당신이 전이나 코드 후를 호출하는 경우는 문제가되지 않는다는 것을 의미합니다.

+0

그것은 또한 활동의 ​​onDestroy에 대해 "dismiss()"를 호출 할 필요가 없다는 것을 의미합니까? 나는 그들을 유출 한 기록이 있다는 것을 기억하고 있다고 생각한다. 그렇지 않습니까? 어느 경우에 누출이 발생합니까? –

+1

닫기는 대화 상자에만 해당되며 대화 상자는 활동과 다른 수명주기를 가지고 있기 때문에이 질문과 관련이 없습니다. 대화를하는 데 문제가 있으면 새로운 질문을 시작해야합니다. 그러면 문제를보다 잘 처리 할 수 ​​있습니다. –

+0

그러나 명령과 관련하여 어디에 명령을 입력해야하는지 묻고 코드를 표시했습니다. 코드는 다이얼로그 메커니즘을 해제하는 것처럼 보입니다 –

7

아무것도 . 그 이후의 코드는 도달 할 것이지만, 그 자원이 필요하다면 문제를 일으킬 수 있습니다.

+0

안드로이드 개발자 설명서가 권장하지 않는 이유는 무엇입니까 ?-(나는 몇 시간 동안 설명서를 찾았습니다 ... – ledy

0

다릅니다. super 기능을 수행 한 후에 동작을 적용하려면 슈퍼 이후에 기능을 배치해야합니다. 먼저 super의 사용법을 이해해야합니다. 예를 들어, super.onDestroy(); 예 후 this question

3

장소에서 코드를 살펴 :

protected void onDestroy() { 
    super.onDestroy(); 

    // Put code here. 

} 

코드는 메소드를 오버라이드 (override) 할 때 실행 완료됩니다.

+1

나는 testActivity.Instance.InfoThatIAmComingBackToTheMainActivityNow를 호출 할 것입니다.() – ledy

0

옵션 2에 도착합니다. onDestroy()는 실제로 객체를 파괴하지 않습니다. 수퍼 클래스의 onDestroy()가 실행되고 반환 된 후 인스턴스가 여전히 살아 있습니다.

편집 :이들의 OnDestroy을 위해 무엇이다 :

  • 이 활동이 관리하고 모든 대화 상자를 해제.
  • 활동이 관리하고있는 커서를 닫으십시오.
  • 는 다음과 같이 호출 스레드 또는 뭔가를 방해하지 않습니다 super.onDestroy를 호출
+0

즉 장치가 충분히 빠르면 참조 또는 커서가 옵션 2와 함께 도착하기 전에 사라질 수 있습니다. – ledy

1

대화 상자가 열려 검색을 닫습니다. super.onDestroy 이전 또는 이후에 코드를 배치 할 때마다 코드가 실행됩니다.

super.onDestroy 것이다 프레임 워크에서이 활동을 위해 참조 할 수있는 유일한 리소스 (예 : 시스템 대화 상자와 관리 커서) 난 당신이 자세한 내용

http://developer.android.com/reference/android/app/Activity.html#onDestroy()

관련 문제