【问题标题】:call startActivityForResult from another activity从另一个活动调用 startActivityForResult
【发布时间】:2015-08-17 23:27:07
【问题描述】:

我有一个 Activity A,它调用 startActivityForResult 来启动 Activity B,通常用户可以从 Activity A 中单击一个按钮来启动 Activity B 以获得结果。

现在我需要从Activity C打开Activity B,当Activity B返回时,它应该回到Activity A。这可能吗?

我正在尝试使用意图从 Activity C 启动 Activity A 并调用 A 的 startActivityForResult 方法,但似乎无法获取 Activity A 的实例。

正常堆栈是A->B,但现在我希望它是C->B,但是当B返回时,它会将结果返回给A。

我在想是否有可能的方法来做 C->A->B 但对用户隐藏 A?

【问题讨论】:

  • 为什么不直接启动活动 B,当结果返回到活动 C 时,使用结果数据启动对活动 A 的意图?您是否可以控制活动 B? Activity A 的实例不可访问,因为它可能已暂停、恢复、销毁等,具体取决于系统资源的使用情况。
  • 可以肯定,但是如果B从C启动,A就不会知道B的结果
  • C 是从 A 启动的吗?还是你想迷惑你的用户?

标签: android android-intent


【解决方案1】:

这是一个非常聪明的问题。我认为凯文的回答是正确的方法,尽管我确实想补充一下这个主题:

首先我们需要了解Activity的启动模式。在 android 中有 3 种活动启动模式:

  1. 标准模式:这是默认模式,将始终创建一个新的Activity,以便与发送的每个Intent 分开工作。

  2. 单顶模式:此模式的作用与标准模式几乎相同,唯一的区别是在堆栈顶部是否已经存在具有相同类型的 Activity 实例调用者任务,将创建一个新的ActivityIntent 将通过onNewIntent() 方法发送到现有的Activity)。

  3. 单任务模式:此模式与standardsingleTop 完全不同。带有singleTask launchModeActivity 只允许有一个 实例。

基本上,我们可以直接将launchMode 分配为AndroidManifest.xml 内部的属性:

<activity
        android:name=".SingleTaskActivity"
        android:label="singleTask launchMode"
        android:launchMode="singleTask">
</activity>


至于您的问题,假设我们坚持使用 Standard laucnhMode,我能想到的唯一解决方法是在每次调用 startActivity() 后调用 finish() 方法不是ActivityA。比如假设我在ActivityC里面:

public void buttonClick(View view) {

        switch (((Button) view).getText().toString()) {
            case "A":
                startActivity(new Intent(getApplicationContext(), ActivityA.class));
                break;

            case "B":
                startActivity(new Intent(getApplicationContext(), ActivityB.class));
                finish();
                break;

            case "C":
                startActivity(new Intent(getApplicationContext(), ActivityC.class));
                finish();
                break;
        }
    }

这样,无论我在哪里点击“返回”,我都会回到ActivityA。 我知道这可能无法解决您的问题,但我希望它确实给您留下了更多的思考方式。

如果这对你有任何帮助,请告诉我,如果不是简单的评论,我会编辑我的帖子。

【讨论】:

    【解决方案2】:

    所以你的堆栈是 A-C-B,而你希望它只是 A?这就像在收到来自 B 的结果时在 C 的 onActivityResult(...) 中调用 finish() 一样简单。这可以是任何结果,也可以是某些特定结果。它可以将此结果返回给 A。

    您无法可靠地获取 Activity A 的实例,因为当 A 在后台或后台堆栈中时,无法保证有任何实例可以获取。它可能已被持久化和销毁。

    【讨论】:

    • 正常栈是A->B但现在我希望它是C->B,但是当B返回时,它会将结果返回给A。是否可以做C->A-> B 但对用户隐藏 A?
    【解决方案3】:

    只需在开始前添加 getActivity() 即可获得结果

    getActivity().startActivityForResult(intent, 1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多