【问题标题】:Go back to specific activity from stack从堆栈返回特定活动
【发布时间】:2014-05-23 10:10:49
【问题描述】:

我正在尝试做类似文件管理器的事情。在操作栏中,我想像在“google drive”应用程序中一样进行文件夹导航。我需要创建方法,该方法可以从末尾按数字转到以前的活动,或者类似的东西。

例子:

所以如果我有堆栈:[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);
    }
}

【问题讨论】:

  • 有想过这个吗?我也有同样的问题

标签: android android-activity activity-manager


【解决方案1】:

假设Activity2 是您要进行的第二个活动,

试试这个:

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

Android DocumentationFLAG_ACTIVITY_CLEAR_TOP

如果设置,并且正在启动的活动已经在 当前任务,而不是启动该任务的新实例 活动,除此之外的所有其他活动都将关闭,并且 此 Intent 将作为 新意图。

【讨论】:

  • 所有活动都是一类。 A 没有 Activity2 或类似的东西。所有活动都是 ContentActivity。
  • 你能分享一些代码吗?所有活动都是ContentActivity 是什么意思?他们继承自ContentActivity 吗?
  • 你忘了提到你需要设置FLAG_ACTIVITY_SINGLE_TOP,如果它已经声明它的启动模式是“多个”(默认)或设置@ 987654328@ 在您的清单中
【解决方案2】:

按清单属性跳过活动

这取决于需要,但如果我们只是想跳过回流中的活动,那么可以从清单中的历史记录中删除此活动。

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

[1]

那么对于[2]的Activity我们可以在Manifest中设置noHistory属性:

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

感谢这种方法,我们的 [2] Activity 将永远不会在回流中启动。


使用意图标志

从历史堆栈中删除活动并不总是一个好主意,例如,如果我们的 Activity 有时需要回流而有时不需要,那么为了启动想要的 Activity,我们需要在 Intent 中设置标志:

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 属性的活动将被重新创建。

【讨论】:

  • 注意:如果“noHistory”方法用于 3 个以上的活动,则可能会出现意外行为。让 [1]->[2]->[3]->[4] 为活动,其中 2 和 3 的“noHistory”设置为“true”。将不再可能从 3 回到 2,因为 2 没有历史记录。如果用户应该从 4 回到 1 而不是从 3,那么采用“FLAG_ACTIVITY_CLEAR_TOP”的第二种方法是可行的方法。
【解决方案3】:

使用这个

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

【讨论】:

    【解决方案4】:

    对于科特林

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-07
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      相关资源
      最近更新 更多