16

アクティビティがほとんどなく、あるアクティビティから別のアクティビティを開いて、最初のアクティビティに戻ります...

ポイントは、onCreateはonesと呼ばれ、アクティビティが表示されるたびにonResumeと呼ばれます。たとえば、以前にAから開始されたBを閉じると、onResumeが呼び出されますが、onCreate...は呼び出されません。

私の問題は、onCreateの後にonResumeが来る場合は実行したくないということです。コードは、onCreateが呼び出されなかった場合にのみ実行したいのです。

これは静的フラグなしで実行できますか?

comeAfterOnCreateのようなAndroidのメソッドやフラグはありますか?

@Override
protected void onResume() {
   if(comesAfterOnCreate){
       //DO not run this code
   }else{
      //run the long task
   }

静的フラグを使用したソリューションで多くの回答を示します。努力と支援を提供してくれた皆さんに感謝しますが、何らかの方法か何かがあることに興味がありました...

4

7 に答える 7

6

これを試して、

boolean flag = false;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

           flag = true;
....
}
@Override
    protected void onResume() {
        super.onResume();
              if(flag == true){
                 ..... // it has came from onCreate()
               }
               else{
                  .....// it has directly came to onResume()
               }
    }

これで、Acitivityが終了すると、フラグの値は再びfalseになりonResume()、値falseで呼び出されます。

これがあなたのために働くことを願っています。

于 2011-09-20T11:58:32.663 に答える
2

難しい仕事ではありません。booleanここで使用または確認できます。向きが変わったためにonCreateが呼び出されたことを確認できますか?

于 2011-09-20T11:59:51.777 に答える
2

私のコメントのように:

private boolean onCreateRunned = false;

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    onCreateRunned = true;

    //More code
}

@Override
public void onResume(){
    super.onResume();
    if(onCreateRunned){
        onCreateRunned = false; //important, or it will run only once.
        // Do your code
    }
}
于 2011-09-20T12:03:09.367 に答える
1

アクティビティ-Androidドキュメントに示されているように。

アクティビティには、基本的に4つの状態があります。

1.画面の前景(スタックの一番上)にあるアクティビティがアクティブまたは実行中の場合。

2.アクティビティがフォーカスを失ったが、まだ表示されている場合(つまり、新しい非フルサイズまたは透過的なアクティビティがアクティビティの上にフォーカスを持っている場合)、そのアクティビティは一時停止されます。一時停止されたアクティビティは完全に有効です(すべての状態とメンバー情報を維持し、ウィンドウマネージャーに接続されたままです)が、メモリが極端に少ない状況ではシステムによって強制終了される可能性があります。

3.アクティビティが別のアクティビティによって完全に隠されている場合、そのアクティビティは停止されます。それでもすべての状態とメンバー情報が保持されますが、ユーザーには表示されなくなるため、ウィンドウは非表示になり、他の場所でメモリが必要になるとシステムによって強制終了されることがよくあります。

4.アクティビティが一時停止または停止した場合、システムは、アクティビティの終了を要求するか、単にプロセスを強制終了することにより、アクティビティをメモリから削除できます。ユーザーに再度表示された場合は、完全に再起動して以前の状態に復元する必要があります。

Androidのドキュメントに示されているように、アクティビティのライフサイクルは次のとおりです。

ここに画像の説明を入力してください

アクティビティ内で監視することに関心がある可能性のある3つの主要なループがあります。

1.アクティビティの存続期間全体は、onCreate(Bundle)の最初の呼び出しから、onDestroy()の最後の1回の呼び出しまでの間に発生します。アクティビティは、onCreate()で「グローバル」状態のすべてのセットアップを実行し、onDestroy()で残りのすべてのリソースを解放します。たとえば、ネットワークからデータをダウンロードするためにバックグラウンドで実行されているスレッドがある場合、onCreate()でそのスレッドを作成してから、onDestroy()でスレッドを停止することがあります。

2.アクティビティの目に見える存続期間は、onStart()の呼び出しから、対応するonStop()の呼び出しまでの間に発生します。この間、ユーザーは画面上でアクティビティを確認できますが、フォアグラウンドになく、ユーザーと対話している場合はありません。これら2つの方法の間で、ユーザーにアクティビティを表示するために必要なリソースを維持できます。たとえば、BroadcastReceiverをonStart()に登録して、UIに影響を与える変更を監視し、ユーザーに表示内容が表示されなくなったときにonStop()で登録を解除できます。onStart()メソッドとonStop()メソッドは、アクティビティがユーザーに表示および非表示になるため、複数回呼び出すことができます。

3.アクティビティのフォアグラウンドライフタイムは、onResume()の呼び出しから、対応するonPause()の呼び出しまでの間に発生します。この間、アクティビティは他のすべてのアクティビティの前にあり、ユーザーと対話します。アクティビティは、再開状態と一時停止状態の間を頻繁に行き来する可能性があります。たとえば、デバイスがスリープ状態になったとき、アクティビティ結果が配信されたとき、新しいインテントが配信されたときなどです。したがって、これらのメソッドのコードはかなり軽量である必要があります。

結論:ライフサイクルの実行順序を変更することはできません。

于 2011-09-20T11:58:48.987 に答える
0

OnCreateとOnResumeにトーストを含めてみて、OnCreateトーストの前にアプリを実行したときに「onResume」トーストが来るかどうかをテストしてください。または、それぞれのメソッドからログメッセージを出力します

于 2011-09-20T11:58:52.573 に答える
0

@suriが正しいと思います。onCreate()しかし、より明確にしたい場合はonResume()

次に入れます

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

          System.out.println(">>>>>> This is oncreate method");
....
}

@Override
    protected void onResume() {
        super.onResume();

               System.out.println("This is onResume method <<<<<<<<<");

    }

これはあなたの質問をチェックするのが最も簡単です。

于 2011-09-20T12:25:14.070 に答える
0

これは他の初心者を助けることができます:

private boolean isOnCreateCalled = false;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
         Log.i("MyTag" , "onCreate called");
         isOnCreateCalled = true;
    }
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("MyTag" , "onResume called");
    if (isOnCreateCalled) {
        isOnCreateCalled = false;
        Log.i("MyTag" , "onResume's condition called once");
        // Your codes here...
    }
}

Logcatで結果を確認してください!

于 2019-05-16T08:38:03.047 に答える