【问题标题】:Is it allowed to have a chain of onActivityResult's?是否允许有一个 onActivityResult 链?
【发布时间】:2015-09-25 12:42:32
【问题描述】:

假设我有一个主要活动 A 和另外两个活动 B 和 C。

A 启动 Intent B,然后 B 启动 Intent C。

然后C设置setResult(...)finish(),B也一样,最后在A中以onActivityResult(...)结束。

这是否允许?会有用吗?

【问题讨论】:

  • 是的。我遇到了困难,与其调试无法调试的东西,我想问问那些现有的有经验的用户。
  • onActivityResult 仅针对直接启动的活动触发。所以你必须为 A 和 B 覆盖 onActivityResult
  • 我已经覆盖了 A 和 B。假设有可能,我会继续调试。
  • 在 startActivityForResult() 方法调用中,您可以指定一个结果代码来确定您启动了哪个活动。该结果代码将返回给您。 vogella.com/tutorials/AndroidIntent/article.html

标签: android android-intent bundle


【解决方案1】:

是的,它会起作用的。当收到 C 的结果时,只需完成活动 B。但是,当完成 B 时,活动 C 的结果不会传播,如果需要,您必须手动设置它。

【讨论】:

    【解决方案2】:

    在活动 A 中:

    Intent intent = new Intent(this, B.class);
    startActivityForResult(intent, 1);
    
    ....
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
       if (requestCode == 1){
                if (resultCode == RESULT_OK){
    
                    Bundle bundle = data.getExtras();
                    String code = "";
    
                    try{
                        code = bundle.getString("code");
                    } catch (Exception e){
                        e.printStackTrace();
                    }
    
                    if (!code.equals("")){
                        //do something
                    }
    
                }
    }
    

    在活动 B 中:

    Intent intent = new Intent(this, C.class);
    startActivityForResult(intent, 1);
    
    ...
     @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
       if (requestCode == 1){
                if (resultCode == RESULT_OK){
    
                    Bundle bundle = data.getExtras();
                    String code = "";
    
                    try{
                        code = bundle.getString("code");
                    } catch (Exception e){
                        e.printStackTrace();
                    }
    
                    if (!code.equals("")){
                        Intent intent = new Intent();
                        Bundle bundle = new Bundle();
                        bundle.putString("code", code);
                        intent.putExtras(bundle);
                        setResult(RESULT_OK, intent);
                        finish();
                    }
    
                }
    }
    

    然后在 Activity C 中的某个时间点:

    Intent intent = new Intent();
    Bundle bundle = new Bundle();
    bundle.putString("code", code);
    intent.putExtras(bundle);
    setResult(RESULT_OK, intent);
    finish();
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      是的,它会起作用。以下是您可能只需要的流程概览:

      Activity A {
          startActivityForResult() // start activity B
      
          onActivityResult() // receive B's result
      }
      
      Activity B {
          getIntentFromA()
          startActivityForResult(); // start activity C
      
          onActivityResult() {    
              // receive C's result
              setResult(c's result); <-- this will pass back to A
          }
      }
      
      Activity C {
          getIntentFromB()
      
          setResult(c's result); <-- this will pass back to B
      }
      

      【讨论】:

        猜你喜欢
        • 2012-04-10
        • 1970-01-01
        • 2011-07-31
        • 2011-02-20
        • 2010-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多