从堆栈返回到特定的活动

19

我正在尝试做一个类似于文件管理器的东西。在操作栏中,我想要像“谷歌云端硬盘”应用程序中一样进行文件夹导航。我需要创建一个根据从末尾数的数字返回到之前活动的方法。

例如:

所以,如果我的堆栈是: [1] -> [2] -> [3] -> [4] -> [5]

我需要去第二个:因此我需要从堆栈中删除[3]、[4]和[5],并转到[2]。

所有活动都是ContentActivity.java类的一个实例。

如何实现呢?

更新:

这里有一些我启动活动的代码:

public class ContentActivity extends Activity implements AdapterView.OnItemClickListener {

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

        Intent intent = getIntent();
        String folderToOpen = intent.getStringExtra("folderName");
        fillList(folderToOpen);
    }


    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        ...
        Intent intent = new Intent(ContentList.this, ContentList.class);
        intent.putExtra("folderName", item.getName());
        startActivity(intent);
    }
}

你解决了这个问题吗?我有同样的疑问。 - jacosta
4个回答

33
假设您想要进入第二个活动Activity2,请尝试以下方法:
Intent intent = new Intent(this,Activity2.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
根据Android文档中有关FLAG_ACTIVITY_CLEAR_TOP的说明:
如果设置了该标志,并且要启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将其顶部的所有其他活动关闭,并将此意图作为新意图传递给(现在位于顶部的)旧活动。

所有的活动都是一个类。A 没有 Activity2 或者类似的东西。所有的活动都是 ContentActivity。 - facetostool
你能分享一些代码吗?你说的所有活动都是“ContentActivity”吗?它们都继承自“ContentActivity”吗? - antoniom
6
你忘了提到,如果Activity已经声明其启动模式为“multiple”(默认值),或在清单文件中设置了android:launchMode="singleTop",则需要设置FLAG_ACTIVITY_SINGLE_TOP以避免重新创建Activity。 - leobelizquierdo

14

通过清单属性跳过活动

这取决于需要,但如果我们只想在后退流程中跳过活动,那么有助于从清单中删除此活动的历史记录。

[1] -> [2] -> [3] - 正常流程

[1] <- [3] - 后退流程

因此,对于[2]活动,我们可以在清单中设置noHistory属性:

<activity
android:name=".SecondActivity"
android:noHistory="true" />

通过使用这种方法,我们的[2]活动将永远不会在后退流程中启动。


使用Intent Flag

从历史堆栈中删除活动并不总是一个好主意,例如如果我们的活动有时需要在后退流程中,有时不需要,在启动所需活动时,我们需要在意图中设置标志:

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

非常重要的是 - 在FirstActivity的清单文件中将启动模式设置为singleTop

<activity
   android:name=".FirstActivity"
   android:launchMode="singleTop" />

如果没有设置launchMode属性,该活动将被重新创建。


注意:如果在超过3个活动中使用“noHistory”方法,则可能会出现意外行为。 让[1]-> [2]-> [3]-> [4]成为活动,其中2和3的“noHistory”设置为“true”。 从3返回2将不再可能,因为2没有历史记录。 如果用户只需要从4返回到1而不是从3返回,则第二种方法使用“FLAG_ACTIVITY_CLEAR_TOP”方法是可行的。 - Benjamin Basmaci

0

使用这个

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

0

针对Kotlin

        val intent = Intent(this, yourDestinationActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        startActivity(intent)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接