Android - 活动构造函数与 onCreate

Posted

技术标签:

【中文标题】Android - 活动构造函数与 onCreate【英文标题】:Android - Activity Constructor vs onCreate 【发布时间】:2011-03-19 03:31:51 【问题描述】:

我了解 android Activities 具有特定的生命周期,应该重写 onCreate 并用于初始化,但构造函数中究竟发生了什么?是否有任何情况下您可以/应该重写 Activity 构造函数,或者您不应该触摸它?

我假设永远不应该使用构造函数,因为对 Activities 的引用没有被完全清除(因此妨碍了垃圾收集器)并且 onDestroy 就是为此目的。这是正确的吗?

【问题讨论】:

Android 可以随时销毁/重新创建您的 Activity 的事实如何?你不知道构造函数是否会被调用,即使 - 哪个构造函数会被调用......(同样适用于片段,这就是为什么每个片段都必须实现一个空的默认构造函数)。 【参考方案1】:

我想不出任何好的理由在构造函数中做任何事情。你从不直接构造一个活动,所以你不能用它来传递参数。一般只在onCreate中做事。

【讨论】:

onCreate() 阻止您使用最终字段。 但是 OnCreate 不是只调用一次,我错了吗?当我用手改变屏幕方向并返回时,每次重新加载活动时,都会调用 oncreate @fercis onCreate 我相信每个实例只调用一次。旋转设备时,该 Activity 实例被销毁并创建一个新实例,调用 onCreate。也就是说,我很确定你不能在 onCreate 中实例化 final 字段,因为 Java 不知道 onCreate 只会被调用一次(事实上,你可以在你的代码中自己再次调用它——坏事会发生,但它仍然会编译),因此实例化最终字段的唯一方法是在构造函数中。 OnCreate 事件何时开始准确运行?当我在 OnCreate 事件开始时设置断点时,应用程序运行并将活动加载到屏幕,然后断点激活并且应用程序暂停。我需要一个关于在活动初始​​化和启动之前激活的活动的事件。 @Cheryl Simon,您告诉过您从不直接创建活动,那么谁创建了活动?【参考方案2】:

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

但是,如果你在构造函数中初始化东西,那么对象的生命周期会稍微长一些,虽然我不认为太多,因为此后不久将调用onCreate

虽然这与我的理想背道而驰,但我确实避免使用构造函数来初始化活动成员,并依赖 onResume()onPause() 来获取我的应用正在处理的资源。

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

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

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

它们将成为视图的一部分,这意味着它需要被初始化然后需要调用 onCreate

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

【讨论】:

你的意思是物体的寿命会长一点?我有什么办法?因为如果你将这些初始化移动到 onCreate 中,例如,这仍然需要相同的时间。我可以确定的寿命没有差异。您能否再详细说明一下,因为我觉得,作为一个相对较新的人,我可能在这里遗漏了一些重要的东西。 @RichieHH by long Archimedes 只是说构造函数在 onCreate() 之前被调用,因此在活动被销毁时,无论在那里做什么都会比其他情况持续(稍微)更长的时间【参考方案3】:

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

简而言之,构造函数让你模拟一个可以通过继承重用的“masteractivity”!

【讨论】:

我知道这已经过时了,但与仅在 onCreate() 中实现超级字段实例化相比,这里有什么好处。无论如何,您都会从孩子那里调用 super.onCreate()。 因此,只需在启动 Activity 时将不同的值传递给捆绑或意图中的相同 KEY,从而使用相同的 Activity,您就可以根据收到的值确定在 Activity 中显示的内容。你选择建设者的具体原因是什么?或者保持 Activity 的不变部分通用,而对于其余的变化部分,您可以创建 Fragments。【参考方案4】:

当您的 Activity 将具有自定义参数或您想要跟踪从继承自的类的调用时,您需要重写构造函数。

【讨论】:

您能详细说明一下吗?你的描述听起来很有趣,但有点模糊。谢谢! 假设您需要创建一个自定义 Activity 类,该类需要 2 个或更多参数。你只需要使用构造函数,你不能通过 onCreate 和 extras 来做到这一点。有帮助吗? 我可能需要一个私人的。假设我想创建一个自定义组件,例如自定义联系人选择器。为了拥有startActivityForResult,我必须在我的自定义组件中包含一个私有构造函数,即使该活动永远不会启动并且没有可见元素,我也只使用它的结果内容。 我要说的是,@Pentium 对我来说没有意义,没有代码示例也是如此。 我认为通过构造函数做事的一个好处是有一个“模板”活动,它可以接受继承类可以利用的参数。例如,如果您有两个仅在某些属性上有所不同的活动,例如R.id.cameraSurface, R.id.videoSurface 然后您可以创建一个构造函数,该构造函数将接收一个名为 AbstractResourceActivity 的参数,然后您拥有在扩展 AbstractResourceActivity 传递资源 ID 的清单上注册的 CameraActivity。

以上是关于Android - 活动构造函数与 onCreate的主要内容,如果未能解决你的问题,请参考以下文章

Android---Activity

替换未调用 onAttach、onCreate、onCreateView 等的活动中的片段

在 onCreate() 之前,Android 系统服务不可用于活动 [关闭]

将项目更新到 android 10 后 onCreate 活动崩溃

Android - 在不同活动之间切换时保存当前的 onCreate 状态

如何使用 Android 缓存视图并避免每次都调用 onCreate