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

时间:2014-04-25 03:19:11

标签: android android-activity

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

但是一旦我从父母调用了finishActivity(),我得到了resultCode 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(resultCode和intent数据)的正确方法。
是否有任何理由不应该像波纹管代码那样做? (我只是很好奇。)
因为看起来工作正常。

我这样编码:

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 个答案:

答案 0 :(得分:1)

Popup活动中使用

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

而不只是setResult(200);

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

<强>更新

了解finish()finishActivity (int requestCode)

之间的区别

完成()

  

在您的活动完成后调用此选项并应关闭。该   ActivityResult会传播回通过你发送给你的人   onActivityResult()。

finishActivity(int requestCode)

  

强制完成您之前开始的另一项活动   startActivityForResult(Intent,int)。

因此,在您的情况下,您正在finishActivity上调用正在完成子活动Main的{​​{1}}。因此,您将结果代码设置为0,将intent设置为null(默认值),因为数据不会传播回Main(Parent)。

我建议您按如下方式修改代码并尝试:

  1. 删除计时器块即。打电话给finishActivity。
  2. Popup中的finish()之后致电setResult(200);

    Popup
  3. 更新2: 让我进一步解释一下。

    使用if(null != getParent()) getParent().setResult(200); else setResult(200); finish(); 方法调用启动活动时,子活动结束后,将调用子活动上的startActivityForResult()方法,您可以根据结果执行操作。

    启动的活动(子活动)还可以设置调用者可以用来确定活动是否被取消的结果代码。(您的情况)

    子活动使用onActivityResult()方法创建新意图并将数据放入其中。它还通过finish()方法调用设置结果。

    如果子活动完成,它可以通过setResult()将数据发送回其呼叫者。这是在Intent方法中完成的。所以你可以按如下方式覆盖finish方法。

    finish()