1

我有三个活动ActivityA,ActivityB,ActivityC。

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

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

现在,如果用户去ActivityBActivityA不应该完成。

如果他去ActivityC,它应该完成。

添加noHistory清单文件不起作用。

此外,finish()如果条件不起作用,因为 ActivityC 之后有许多活动,其中 ActivityA 应该在后台。

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

那么,有没有办法,当用户按下 ActivityB 中的后退按钮时,我可以从堆栈中删除 ActivityA?

可能是这样的:?

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

4 回答 4

2

好的,这是实现目标的一种方法。您需要将 Activity 上下文传递到您需要它的任何地方,以便在其上调用 finish()。我使用 Application 类来做到这一点。为了时间,我只使用了两个类来完成它,但它应该可以很好地满足您的目的。这是我的做法:

这是第一堂课。它是我们想要从另一个 Activity 关闭的 Activity。

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" >

这是一种 hacky 方式来做到这一点。可能有更好的方法。但无论如何,您必须传递要调用 finish() 的 Activity 的上下文。然后你可以从任何地方关闭它。

于 2012-07-24T06:04:59.230 回答
1

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

希望这会帮助你。

于 2012-07-24T05:29:24.477 回答
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

在进行活动 C 时,清除 FLAG :

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

    startActivity(cIntent);
于 2012-07-24T05:30:12.087 回答