【问题标题】:Android- Going back to Previous Activity with different Intent valueAndroid- 以不同的 Intent 值返回上一个 Activity
【发布时间】:2018-06-14 08:59:43
【问题描述】:

我有一个具有这种转换的应用程序:

 A -> B -> C -> D-> C

输入 C 后,我必须检查一个标志。然后我必须将它作为意图(让我们说intentX = false)传递给D。在 D 中做某事后,它会在按下按钮后返回到 C。 我所做的只是再次传递值为 true 的 intentX,然后再次 startActivity C。 那么发生的事情是它创建了另一个 Activity C。

我想要发生的是,我不必启动一个新的 Activity C,而是通过调用 super.onBackPressed() 来使用以前的 C。但我无法传递intentX 的新值。还有其他方法可以实现我想要的。我可能错过了一些。

【问题讨论】:

    标签: android android-activity


    【解决方案1】:

    你想要的是startActivityForResult()。当您从C 转到D 时,不要使用startActivity(),而是使用startActivityForResult()。然后,当您想从D 返回到C 时,您可以使用setResult(),它可以包含一个带有extrasIntent 对象以传递回C

    如果您没有,我不建议在onBackPressed() 中这样做,因为这不是用户所期望的。相反,您应该使用诸如Button 点击之类的事件返回此数据。

    所以,在C 你会做类似的事情

     Intent i = new Intent(new Intent(C.this, D.class);
     startActivityForResult(i, 0);
    

    然后在你准备好返回时在D

     Intent i = new Intent();
     i.putExtra();  // insert your extras here
     setResult(0, i);
    

    那么当你返回C你就会进入这个方法(taken from the Docs

    protected void onActivityResult(int requestCode, int resultCode,
             Intent data) {
         if (requestCode == PICK_CONTACT_REQUEST) {
             if (resultCode == RESULT_OK) {
                 // A contact was picked.  Here we will just display it
                 // to the user.
                 startActivity(new Intent(Intent.ACTION_VIEW, data));
    
                 /* 
                    can also get the extra sent back through data
                    using data.getStringExtra("someKey"); 
                    assuming the extra was a String
                 */
    
             }
    

    【讨论】:

    • 哦,我得再试一次。我以前一定是用错了。
    • 有可能,一开始很容易混淆,直到您了解它的工作原理。这应该足以让您入门,但在我链接到的文档以及 Google 和 SO 上的教程和示例中也有一个不错的示例
    • 当你在设置结果后“准备好返回”时——应该调用什么函数?我应该打电话给finish()吗?
    • @AlexanderFarber 这取决于。通常,是的,就像您将返回码放在onClick() 事件中一样。如果它在onBackPressed() 中,那么您只需调用super.onBackPressed(),因为它会通过finish() 进程,因此无需在那里调用它。
    【解决方案2】:

    在某些情况下,startActivityForResult 并不是真正需要的,或者更改所有 startActivity 对 startActivityForResult 的调用是不切实际的。

    如果需要“再次”开始前一个活动的简单情况,我的建议是:使用 FLAG_ACTIVITY_CLEAR_TOP 标志。

    引用一个简短的description

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

    例如,考虑一个由以下活动组成的任务:A、B、C、D。 如果 D 调用 startActivity() 的 Intent 解析为 活动 B 的组成部分,然后 C 和 D 将完成,B 收到 给定的 Intent,导致堆栈现在是:A,B。

    所以这个例子

       // From ActivityD
       Intent intent = new Intent(getApplicationContext(), ActivityB.class);
       intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // The flag we wanted
       intent.putExtra(ActivityB.SOME_EXTRA_THAT_I_NEED_CHANGED, SomeValue); // Example of changing the intent to get something new..
       startActivity(intent);
    

    您将在何处获得新意图取决于哪种启动模式以及用于启动它的标志(在本例中为我们的 ActivityB)。

    上例中当前正在运行的活动 B 实例将 要么接收您从这里开始的新意图 onNewIntent() 方法,或者自己完成并使用新的重新启动 意图。如果它已将其启动模式声明为“多重”( 默认值)并且您没有设置 FLAG_ACTIVITY_SINGLE_TOP 相同 意图,然后它将完成并重新创建;对于所有其他发射 模式或者如果设置了 FLAG_ACTIVITY_SINGLE_TOP 那么这个 Intent 将是 传递到当前实例的 onNewIntent()。

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多