问题 覆盖功能的Android Activity必须调用super。*


在创建自己的Activity子类时,我们将覆盖一些基本的Activity生命周期函数。

我们在哪一个 必须 调用超级实现,我们在哪里 应该 它在哪里 只有好的方式 ?

// base lifecycle
onCreate(Bundle savedInstanceState);
onStart();
onRestart();
onResume();
onPause();
onStop();
onDestroy();
finalize();
onUserLeaveHint();
// instance state
onSaveInstanceState(Bundle outState);
onRestoreInstanceState(Bundle savedInstanceState)
// others
onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo);
onCreateOptionsMenu(Menu menu);
onOptionsItemSelected(MenuItem item);
onContextItemSelected(MenuItem item);
onMenuItemSelected(int featureId, MenuItem item);
onActivityResult(int requestCode, int resultCode, Intent data);
onBackPressed();

方法列表不是最终的,随意添加更多功能,我们应该知道,做什么。


对于那些感兴趣的人,应该在哪里 super.methodName 放置
Android Eclipse插件中super()调用的位置生成的代码是否可靠?


7318
2018-01-17 09:41


起源

如果您忘记调用super方法,Android将抛出RuntimeException,尽管这是必要的。 - Flo
FIRST的超级课程: onRestoreInstanceState، onStop, onRestart, onStart。最后的超级课程: onDestroy, onPause, onSaveInstanceState, onResume。 - Yousha Aleayoub


答案:


必须:

  • onCreate(Bundle savedInstanceState);
  • onStart();
  • onRestart();
  • onResume();
  • onPause();
  • onStop();
  • onDestroy();
  • onPostCreate(Bundle savedInstanceState);
  • onPostResume();

应该/不应该: (可能有助于调用超类方法,除非您管理活动的状态或故意改变活动的行为 - 在这种情况下它可能是有害的)

  • onSaveInstanceState(Bundle savedInstanceState);
  • onRestoreInstanceState(Bundle savedInstanceState);
  • onBackPressed();
  • onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo);
  • onCreateOptionsMenu(Menu menu);
  • onOptionsItemSelected(MenuItem item);
  • onContextItemSelected(MenuItem item);
  • onMenuItemSelected(int featureId, MenuItem item);

实际上,当覆盖任何方法时,查看被覆盖类的源代码并查看该方法究竟是做什么是一个好习惯。


6
2018-01-17 09:59



很好,至少你,回答了我的问题:)谢谢 - Marek Sebera
欢迎你,Marek) - a.ch.
你能解释一下你如何将这些方法分类为“必须”和“应该”吗?我是初学者,我试图了解如何确定哪些方法应该调用super()。我不想只在需要时记住和回忆......我想了解如何解决这个问题 - Jeet Parekh
我稍微更新了答案。基本上,您必须调用方法(您将从方法的描述,Lint提示或您将获得的异常中了解它)以及以某种方式影响Activity / Fragment行为的方法。 - a.ch.
FIRST的超级课程: onRestoreInstanceState، onStop, onRestart, onStart。最后的超级课程: onDestroy, onPause, onSaveInstanceState, onResume。 - Yousha Aleayoub


调用超级实现只是一个很好的做法。

但有些时候它是强制性的,比如“onCreate()”,否则在这种情况下会有一个“ActivityInstantiateingexcepetion”。

此外,有时您想在某些情况下覆盖超级实现,例如

 onBackPressed(){
如果(myFlag){
//做我的东西
}
 其他{
 //按下背面的常用内容
super.onBackPressed();
}

所以这样一来,如果你的“myFlag”是真的,你的东西就会完成,否则正常的onBackpressed将被执行。


4
2018-01-17 09:49



:我同意100% - Tofeeq
@TofeeqAhmad:谢谢,为什么不在这种情况下投票给我答案:) - akkilis
当然:) :)。 +1兄弟 - Tofeeq


这一切 Activity class method.In Java和Android如果你打电话 superclass 方法,你必须写 super.methodName


2
2018-01-17 09:47





所有这些方法应该调用super.method()我想


0
2018-01-17 09:56