2017-11-13 12 views
1

デストロイの後、私はログステートメントを印刷します。アプリケーションが破棄されてログが表示され、アプリケーションが破棄された後で命令を実行することはできません。onDestroyの後に命令がある場合、命令は実行されますか?

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

「Appは現在破壊されていますか?」と表示されますか? それが印刷されない場合、onDestroyメソッドでどのようにコードを実行できますか?

答えて

2

あなたの質問に対する答えは、「それはありますか」です。

reference documentationは、onDestroyが呼び出されることは保証されていません。

注:データを保存する場所と呼ばれるこのメソッドにはカウントしないでください。たとえば、アクティビティがコンテンツプロバイダのデータを編集している場合、これらの編集はここではなく、onPause()またはonSaveInstanceState(Bundle)でコミットする必要があります。このメソッドは、通常、アクティビティに関連付けられているスレッドなどのリソースを解放するために実装されているため、アプリケーションの残りの部分が実行されている間に破棄されたアクティビティがそのようなものを残すことはありません。システムがこのメソッド(または他のもの)を呼び出さずにアクティビティのホスティングプロセスを単に終了させる状況があるため、プロセスが終了した後に残ることを意図した操作を行うべきではありません。だから、

Androidは最初プロセスを破壊しない限り、はい、あなたのメッセージが呼び出されます。あなたは、スーパークラスの実装を通じ呼び出す必要があり、このメソッドをオーバーライドする場合

ドキュメントも...スーパークラスの実装に至るまで、あなた必見呼び出しこと

を言います。

...しかし、どのような順序で呼び出しを行うべきかはわかりません。そのため、私はアクティビティの内容を見るためにアクティティのソースを調べます。ここに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(); 
} 

また、メモリ割り当てのためにアンドロイドによってアプリが破壊された場合は、呼び出されません。 onStop()メソッドを使用してデータを保存する方が良いです。

+0

エラーを起こさないか?私のインストラクターはいつも「独自のロジックを追加する前にsuper.onDestroyメソッドを呼び出す」と言っています –

+0

いいえ、間違いをすることはありません。しかし、私の答えと同じように、onDestroy()の代わりにonStop()に答えてください –

0

onDestroy()が常に呼び出すとは限りません。あなたはonStop()メソッドで掃除をすることができます。

+0

タスクマネージャを開き、アプリケーションを左右にスワイプすると、onDestroy()が呼び出されます –

関連する問題