2017-11-13 2 views
1

이후에 Destroy에서 Log 문을 인쇄하면 앱이 이미 파괴되어 로그가 표시되고 앱이 삭제 된 후 명령을 실행할 수 없게됩니다.onDestroy 이후에 Instruction이 있으면 Instruction이 실행됩니까?

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    Log.v(TestActivity,"App is currntly getting destroyed") 
} 

이렇게하면 "응용 프로그램이 현재 파괴되고 있습니다"가 인쇄됩니까? 인쇄되지 않으면 어떻게 onDestroy 메서드에서 코드를 실행할 수 있습니까?

답변

2

귀하의 질문에 대한 답변은 "It Depends"입니다.

reference documentationonDestroy이 호출되지 않을 것이라고 말합니다.

참고 :이 방법을 데이터 저장 장소로 간주하지 마십시오. 예를 들어, 액티비티가 컨텐트 프로 바이더의 데이터를 편집하는 경우, 이러한 편집은 여기가 아닌 onPause() 또는 onSaveInstanceState (Bundle) 중 하나에서 커밋되어야합니다. 이 메소드는 일반적으로 활동과 연관된 스레드와 같은 자원을 비우기 위해 구현되므로 파괴 된 활동이 응용 프로그램의 나머지 부분이 실행 중일 때 그러한 활동을 남기지 않습니다. 시스템이이 메소드 (또는 다른 메소드)를 호출하지 않고 단순히 활동의 호스팅 프로세스를 중지시키는 상황이 있으므로 프로세스가 사라진 후에도 남아 있어야하는 작업을 수행하는 데 사용해서는 안됩니다. 안드로이드 첫번째 과정을 파괴하지 않는

그래서, 그래, 당신의 메시지는 를 호출됩니다.

문서는 말을 당신 해야 슈퍼 클래스의 구현을 통해 전화 ...

당신이 슈퍼 클래스의 구현을 통해 호출해야이 메소드를 오버라이드 (override)하는 경우.

...하지만 어떤 순서로 호출해야하는지는 알 수 없습니다. 그렇기 때문에, 저는 Activiy 소스가 무엇을하는지보기 위해 보았습니다. 다음은 onDestroy에 대한 (버전 쥬어) 소스 코드입니다. Google 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 ManagedDialog md = mManagedDialogs.valueAt(i); 
      if (md.mDialog.isShowing()) { 
       md.mDialog.dismiss(); 
      } 
     } 
     mManagedDialogs = null; 
    } 
    // close any cursors we are managing. 
    synchronized (mManagedCursors) { 
     int numCursors = mManagedCursors.size(); 
     for (int i = 0; i < numCursors; i++) { 
      ManagedCursor c = mManagedCursors.get(i); 
      if (c != null) { 
       c.mCursor.close(); 
      } 
     } 
     mManagedCursors.clear(); 
    } 
    // Close any open search dialog 
    if (mSearchManager != null) { 
     mSearchManager.stopSearch(); 
    } 
} 

이 언제든지 변경 될 수 있지만, 우리는 (문서가 말한대로) 리소스를 정리합니다 슈퍼 클래스에서 그 onDestroy을 볼 수 있습니다. 그렇다면 onDestroy 구현은 이러한 리소스를 사용합니까? 그러면 super.onDestroy() 전에 코드를 호출해야합니다. 그렇지 않은 경우 순서는 중요하지 않습니다 (선생님이 사용 순서를 말한 것을 제외하고).

0

코드 실행 후 super.onDestory()으로 전화하십시오.

@Override 
protected void onDestroy() { 
    Log.v(MainActivity,"App is currntly getting destroyed") 
    super.onDestroy(); 
} 

앱이 메모리 할당을 위해 Android에서 파괴 한 경우에도 호출되지 않습니다. onStop() 데이터를 저장하는 것이 더 좋습니다.

+0

오류를 발생시키는 있지? 내 강사는 항상 "자신의 논리를 추가하기 전에 super.onDestroy 메서드를 호출하십시오"라고 말했습니다. –

+0

아니요. 오류가 발생하지 않습니다.하지만 내 대답은 항상 onDestroy() 대신 onStop() 대답 –

0

onDestroy()가 항상 호출하는 것은 아닙니다. onStop() 메소드에서 청소 작업을 할 수 있습니다.

+0

작업 관리자를 열고 왼쪽/오른쪽으로 응용 프로그램을 스 와이프하면 onDestroy()가 호출됩니다. –

관련 문제