android - 如何根据某些操作从 Activity 堆栈中删除特定 Activity/Activity ?

标签 android android-activity android-navigation activity-stack

我正在开发一个应用程序,我需要根据某些操作导航到特定 Activity 。这是一张图片

enter image description here

我的第一个 Activity 是 ReadingActivity。基于某些操作,用户将被带到 NewProjectReadingActivity。用户将有两个选择。

选项一
方案二

根据用户选择的选项,他/她将被带到 ReadingInputActivity。从 ReadingInputActivity 获取输入后,用户将被转发到 ReadingConfirmationActivity。会有三个选项

选项一
方案二
方案三

如果用户选择选项一,那么他/她将被带到非常简单的 ReadingActivity。我将清除堆栈并再次启动 ReadingActivity,如果他/她按下后退按钮,应用程序将最小化,这完全没问题。但是,如果用户选择选项二,那么他/她将被带到 NewProjectReadingActivity。如果我清除 Activity 堆栈并再次启动 NewProjectReadingActivity,那么它将启动 NewProjectReadingActivity,但问题是如果用户按下后退按钮,它将最小化我的应用程序,因为它是 Activity 堆栈中唯一存在的 Activity 。

我想要的是,如果用户在 ReadingConfirmationActivity 上选择选项二,那么用户将被带到 NewReadingActivity,这意味着我想删除 ReadingConfirmationActivity(这很容易,只需调用 finish())并且 Activity 在此之前开始 Activity 即 ReadingInputActivity。

上面提到的每个 Activity 都托管一个 fragment 。我在下面提供 Activity 代码。

阅读 Activity

public class ReadingActivity extends BaseAppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if( savedInstanceState == null ) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, ReadingFragment.getInstance(), ReadingFragment.TAG).commit();
        }
        setDisplayHomeAsUpEnabled(true);
        setActionBarText(getString(R.string.new_project_reading));
    }

    @Override
    protected void setupContentView() {
        setContentView(R.layout.activity_reading);
    }

    public static Intent newIntent(Context context) {
        Intent intent = new Intent(context, ReadingActivity.class);
        return  intent;
    }
}

新建项目阅读 Activity

public class NewProjectReadingActivity extends BaseAppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if( savedInstanceState == null ) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, NewProjectReadingFragment.getInstance(), NewProjectReadingFragment.TAG).commit();
        }
        setDisplayHomeAsUpEnabled(true);
        setActionBarText(getString(R.string.new_project_reading));
    }

    @Override
    protected void setupContentView() {
        setContentView(R.layout.activity_new_project_reading);
    }

    public static Intent newIntent(Context context) {
        Intent intent = new Intent(context, NewProjectReadingActivity.class);
        return  intent;
    }
}

阅读输入 Activity

public class ReadingInputActivity extends BaseAppCompatActivity {

    private static final String EXTRA_VALUE_TYPE = "value_type";
    private int valueType = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        valueType = getIntent().getIntExtra(EXTRA_VALUE_TYPE, 0);
        if( savedInstanceState == null ) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, ReadingInputFragment.getInstance(valueType), ReadingInputFragment.TAG).commit();
        }
        setDisplayHomeAsUpEnabled(true);
        setActionBarText(getString(R.string.reading_input));
    }

    @Override
    protected void setupContentView() {
        setContentView(R.layout.activity_reading_input);
    }

    public static Intent newIntent(Context context, int valueType) {
        Intent intent = new Intent(context, ReadingInputActivity.class);
        intent.putExtra(EXTRA_VALUE_TYPE, valueType);
        return  intent;
    }
}

阅读确认 Activity

public class ReadingConfirmationActivity   extends BaseAppCompatActivity {

    private static final String EXTRA_VALUE_TYPE = "value_type";
    private static final String EXTRA_READING_VALUE = "reading_value";
    private int valueType = 0;
    private double readingValue = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        valueType = getIntent().getIntExtra(EXTRA_VALUE_TYPE, 0);
        readingValue = getIntent().getDoubleExtra(EXTRA_READING_VALUE, 0);
        if( savedInstanceState == null ) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, ReadingConfirmationFragment.getInstance(valueType, readingValue), ReadingConfirmationFragment.TAG).commit();
        }
        setDisplayHomeAsUpEnabled(true);
        setActionBarText(getString(R.string.reading_input));
    }

    @Override
    protected void setupContentView() {
        setContentView(R.layout.activity_reading_confirmation);
    }

    public static Intent newIntent(Context context, int valueType, double readingValue) {
        Intent intent = new Intent(context, ReadingConfirmationActivity.class);
        intent.putExtra(EXTRA_VALUE_TYPE, valueType);
        intent.putExtra(EXTRA_READING_VALUE, readingValue);
        return  intent;
    }
}

最佳答案

你写道:

What i want is that if the user selects Option Two on the ReadingConfirmationActivity then the user will be taken to the NewReadingActivity that means i want to remove ReadingConfirmationActivity (which is easy just call the finish()) and the activity started before that activity i,e ReadingInputActivity.

为此,当用户在 ReadingConfirmationActivity 中选择选项二时,您将执行以下操作:

Intent intent = new Intent(this, NewReadingActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

这将导致顶部(包括)的所有 Activity NewReadingActivity完成。 NewReadingActivity 的新实例将被创建并显示给用户。如果您希望返回到 NewReadingActivity 的现有实例,您也可以通过添加 Intent.FLAG_ACTIVITY_SINGLE_TOP 来做到这一点到 Intent .

关于android - 如何根据某些操作从 Activity 堆栈中删除特定 Activity/Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53705970/

相关文章:

android - 如何清除启动 Activity 的 Intent?

java - Android 更好地实现了用于导航的 fragment

android - react-native如何将图像和onpress添加到可触摸中

android - 设备静音且不响应 ping - android

java - android:让 Activity A等待 Activity B完成并返回一些值

android - 如何从内核模块android启动一个Activity

Android导航组件: How to solve the circular navigation with nested graph?

android - Jetpack Compose - 如果具有嵌套导航,则不会选择底部导航图标

android - WIFI P2P 删除组

java - 按给定订单获取订单 android SQlite Android