1

ActivityA、ActivityB、ActivityC の 3 つのアクティビティがあります。

ActivityA に次のようなコードがあるとします...

if(someCondition()){
gotoActivityB();
}
else{
gotoActivityC();
}

ここで、ユーザーがActivityBに移動した場合、ActivityAは終了しないはずです。

彼がActivityCに行く場合、それは終了するはずです。

マニフェスト ファイルに追加noHistoryしても機能しません。

また、finish()if条件が機能しない場合、ActivityCの後にActivityAがバックグラウンドにあるはずのアクティビティがたくさんあるためです。

ActivityAのコードを再度実行するため、startActivity(context,ActivityA.class)これらのアクティビティを呼び出したくありません。onBackPressed()onCreate()

だから、ユーザーがActivityBの戻るボタンを押したときにスタックからActivityAを削除できる方法はありますか?

次のようなものかもしれません:?

ActivityB.this.finish();
ActivityA.finish(); //some code to finish ActivityA
4

4 に答える 4

2

さて、これが目標を達成するための 1 つの方法です。Activity コンテキストを必要な場所に渡して、finish() を呼び出す必要があります。これを行うには Application クラスを使用しました。時間のために 2 つのクラスだけを使用しましたが、目的には問題なく機能するはずです。これが私がやった方法です:

これは最初のクラスです。別のアクティビティから閉じたいのはアクティビティです。

public class MainActivity extends Activity implements OnClickListener {
private Button button;
// application instance
private MainApplication mainApplication;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mainApplication = (MainApplication) getApplicationContext();
    // set the Activity's context for later usage.  Doing this determines which
    // Activity can be closed from another Activity.
    mainApplication.setActivityContext(this);

    button = (Button) findViewById(R.id.button1);
    button.setOnClickListener(this);
}

public void onClick(View v) {
    switch (v.getId()) {
    case R.id.button1:
        Intent i = new Intent(this, SecondActivity.class);
        startActivity(i);
        break;
    }       
} 
}

これが第二の活動です。それを終了すると、finish() が最初のクラスで呼び出されます。

public class SecondActivity extends Activity {

private Activity activityContext;
private MainApplication mainApplication;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_activity_layout);

    mainApplication = (MainApplication) getApplicationContext();
    // get the Activity context you stored in the MainApplication class
    // so you can call finish on it.
    activityContext = mainApplication.getActivityContext();
}

@Override
protected void onPause() {
    super.onPause();
    // closes your defined Activity.  If you press the back button you will find
    // that you exit right out of the app as the other Activity gets popped off 
    // the stack.
    activityContext.finish();
}
}

そしてアプリケーションクラス:

public class MainApplication extends Application {

private Activity activityContext;

public Activity getActivityContext() {
    return activityContext;
}

public void setActivityContext(Activity activityContext) {
    this.activityContext = activityContext;
}

}

もちろん、AndroidManifest で MainApplication クラスを宣言してください。

<application
    android:name=".MainApplication"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

これは一種のハッキーな方法です。もっと良い方法があるかもしれません。ただし、とにかく、finish() を呼び出したいアクティビティのコンテキストを渡す必要があります。その後、どこからでも閉じることができます。

于 2012-07-24T06:04:59.230 に答える
1

私のように、これを別の方法で試すことができます。

  1. 最初にアクティビティの静的インスタンス変数を作成します。

    private static Activity1 thisAct = null; // Activity1 is name of class
    
  2. 次に、この変数をonCreate()メソッドで初期化します

    thisAct = this;
    
  3. このアクティビティを終了する静的メソッドを作成します

    public static void finishActivity()
    {
        thisAct.finish();
    }
    
于 2012-07-24T10:20:46.470 に答える
1

こんにちは、条件に基づいて、現在のアクティビティ自体でアクティビティを終了できます。または、アクティビティを終了できる結果に基づいて StartActivityforResult を使用します。

これがあなたを助けることを願っています。

于 2012-07-24T05:29:24.477 に答える
-1

アクティビティ C に移動するときに、 FLAG をクリアします。

    Intent cIntent = new Intent(view.getContext(), cActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    startActivity(cIntent);
于 2012-07-24T05:30:12.087 に答える