当BACKbutton被按下时,setResult不起作用
我正在按BACKbutton后尝试setResult。 我打电话给onDestroy
Intent data = new Intent(); setResult(RESULT_OK, data)
但是当涉及到
onActivityResult(int requestCode, int resultCode, Intent data)
resultCode为0(RESULT_CANCELED),数据为'null'。
那么,我怎样才能通过返回button终止活动的结果呢?
您需要覆盖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(); }
在 finish()
被调用之前,必须设置Activity
结果。 点击BACK实际上会在你的activity
调用finish()
,所以你可以使用下面的代码片段:
@Override public void finish() { Intent data = new Intent(); setResult(RESULT_OK, data); super.finish(); }
如果您调用NavUtils.navigateUpFromSameTask();
在onOptionsItemSelected()
, finish()
被调用,但是你会得到错误的result code
。 所以你必须在onOptionsItemSelected()
调用finish()
而不是navigateUpFromSameTask
。 onActivityResult中的错误requestCode
如果你想在onBackPressed
事件中设置一些自定义的RESULT_CODE
,那么你需要先设置result
,然后调用super.onBackPressed()
,你将在调用者的activity的onActivityResult
方法中得到相同的RESULT_CODE
@Override public void onBackPressed() { setResult(SOME_INTEGER); super.onBackPressed(); }
我重构了我的代码。 最初我准备了一些数据,并将其设置为onDestroy
activity result
(这不起作用)。 现在我每次要更新返回的数据都设置activity
数据,而在onDestroy
什么也没有。
请参阅ActivityResult(int,int,Intent)doc
解决方法是检查resultCode的值Activity.RESULT_CENCELED 。 如果是,则意味着按下BACK或者活动崩溃。 希望它适用于你们,为我工作:)。
你应该重写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); } }
onDestroy
在链中已经太迟了 – 而是重写onPause
并检查isFinishing()
来检查你的活动是否在其生命周期结束。
尝试重写onBackPressed(从android级别5起),或重写onKeyDown()并捕获KeyEvent.BUTTON_BACK(请参阅Android活动结果 )这对我来说是诀窍。
当您返回到初始状态时,不要依赖在一个活动的onPause中执行的任何逻辑。 根据文件:
这个方法的实现(onPause)必须非常快,因为在这个方法返回之前,下一个活动不会被恢复
有关详细信息,请参阅http://goo.gl/8S2Y 。
最安全的方法是在每个结果更改操作完成后设置结果(如您在答案中所述)
我贴的答案可能会对其他人有所帮助:当一个set的launcheMode与android:launchMode =“singleTask”我也不能得到结果,文档说:
/* <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. */