Android-活动构造函数与onCreate


88

我了解到AndroidActivities具有特定的生命周期,onCreate应该重写该生命周期并将其用于初始化,但是构造函数中到底发生了什么?在任何情况下,您也可以/应该重写Activity构造函数,或者永远不要触摸它?

我假设永远不要使用构造函数,因为对 Activities不会完全清除(从而妨碍了垃圾收集器),并且onDestroy为此目的而存在。它是否正确?


2
Android可以随时销毁/重新创建您的Activity的事实又如何呢?您不知道是否随后会调用构造函数,甚至不知道-将调用哪个构造函数...(这同样适用于Fragments,这就是为什么每个Fragment都必须实现一个空的默认构造函数)。
玛丽安(MarianPaździoch)2015年

Answers:


34

我想不出有什么充分的理由在构造函数中做任何事情。您永远不会直接构造活动,因此无法使用它来传递参数。通常,只需在onCreate中执行操作即可。


73
onCreate()阻止您使用最终字段。
吉利2012年

2
但是OnCreate不仅被调用一次,我错了吗?当我改变屏幕方向并用手回去时,每次重新加载活动时,就会调用
oncreate

2
我相信@fercis onCreate每个实例只能调用一次。旋转设备时,该Activity实例将被销毁,并创建一个新实例,调用onCreate。就是说,我敢肯定您无法实例化onCreate中的最终字段,因为Java不知道onCreate仅会被调用一次(实际上,您可以在代码中再次调用它-不好的事情会发生,但仍会编译),因此实例化最终字段的唯一方法是在构造函数中。
哈维·阿德考克

OnCreate事件何时开始准确运行?当我在OnCreate事件开始时设置断点时,应用程序运行并将活动加载到屏幕上,然后激活断点,应用程序暂停。我需要一个有关活动的事件,该事件恰好在活动初始​​化和启动之前激活。
Mohammad Afrashteh

@Cheryl Simon,您告诉您永远不要直接创建活动,那么谁来创建活动?
Sreekanth Karumanaghat

7

正如吉利(Gili)的评论所述,将东西放入构造函数的一个很好的理由是使用final字段。

但是,如果在构造函数中初始化事物,则该对象的寿命会更长一些,尽管我认为不会太长,因为onCreate此后不久就会调用。

虽然这是对我的理想,我一定要避免的构造函数活动成员的初始化和依赖onResume(),并onPause()为资源我的应用程序处理。

因为onCreate()我通常使用它来进行到局部变量的视图映射。尽管android-annotations已经为我做到了,所以我很少有一个onCreate()用于Activity的方法。我仍然在Service中使用它。

但是,如果您查看成员,则可能正在初始化

  • 他们将有一个“关闭”方法,您必须在适当的时间(onResume或onPause)调用

  • 它们将成为视图的一部分,这意味着需要对其进行初始化,然后再调用onCreate。

  • 它们是常量,无论如何都不需要放在构造函数中,只需一个静态final即可。这包括可以由静态块初始化的Paint和Path常量


1
您的意思是物体的寿命会更长一点?我以什么方式?例如,由于如果将这些初始化移动到onCreate中,则仍然需要花费相同的时间。我可以确定寿命没有差异。作为我的相对较新来者,您能不能再进一步介绍一下呢?
RichieHH 2014年

2
@RichieHH由更长的Archimedes只是说构造函数在onCreate()之前被调用,因此在活动被销毁之前,在那里所做的任何事情都会比(否则)持续更长的时间
pho79

6

我现在遇到一个需要重写构造函数的案例。实际上,我有一些具有相同结构的活动。因此,我将创建一个“主”活动,而不是创建许多活动,其他活动将继承该活动。因此,我需要重写子活动的构造函数,以便能够初始化将在oncreate方法中使用的一些变量。

用两个词,构造函数使您模拟可以被继承重用的“ masteractivity”!


15
我知道这很旧,但是与仅在onCreate()中实现超字段实例化相比,这有什么好处。无论如何,您将从子级调用super.onCreate()。
Andrew G

因此,只需在启动活动时通过将捆绑包或意图中的不同值传递给相同的KEY,然后使用相同的活动,即可根据接收到的值确定在活动中显示什么。您选择建设者的具体原因是什么?否则,保持Activity的非更改部分通用,而对于其余的更改部分,您可以创建片段。
Nayanesh Gupte 2014年

0

当您的活动将具有自定义参数或要跟踪从其继承的类的调用时,您需要覆盖构造函数。


1
您能详细说明一下吗?您描述的内容听起来很有趣,但这有点含糊。谢谢!
偶像

3
假设您需要创建一个接受2个或更多参数的自定义Activity类。您只需要使用构造函数,就不能通过onCreate和extras来实现。有帮助吗?
Pentium10'7

1
我可能需要一个私人的。假设我想创建一个自定义组件,例如自定义联系人选择器。为了使startActivityForResult我必须在我的自定义组件中包含一个私有构造函数,即使该活动将永远不会启动并且没有可见元素,我也只将其用于结果。
奔腾10

6
我要说的是,@ Pentium对我来说毫无意义,并非没有代码示例。
Blundell 2012年

我认为通过构造函数执行操作的一个好处是可以进行“模板”活动,该活动可以接受继承的类可以利用的参数。例如,如果您有两个仅在某些属性(例如R.id.cameraSurface,R.id.videoSurface)中不同的活动,则可以创建一个构造函数,该构造函数将接受一个名为AbstractResourceActivity的参数,然后注册了CameraActivity在扩展AbstractResourceActivity的清单中传递资源ID。
阿基米德·特拉哈诺
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.