当前位置: 首页 > 知识库问答 >
问题:

当父活动调用finishActivity()时,结果代码为零

寇景明
2023-03-14

我将setResult(200)放在子活动的onCreate()中。

但是一旦我从父级调用finishActivity(),我就得到了结果代码0。

我不知道如何解释这种情况。

04-25 11:52:55.191: D/TEST(28141): onActivityResult 1000 : 0 : null

父级是:

public class Main extends Activity {
    Button b;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        b = (Button) findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(Main.this, Popup.class);
                startActivityForResult(intent, 1000);

                new Timer().schedule(new TimerTask() {
                    @Override
                    public void run() {
                        Main.this.finishActivity(1000);
                    }
                }, 1000);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("TEST", "onActivityResult " + requestCode + " : " + resultCode + " : " + data);
        super.onActivityResult(requestCode, resultCode, data);
    }
}

孩子:

public class Popup extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setResult(200);

    }
}

更新:

我明白onActivityResult()将在子活动结束时被调用。
调用 finishActivity() 不会获取子活动的 ActivityResult。

但是我想知道一旦子活动被父活动破坏,获取ActivityResult(结果代码和意图数据)的正确方法。
有什么理由不应该像下面的代码一样这样做吗?(我只是好奇。)
因为它似乎运行良好。

我是这样编码的:

public class Main extends Activity {
    Button b;
    public static boolean closePopup = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        b = (Button) findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                closePopup = false;
                Intent intent = new Intent(Main.this, Popup.class);
                startActivityForResult(intent, 1000);

                new Timer().schedule(new TimerTask() {
                    @Override
                    public void run() {
                        closePopup = true;
                    }
                }, 1000);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("TEST", "onActivityResult " + requestCode + " : " + resultCode + " : " + data);
        super.onActivityResult(requestCode, resultCode, data);
    }
}



public class Popup extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mCloseHandler.sendEmptyMessage(0);
    }

    Handler mCloseHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (Main.closePopup == true) {
                Popup.this.finish();
            } else {
                mCloseHandler.sendEmptyMessageDelayed(0, 100);
            }
        }
    };

    @Override
    public void finish() {
        setResult(200);
        super.finish();
    }
}

共有1个答案

凌修伟
2023-03-14

在您的Popup活动中使用

if(null != getParent())
    getParent().setResult(200);
else
    html" target="_blank">setResult(200);

而不仅仅是< code > setResult(200);

因为您需要将数据绑定到父活动并设置结果。

更新:

了解<code>finish()与<code>finishActivity(int requestCode)</code>之间的区别

完成()

当您的活动完成并应关闭时,请调用此函数。ActivityResult会传播回通过onActivityResult()启动您的任何人。

完成活动(int requestCode)

强制完成之前使用startActivityForResult(Intent,int)启动的另一项活动。

因此,在您的情况下,您正在Main上调用finishactive,这将完成子活动Popup。因此,您将结果代码设置为0,而意图设置为null(默认值),因为数据不会传播回Main(Pak)。

我建议您修改您的代码如下并尝试:

>

  • 移除定时器块,即调用finishActivity
  • 在<code>setResult(200)之后调用<code>finish()</code>函数

    if(null != getParent())
       getParent().setResult(200);
    else
       setResult(200); 
    
    finish(); 
    

    更新2:我来进一步解释一下。

    当您使用< code > startActivityForResult()方法调用启动活动时,一旦子活动结束,就会调用子活动的< code>onActivityResult()方法,您可以根据结果执行操作。

    启动的活动(子活动)还可以设置结果代码,调用者可以使用该代码确定活动是否已取消。(你的情况)

    子活动使用< code>finish()方法创建一个新的意图,并将数据放入其中。它还通过< code>setResult()方法调用来设置结果。

    如果子活动完成,它可以通过 Intent 将数据发送回其调用方。这是在 finish() 方法中完成的。因此,您可以按如下方式覆盖完成方法。

    @Override
    public void finish() {
      // Prepare data intent 
      Intent data = new Intent();
      // Put data in intent
      // Activity finished, return the data
      setResult(200, data);
      super.finish();
    }
    

  •  类似资料:
    • 我有两个活动A和B。A启动活动B。在活动B中,我在按钮单击处理程序中调用setResult(RESULT_OK,intent),而不调用finish()-这是理想的行为。 旋转B并按back后,A的onActivityResult接收resultCode的RESULT_Cancelled,而不是RESULT_ OK。 我知道这是因为活动B在旋转时被破坏了。确保从B返回正确的结果代码的常见做法是什么

    • 我已使用 startActivityForResult 从父活动启动了子活动。在子活动中执行所需功能后,我正在使用setResult设置结果。但是我没有从孩子活动中获得父母活动的结果。 这是我的代码。 下面是我如何从父活动中调用子活动。 这是我如何设置子活动的结果。 这是我的onActivityResult 这里是当我检查resultCode==活动时。RESULT_OK给出false。我还检查了

    • 我把一个额外的动作从第一个动作传给第二个动作。我验证传递给第二个活动的内容。我让它按我的计划运行。我的问题是如何将字符串值传递回第一个活动。 这里我把第一个活动称为第二个活动。 在第二个活动中,我像这样从第一个活动接收数据 我对从第一个活动传递的额外内容执行验证,并希望将单个字符串传递回第一个活动。在第二个活动中,我加载了一个RecyclerViewer并在我尝试过的onClick上。 我的问题至

    • 问题内容: 你们有以下问题的解决方法吗? 在注册活动的onDestroy中(当用户按下后退按钮时),我调用一个新活动,以便用户可以输入当天的某些最终生产数据,然后通过电子邮件发送该报告。问题在于,在刚刚开始的活动中,对getIntent的调用返回null,而我必须从那里获取数据。 ================================================== ========

    • 从v4.fragment请求运行时权限并让回调转到fragment?