【问题标题】:startActivityForResult from A->B->(finish B)->C and send back result from C to AstartActivityForResult 从 A->B->(finish B)->C 并将结果从 C 发送回 A
【发布时间】:2019-09-27 22:13:24
【问题描述】:

Activity A 位于堆栈的根部,然后我 startActivityForResult B,然后从 B startActivityForResult C 并完成 B.. 因此堆栈现在是 A-C。

但是,当我在 C 中设置结果并完成它时,活动 A 没有收到此结果。这可能吗?

【问题讨论】:

    标签: android stack start-activity


    【解决方案1】:

    您可以以“开始活动 C”的结果结束活动 B,然后开始活动 C 以获得活动 A 的结果...

    【讨论】:

      【解决方案2】:

      不是使用Activity B的上下文启动Activity C,而是使用Activity A本身的上下文启动它以获得结果,这样当你在C中设置结果并完成它会返回到A。

      【讨论】:

      • 同样的想法...+1 :-)
      • 如何从 B 获取 Activity A 的上下文?
      • 让它从 Activity A 静态可用就这么简单,
      • 不要使用 Activity 的静态上下文。
      • 它完全没问题,除非它以某种方式泄露。
      【解决方案3】:

      如果您想将 Activity C 的结果传递回 Activity A:

      在活动 A 中调用 B:

      Intent showB = new Intent(ActivityA, ActivityB); 
      startActivityForResult(showB, RequestCode); 
      

      在活动 B 中调用 C:

      Intent showC = new Intent(ActivityC);
      showC.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
      startActivity(showC); 
      finish();
      

      在活动 C 中:

      //set the result code and close the activity
      Intent result = new Intent();
      setResult(RESULT_OK, result);
      finish();
      

      在活动 A 中:

      public void onActivityResult(int requestCode, int resultCode, Intent data) {
      
        doSomeStuffIfRequestCodeMatched()
      }
      

      【讨论】:

      • 这对我有用。由于startActivityForResult 现已弃用,最好使用registerForActivityResult
      【解决方案4】:

      我建议实现一个模式,您可以在其中将结果数据保存在 Activity C 中,然后完成 Activity C,以便 Activity A 出现在顶部,在 Activity A 的 onresume() 中,您可以使用以下命令访问 Modal 中的数据一些条件并进行必要的操作...

      【讨论】:

        【解决方案5】:
        class A extends Activity
        {
            protected void onCreate(Bundle savedInstanceState) 
            {
                    // code.........
                Button button=findViewById(R.id.btn_id);
                button.setOnClickListener(new OnClickListener() {
        
                    @Override
                    public void onClick(View v) 
                    {               
                        Intent intent=new Intent(A.this,B.class);
                        startActivityForResult(intent, 1001);
                    }
                });
            }
            @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) 
            {
                super.onActivityResult(requestCode, resultCode, data);
                if(resultCode==RESULT_OK )
                {
                    if(requestCode==1001)
                    {
                        Intent intent=new Intent(A.this,C.class);
                        startActivityForResult(intent, 1002);
                    }
                    else if(requestCode==1003)
                    {
                        //here you will get the result form c
                    }
                }
        
        
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2020-07-15
          • 1970-01-01
          • 1970-01-01
          • 2017-01-05
          • 2011-08-01
          • 2015-06-12
          • 2011-05-30
          • 1970-01-01
          • 2012-09-03
          相关资源
          最近更新 更多