【问题标题】:Why do OnCreate should be called only once on the start of Activity?为什么 OnCreate 应该在 Activity 开始时只调用一次?
【发布时间】:2012-12-20 03:40:17
【问题描述】:

我想知道,为什么OnCreate() 在活动开始时只被调用一次?

我们可以在同一个活动中多次调用OnCreate()吗?

如果是,那我们怎么称呼它?谁能举个例子?

非常感谢!!!

【问题讨论】:

  • 我觉得你可以手动调用onCreate
  • @nick,我们怎么称呼l..你能简单解释一下吗?
  • 我刚试过。生病发布示例代码。但请告诉我们您为什么要这样做。
  • 出于线程目的,我只想再次调用该方法

标签: android android-activity oncreate android-lifecycle


【解决方案1】:

为什么要再次调用它?除非活动被重建,由系统调用。您不能手动调用 OnCreate ,这与您不会调用 setContentView() 两次的原因相同。作为文档:

onCreate(Bundle) 是您初始化活动的地方。最多 重要的是,在这里你通常会调用 setContentView(int) 定义您的 UI 的布局资源,并使用 findViewById(int) 来 在该 UI 中检索您需要与之交互的小部件 以编程方式。 一旦你完成了你的小部件的初始化,你为什么要这样做?

更新 我收回一些话,您可以手动执行此操作,但我仍然不明白为什么要调用它。你试过Fragments 吗?
示例代码:

public class MainActivity extends Activity implements OnClickListener {
        private Button btPost;
        private Bundle state;
        private int counter = 0;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            state = savedInstanceState;
            btPost = (Button) findViewById(R.id.btPost);
            btPost.setOnClickListener(this);
            Toast.makeText(getBaseContext(), " " + counter, Toast.LENGTH_LONG)
                    .show();
        }

        @Override
        public void onClick(View v) {
            counter++;
            this.onCreate(state);
        }
    }

【讨论】:

    【解决方案2】:

    onCreate() 方法执行基本的应用程序启动逻辑,在 Activity 的整个生命周期中应该只发生一次。 一旦 onCreate() 完成执行,系统会快速连续调用 onStart()onResume() 方法。

    初始化过程consumes lot of resources为了避免这种情况,一旦创建的活动永远不会完全销毁,但在后台对用户不可见,因此一旦将其带回前台,重新初始化就不会发生。

    【讨论】:

      【解决方案3】:

      您要手动调用 onCreate 的位置。

      那就这样做吧。

          finish();
          Intent intent = new Intent(Main.this, Main.class);
          startActivity(intent);
      

      finish() 调用当前的东西。

      如果您在此活动中执行 getExtra 操作,请执行此操作,

      @Override
          protected void onSaveInstanceState(Bundle outState) {
      
                  outState.putString("key",your_variable);
              super.onSaveInstanceState(outState);
      
          }
      

      并将其添加到您的 onCreate()

      protected void onCreate(Bundle savedInstanceState) {
              // TODO Auto-generated method stub
              super.onCreate(savedInstanceState);
      if(savedInstanceState != null)
              {
                  your_variable= savedInstanceState.getString("key"); 
              }
      }
      

      【讨论】:

        【解决方案4】:

        您为什么要多次致电onCreate?您将重新创建活动。如果这是您出于某种原因需要的内容,请完成活动并使用intent 创建该活动的新实例。否则,您将同时拥有该活动的两个实例。希望这会有所帮助,但如果这没有意义,请添加更多关于您想要什么的信息,以便我们了解上下文

        【讨论】:

          【解决方案5】:

          OnCreate 基本上用于创建您的活动 (UI)。如果您已经创建了 Activity,则无需像已经创建的那样再次创建它。

          它主要用于初始化您的活动并创建活动的用户界面。 Activity 是一个视觉部分,您可以一次又一次地使用它。我认为您的问题不是重新创建活动,而是重新初始化活动的所有组件。为此,您可以创建一个方法 initialize_act() 并从任何地方调用它...

          【讨论】:

            【解决方案6】:

            @OnCreate 仅用于初始创建,因此只能调用一次。

            如果您希望多次完成任何处理,则应将其放在其他地方,也许在 @OnResume 方法中。

            【讨论】:

              【解决方案7】:

              最近我意识到每次屏幕方向更改(横向/纵向)都会调用 onCreate。在规划初始化过程时,您应该意识到这一点。 可以在 AndroidManifest.xml 中抑制娱乐:

              <activity
                          android:configChanges="keyboardHidden|orientation"
                          android:name=".testActivity"
                          android:label="@string/app_name"></activity>
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-07-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多