【问题标题】:Why life cycle activtity methods are not called when android:configChanges="orientation|screenSize" is in manifest file为什么当 android:configChanges="orientation|screenSize" 在清单文件中时不调用生命周期活动方法
【发布时间】:2015-07-01 14:33:56
【问题描述】:

我在MainActivity 中覆盖了onStart()onResume()onStop()onPause() 方法。我正在使用log.d() 命令来监控这些方法何时被调用。

当我在清单中使用android:configChanges="orientation|screenSize" 时,不会调用我的重写方法。为什么会这样?

【问题讨论】:

    标签: android android-manifest android-lifecycle android-configchanges onstart


    【解决方案1】:

    有两种方法可以处理运行时更改。

    1. Retain an object during a configuration change
    2. Handle the configuration change yourself
    

    1.在配置更改期间保留对象

    如果您在配置更改期间保留一个对象,Android 将重新启动正在运行的 Activity 并调用 onDestroy(),然后调用 onCreate(),然后从那里调用所有其他对象:onStart()onResume()onStop()onPause()

    但如果你想自己处理配置,第二种方式:

    2。自行处理配置变更

    如果您的应用程序在特定配置更改期间不需要更新资源并且您有性能限制要求您避免重新启动活动,那么您可以声明您的活动自己处理配置更改,这可以防止系统不会重新启动您的活动。

    当您在清单 android:configChanges 属性中包含一个代表您要处理的配置的值时,就会发生这种情况。

    例如:

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

    现在,当这些配置之一发生变化时,MyActivity 不会 重启。相反,MyActivity 收到一个调用 onConfigurationChanged()。这个方法被传递了一个配置 指定新设备配置的对象

    例如,以下 onConfigurationChanged() 实现检查当前设备方向:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        }
    }
    

    更多信息可以继续阅读Android Developers

    【讨论】:

      【解决方案2】:

      这是因为清单中的android:configChanges="orientation|screenSize" 指示不要在方向或屏幕尺寸更改时重新创建活动。

      如果您需要对方向更改进行某些操作,您可以覆盖活动的 onConfigurationChanged 方法。

      @Override
      public void onConfigurationChanged(Configuration newConfig)
      {
          super.onConfigurationChanged(newConfig);
      }
      

      如果您确实希望重新启动有关方向和屏幕尺寸更改的活动,则必须从清单中删除 android:configChanges="orientation|screenSize"


      摘自manifest activity element

      android:configChanges
      

      列出活动将自行处理的配置更改。当运行时发生配置更改时,默认情况下会关闭并重新启动 Activity,但使用该属性声明配置会阻止 Activity 重新启动。相反,Activity 保持运行并调用其onConfigurationChanged() 方法。

      【讨论】:

        猜你喜欢
        • 2013-05-01
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        • 2016-09-13
        • 1970-01-01
        • 1970-01-01
        • 2015-05-12
        • 2013-07-25
        相关资源
        最近更新 更多