活动在Android上重新启动

在我的Android应用程序中,当我旋转设备(滑出键盘)时,我的Activity被重新启动(调用onCreate )。 现在,这可能应该是这样,但我在onCreate方法中做了很多初始设置,所以我需要:

  • 将所有初始设置放在另一个功能中,以便它不会在设备旋转或丢失时丢失
  • 使它这样onCreate不再调用和布局只是调整或
  • 将应用限制在肖像内,以免onCreate被调用。

  • 使用应用程序类

    根据您在初始化时所做的操作,您可以考虑创建一个新的类来扩展Application并将您的初始化代码移动到该类中的重写onCreate方法中。

    public class MyApplicationClass extends Application {
      @Override
      public void onCreate() {
        super.onCreate();
        // TODO Put your application initialization code here.
      }
    }
    

    应用程序类中的onCreate仅在创建整个应用程序时调用,所以Activity重新定向或键盘可见性更改不会触发它。

    将此类的实例作为单例公开并使用getter和setter公开您正在初始化的应用程序变量是一种很好的做法。

    注意:您需要在清单中指定新的Application类的名称以便注册和使用它:

    <application
        android:name="com.you.yourapp.MyApplicationClass"
    

    对配置更改作出反应 [更新:自API 13起已弃用; 看到推荐的替代方案]

    作为另一种选择,您可以让应用程序监听会导致重新启动的事件(如方向和键盘可见性更改),并在您的活动中处理它们。

    首先将android:configChanges节点添加到Activity的清单节点

    android:configChanges="keyboardHidden|orientation"
    

    或Android 3.2(API级别13)和更新版本:

    android:configChanges="keyboardHidden|orientation|screenSize"
    

    然后在Activity中覆盖onConfigurationChanged方法并调用setContentView来强制GUI布局在新的方向上重新完成。

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
      super.onConfigurationChanged(newConfig);
      setContentView(R.layout.myLayout);
    }
    

    Android 3.2及更高版本的更新:

    警告 :从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时, “屏幕大小”也会发生变化 。 因此,如果要在开发API级别13或更高级别时(由minSdkVersion和targetSdkVersion属性声明)防止由于方向更改导致运行时重新启动,则除"orientation"值外,还必须包含"screenSize" "orientation"值。 也就是说,你必须声明android:configChanges="orientation|screenSize" 。 但是,如果您的应用程序的目标级别为12或更低,则您的活动始终会自行处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动您的活动)。


    不要试图阻止onCreate()完全被触发,也许尝试检查传递给事件的Bundle savedInstanceState以查看它是否为null。

    例如,如果我在创建Activity时应该运行一些逻辑,而不是在每个方向更改上运行,那么只有当savedInstanceState为null时,才会在onCreate()运行该逻辑。

    否则,我仍然希望布局正确重绘方向。

    public void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_game_list);
    
            if(savedInstanceState == null){
                setupCloudMessaging();
            }
    }
    

    不知道这是否是最终的答案,但它适用于我。

    链接地址: http://www.djcxy.com/p/4211.html

    上一篇: Activity restart on rotation Android

    下一篇: ID on ARC (Chrome) differ from Android?