在我的 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
仅在创建整个应用程序时调用,因此活动重新启动方向或键盘可见性更改将不会触发它。
最好将此类的实例公开为单例,并使用 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();
}
}
不确定这是否是最终的答案,但它对我有用。