Android 从堆栈中删除活动

Android 从堆栈中删除活动,android,stack,android-activity,Android,Stack,Android Activity,我有三个活动,活动A,活动B,活动C 假设在ActivityA中有一些代码,如 if(someCondition()){ gotoActivityB(); } else{ gotoActivityC(); } 现在,如果用户转到活动b,活动a不应该完成 如果他去活动,就应该完成 在清单文件中添加noHistory无效 另外,if条件中的finish() 我不想在那些活动onBackPressed()中调用startActivity(context,ActivityA.class),因为它会在A

我有三个活动,活动A,活动B,活动C

假设在ActivityA中有一些代码,如

if(someCondition()){
gotoActivityB();
}
else{
gotoActivityC();
}
现在,如果用户转到活动b活动a不应该完成

如果他去活动,就应该完成

在清单文件中添加
noHistory
无效

另外,if条件中的
finish()

我不想在那些活动
onBackPressed()
中调用
startActivity(context,ActivityA.class)
,因为它会在ActivityA中再次执行
onCreate()
的代码

那么,当用户按下ActivityB中的“后退”按钮时,是否有一种方法可以将ActivityA从堆栈中删除

可能是这样的:

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

您好,您可以根据条件在当前活动本身中完成活动。或者根据您可以完成活动的结果使用StartActivityforResult


希望这将对您有所帮助。

在进入活动C时,清除标志:

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

    startActivity(cIntent);

好的,这里有一个方法可以让你实现你的目标。您需要将活动上下文传递到任何需要它的地方,以便对其调用finish()。我使用应用程序类来完成这项工作。为了节省时间,我只使用了两个类来完成它,但它应该可以很好地满足您的需要。我是这样做的:

这是头等舱。这是我们希望从另一个活动结束的活动

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()的活动的上下文。然后你可以从任何地方关闭它。

你可以用另一种方式尝试,就像我一样

  • 在开始时创建活动的静态实例变量

    private static Activity1 thisAct = null; // Activity1 is name of class
    
  • 现在在
    onCreate()
    方法中初始化此变量

    thisAct = this;
    
  • 创建将完成此活动的静态方法

    public static void finishActivity()
    {
        thisAct.finish();
    }
    

  • 执行此操作时,应用程序将关闭,因为活动A是中的第一个活动stack@AkashG我知道。让应用程序关闭,因为ActivityC之后有许多活动,其中ActivityA应该位于后台。如果调用C,那么完成A的目的是什么?这是一个非常大的应用程序,我无法解释它的用途。我只是举了个例子。我想要的是“我能完成另一个活动堆栈中的一个活动吗?”不。这不能解决我的问题。完成一次完整的问题。完美!!!谁在乎这是一种刻薄的方式还是合乎道德的方式?我的问题解决了,谢谢。但问题解决了。所以,我不想再打扰你了:)\