在onPause()中,为什么在调用super.onPause()之后放置一些方法?

时间:2014-03-13 02:36:12

标签: java android android-intent android-activity lifecycle

此代码正在打印日志,但是将null返回到父活动:

@Override
protected void onPause() {
    super.onPause();
    Log.d("Two", "onPause()");
    Intent data = new Intent();
    data.putExtra(TWO_CLICKS_FOR_ONE, mClicks2);
    setResult(RESULT_OK, data); 
}

似乎没有创建Intent,但正在执行日志行。这最终导致了一个错误,其中父活动的数据为null。父活动使用onActivityResult来检索数据:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("One", "onActivityResult()");
    if (data == null) {
        Log.d("One", "data == null !!!");
        return;
    }
    mClicks2 = data.getIntExtra(Two.TWO_CLICKS_FOR_ONE, 0);
    Log.d("One", "mClicks2 = " + mClicks2);
}

正如我所说,数据在此处具有空值,因此永远不会为mClicks2赋值。

当我在块的末尾放置super.onPause()调用时,事情发生了变化。现在一切都按预期工作:

@Override
protected void onPause() {
    Log.d("Two", "onPause()");
    Intent data = new Intent();
    data.putExtra(TWO_CLICKS_FOR_ONE, mClicks2);
    setResult(RESULT_OK, data);
    super.onPause();
}

使用此代码实例化Intent数据,调用putExtra()和setResult(),并在父活动中成功为mClicks2分配值。

这种行为的原因是什么? Log.d()在super.onPause()之后执行,但Intent从未实例化。

1 个答案:

答案 0 :(得分:1)

因为幕后安卓会在setResult(RESULT_OK, data);来电期间处理您使用super.onPause()设置的结果。如果您在致电super.onPause()后设置了结果,那么您错过了将其传递回父活动的机会,那你就太迟了。为了使事情正常工作,您必须遵守活动的生命周期。