【问题标题】:Why when the new Android project is started in the Android Studio, there is no OnStart() after OnCreate() in the autogenerated code?为什么在 Android Studio 中启动新的 Android 项目时,自动生成的代码中 OnCreate() 之后没有 OnStart()?
【发布时间】:2017-09-19 03:42:21
【问题描述】:

为什么在 Android Studio 中启动新的 Android 项目时,在自动生成的代码中,在 OnCreate() 之后没有显式调用 OnStart(),虽然所有教程都说 OnCreate() 后面总是跟着 OnStart() ?另外,我在 AppCompatActivity 等基类中查找,在 OnCreate() 的实现中,也没有 OnStart() 的(显式或隐式)回调。需要明确的是,一切正常,我没有任何错误或问题,但我所看到的(在 OnCreate() 之后没有 OnStart() )与教程所说的似乎存在矛盾。谁能澄清一下?

Official Android reference site

package mypack.helloandroid;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MyActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_layout);
    }
}

【问题讨论】:

  • “OnCreate() 之后没有OnStart()”是什么意思?这些方法不是直接链接的,因此您不会发现任何代码一个接一个地显式调用。
  • 这些是来自 Activity 生命周期的“回调”。除非你想修改 super 的行为,否则它们不需要显式地重新定义。

标签: android android-studio android-activity oncreate onstart


【解决方案1】:

LifeCycle 回调方法由系统 (Framework) 中的 ActivityManager 为 Activity 调用。 因此,您不会在 Activity 代码中看到对这些方法的任何直接调用。

这些生命周期方法在需要时被调用。像onCreate 这样的 Activity 实例被框架新创建时会被调用。

但onStart 将在 Activity 对用户可见时被调用。

【讨论】:

  • 基本上,ActivityManager 会调用类中定义和/或实现的所有内容吗?
  • @ufulol ActivityManager 将负责在需要时调用 Activity 上的所有 LifeCycle 回调。就像 Activity 的 Focus 熄灭时,它会调用 onPause 等。
  • @ufulol 所以根据我们的逻辑以及何时执行这些逻辑,我们必须小心地将代码放在每个生命周期方法中
  • 那为什么我的例子中自动生成的代码会覆盖OnCreate(),是否可以不覆盖呢?
  • @ufulol 即使框架在创建活动时在内部调用 onCreate 方法,它也不会在活动上呈现任何 UI,因为您必须在创建活动时编写 UI 呈现逻辑,为此你应该重写 oncreate 方法并把你的逻辑
【解决方案2】:

onStart() 由系统调用。 您不必调用它。

如果您想要一些自定义行为, 您可以覆盖 onStart()

@覆盖 受保护的无效 onStart() { ... }

【讨论】:

  • 但是如果是系统调用的话,是不是说这个调用应该在MyActivity的超类的方法中,或者在OnCreate()或者SetContentView()的实现中呢?
  • 我相信超类有它。所以你可以覆盖它。
【解决方案3】:

onStart() 不如onCreate() 常用。如果你有理由实现onStart(),你可以自己添加。我相信onStart()的默认实现在Activity。

在 Android 中,我们不会像在“典型”Java 应用程序中那样编写 main() 方法。相反,我们在生命周期回调中编写代码。这些是我们应用程序的入口点。 Android 系统根据文档中描述的约定调用这些回调。

【讨论】:

  • 实现在那里,但没有调用它
  • @ufulol 如果您想查看生命周期回调的调用顺序,您可以覆盖它们中的每一个并添加Log.d() 语句。只需记录一些相关消息,然后查看 logcat。
  • 通常,在Java代码中有一个类的可执行体,所有被执行的东西都放在这里
  • @ufulol 你的意思是典型Java应用程序的main()方法吗?
【解决方案4】:

这是Java 中的继承 的问题。查看您在 Android 中拥有的 Activity 类的类声明 - 它正在扩展其他一些类,如 AppActivityCompat 或其他基 Activity 类。

因此,当您的代码运行时 - 您的活动的 超类 内的所有内容(所有方法)都会被执行。其中有很多,包括所有的生命周期方法,例如 onCreate()、onStart()、onResume() 等。

如果您需要在方法中执行某些特定操作,您可以在子类(即 MainActivity)中覆盖它,而被覆盖方法中的代码将运行而不是超类中的方法。 p>

更多信息请阅读官方文档:

https://developer.android.com/guide/components/activities/activity-lifecycle.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多