当我从活动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,我想知道原因。 知道原因的人吗?
答案 0 :(得分:0)
看看finish()
方法的source code。
活动的结果是一个意图。在finish()
内部,该Intent传递给ActivityManager,然后将其传递给名为startActivityForResult()
的Activity。
如果您不调用setResult()
,则结果Intent(数据)为null,因为它从未设置。调用finish()
后,无论结果数据Intent是什么,都将发送到ActivityManager。
答案 1 :(得分:0)
如果要返回结果,则必须调用setResult。否则,活动将如何知道返回什么。通常,您不会在调用finish之前立即调用它-每当生成值时都将其调用。然后调用finish将自动返回上一个设置的值。
例如-如果我有图像选择器活动,则每次单击图像时,我都会设置结果(或者在开始时设置一次,并在每次单击时更新其值)。然后,当正常调用finish时,它将知道要返回什么结果。
关于完成的内容-它结束并显示“活动”,并返回到上一个。