2011-08-01 4 views
4

スタックからアクティビティをリロードします。アクティビティの開始時にonCreate()が呼び出されないようにするにはどうすればよいですか?

私はを使用して新しいアクティビティを開始します。私がいるときアクティビティDアクティビティAをリロードして、新しいインテントを開始しません。 Dから呼び出すときにstartActivity()を使用することはできません。これは、データを取得するスレッドを開始するonCreate()を起動するためです。

EDIT:スタックを更新しました。

FLAG_ACTIVITY_REORDER_TO_FRONTを使用すると、もう一度onCreate()メソッドが呼び出されます。

私のシナリオは次のとおりです。

Login Activity ̣→ Activity A → Activity B → Activity C → Activity D → Activity A 

onCreate()はどのように呼び出されますか?

答えて

5

全く異なるアプローチをとる必要があります。アクティビティの開始時にまたはstartActivityForResult()でアクティビティを開始した場合は、onCreate()onStart()onResume()が呼び出されるため、問題はありません。

あなたのアクティビティクラスにいくつかの作業を行う別のスレッドを開始するメソッドがある場合、フラグを操作する必要があります。最初の実行時にアクティビティが自動的にスレッドを開始する必要がある場合は、最初に実行されたときに設定したフラグをチェックするために、if節の周りにラップする必要があります。

考えられるのは、スレッドが最初に実行されるときに、アクティビティがApplicationインスタンスまたはSharedPreferencesのいずれかで真になるように設定することです。そのアクティビティに戻り、onCreate()が呼び出されて自動的にスレッドが実行されないようにする場合は、以下の例のようにいくつかのif節で呼び出しコードをラップする必要があります。

ここは例です。

@Override 
public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    // Other stuff 

    if (!YourApplicationInstance.wasCalled) { 
     // Run your thread or do something else you want to do only once. 

     // Set the wasCalled flag to true to not run this code again 
     // if onCreate() is called a second time. 
     YourApplicationInstance.wasCalled = true; 
    } 
} 

あなたは私の疑似クラスYourApplicationInstanceを実装する方法を理解するためにUsing Application context everywhere?を読まなければならないでしょう。

0

1)私には分かりませんが、startActivity()ではなくstartActivityForResult()を使用してみてください。私はこれが活動を完全に終わらせるとは思わないし、再びそれを開始します。このようなメソッドの実装方法をさらに読むために、thisリンクを使用することをお勧めします。

2)また、アクティビティD - > Aから移動する場合は、startActivity()を使用し続けますが、ダミーの余分なものを渡します。次に、アクティビティAでif文を使用します。

if(!(this.getIntent().hasExtra("dummyStringExtra")) { 
    //fire the data thread here 
} 

乾杯。私はこれが役立つことを願っています

+0

**注意**: 'if'文に'! ' – Kgrover

2

マニフェスト内のアクティビティにlaunchModeというタグがあります。チェックアウトはlinkです。これはonCreateを呼び出すことはありませんが、onNewIntentが呼び出されます。ここでは、あなたのものを再初期化できます。

2

以下は該当しません。 startActivityForResult()とstartActivity()は、唯一と呼ばれる活動

startActivityForResultを使用して

試し()ではなく startActivity()の戻り値の対象が異なります。私はこれが活動を完全に終わらせるとは思わないし、再びそれを開始します。 I は、このような方法の実装方法をさらに詳しく読むために、このリンクの使用を推奨します。

したがって、@Kgroverのポイント2も保持しません。

インテントフラグhttp://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONTはこれを正確に行います。

アクティビティの遷移を中心とする要件がある場合は常に、インテントフラグを確認してください。システムには優れたサポートがあります。

これはSam Questのソリューションに相当します。唯一の違いは、launchModeを設定した場合、アクティビティのスタック動作がハードコードされていることです。つまり、アクティビティAは常にsingleTaskモードです。

0
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      this.finish(); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

これは子アクティビティを強制終了します。親アクティビティは再作成されません

関連する問題