回答:
スーパークラスを呼び出す前に、onBackPressed()メソッドをオーバーライドして結果を設定する必要があります。
@Override
public void onBackPressed() {
Bundle bundle = new Bundle();
bundle.putString(FIELD_A, mA.getText().toString());
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
setResult(RESULT_OK, mIntent);
super.onBackPressed();
}
Activityが呼び出される前に 結果を設定する必要がありますfinish()。[戻る]をクリックすると実際にが呼び出さfinish()れるactivityため、次のスニペットを使用できます。
@Override
public void finish() {
Intent data = new Intent();
setResult(RESULT_OK, data);
super.finish();
}
で呼び出すNavUtils.navigateUpFromSameTask();とonOptionsItemSelected()、finish()が呼び出されますが、間違えresult codeます。したがって、ではfinish()ないnavigateUpFromSameTaskで呼び出す必要がありますonOptionsItemSelected()。
onActivityResultの間違ったrequestCode
finishていません、onPauseそして何と関係がありonDestroyますか?それらはfinish、終了プロセスを開始することを除いて、まったく関係ありません。onPauseとonDestroyの一部であるが。
次のようにonOptionsItemSelectedをオーバーライドする必要があります。
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
final Intent mIntent = new Intent();
mIntent.putExtra("param", "value");
setResult(RESULT_OK, mIntent);
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
参照 onActivityResult(int、int、Intent)ドキュメントを
解決策は、値Activity.RESULT_CENCELEDのresultCodeを確認することです。はいの場合は、戻るが押されたか、アクティビティがクラッシュしたことを意味します。それがあなたたちのために働くことを願って、私のために働く:)。
onDestroyチェーンの中で手遅れです—代わりにオーバーライドonPauseしてチェックisFinishing()し、アクティビティがライフサイクルの最後にあるかどうかを確認してください。
onBackPressed(Androidレベル5以降)をオーバーライドするか、onKeyDown()をオーバーライドしてKeyEvent.BUTTON_BACKをキャッチします(Androidアクティビティの結果を参照)これは私にとってはトリックです。
最初のアクティビティに戻るときに、1つのアクティビティのonPauseで実行されるロジックに依存しないでください。ドキュメントによると:
このメソッド(onPause)の実装は、このメソッドが戻るまで次のアクティビティが再開されないため、非常に高速でなければなりません。
詳細については、http://goo.gl/8S2Yをご覧ください。
最も安全な方法は、結果を変更する各操作が完了した後に結果を設定することです(回答で述べたように)
答えを貼り付けると、他の人の役に立つかもしれません:android:launchMode = "singleTask"で設定されたlauncheModeでも結果を取得できない場合、ドキュメントには次のように記載されています。
/* <p>Note that this method should only be used with Intent protocols
* that are defined to return a result. In other protocols (such as
* {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
* not get the result when you expect. For example, if the activity you
* are launching uses the singleTask launch mode, it will not run in your
* task and thus you will immediately receive a cancel result.
*/
そして:
/* <p>As a special case, if you call startActivityForResult() with a requestCode
* >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
* activity, then your window will not be displayed until a result is
* returned back from the started activity. This is to avoid visible
* flickering when redirecting to another activity.
*/