协慌网

登录 贡献 社区

在 Android 上旋转活动重启

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

  1. 将所有初始设置放在另一个功能中,这样就不会在设备旋转时丢失所有功能
  2. 如此onCreate不再被调用,布局只是调整或
  3. 将应用限制为仅限肖像,以便不调用onCreate

答案

使用应用程序类

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

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

应用程序类中的onCreate仅在创建整个应用程序时调用,因此活动重新启动方向或键盘可见性更改将不会触发它。

最好将此类的实例公开为单例,并使用 getter 和 setter 公开正在初始化的应用程序变量。

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

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

对配置更改做出反应 [更新:自 API 13 以来不推荐使用此功能; 看推荐替代 ]

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

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

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" 。但是,如果您的应用程序的目标是 API 级别 12 或更低,那么您的活动始终会自行处理此配置更改(即使在 Android 3.2 或更高版本的设备上运行,此配置更改也不会重新启动您的活动)。

可以尝试检查传入事件的Bundle savedInstanceState以查看它是否为 null,而不是试图阻止onCreate()被完全触发。

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

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

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

        if(savedInstanceState == null){
            setupCloudMessaging();
        }
}

不确定这是否是最终的答案,但它对我有用。