我如何确切知道android中的finish()与setResult()有什么关系?

时间:2018-12-11 14:29:46

标签: android

当我从活动A调用活动B时,我只单击了后退按钮,数据始终为空。

    @Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(resultCode == RESULT_OK && requestCode == NAME_REQUEST) {
        String name = data.getExtras().getString(EXTRA_NAME);
        Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show();
    }
}

那是因为我没有在setResult(...)之前finish()

我试图找到我必须首先调用它的原因,但是我找不到它。我只是发现super.onBackPressed()后跟finish(),就像下面的代码一样。

public void finishAfterTransition() {
    if (!mActivityTransitionState.startExitBackTransition(this)) {
        finish();
    }
}

我找到了以下代码,但是我无法完全理解finish()调用时发生的情况。

public void prepareToLeaveProcess(boolean leavingPackage) {
    ...
}

我怎么知道?有什么好的尝试方法吗?


更新

Of,我调用了setResult(),但是我像下面的代码进行了测试。

Button sendResultBtn = findViewById(R.id.button_send_result);
    sendResultBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            /** solution 1 **/
            //sendResult();
        }
    });
}

@Override
public void onBackPressed() {
    /** solution 2 **/
    sendResult();
    super.onBackPressed();
    //sendResult();
}

@Override
public void finish() {
    /** solution 3 **/
    //sendResult();
    super.finish();
    //sendResult();
}

@Override
protected void onPause() {
    super.onPause();
    //sendResult();
}

@Override
protected void onStop() {
    super.onStop();
    //sendResult();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    //sendResult();
}

private void sendResult() {
    //Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri"));
    Intent result = new Intent("com.example.RESULT_ACTION");
    result.setType("text/plain");
    result.putExtra(EXTRA_NAME, "Something");
    setResult(Activity.RESULT_OK, result);
    //finish();
}

我必须在finish()之前调用setResult,我想知道原因。 知道原因的人吗?

2 个答案:

答案 0 :(得分:0)

看看finish()方法的source code

活动的结果是一个意图。在finish()内部,该Intent传递给ActivityManager,然后将其传递给名为startActivityForResult()的Activity。

如果您不调用setResult(),则结果Intent(数据)为null,因为它从未设置。调用finish()后,无论结果数据Intent是什么,都将发送到ActivityManager。

答案 1 :(得分:0)

如果要返回结果,则必须调用setResult。否则,活动将如何知道返回什么。通常,您不会在调用finish之前立即调用它-每当生成值时都将其调用。然后调用finish将自动返回上一个设置的值。

例如-如果我有图像选择器活动,则每次单击图像时,我都会设置结果(或者在开始时设置一次,并在每次单击时更新其值)。然后,当正常调用finish时,它将知道要返回什么结果。

关于完成的内容-它结束并显示“活动”,并返回到上一个。