android - 安卓旋转屏幕时Activity重新启动

  显示原文与译文双语对照的内容

当我在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,因此 Activity的重新启动或者键盘可见性更改不会触发它。

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

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


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

对配置更改的响应

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

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


android:configChanges="keyboardHidden|orientation"

或者对于 3.2 ( API级别 13 ) 和更新版本的:


android:configChanges="keyboardHidden|orientation|screenSize"

然后在 Activity 覆盖 onConfigurationChanged 方法并调用 setContentView 以强制在新方向中使用re-done布局。


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

Android 3.2和更高版本的更新:

谨慎:从android 3.2 ( API级别 13 ),"屏幕大小"也改变当设备开关在横向和纵向之间。 因此,如果你想防止运行时重新启动时由于取向变化开发api( 由minSdkVersion和targetSdkVersion属性声明) 13或更高级别,你必须包括 "screenSize" 价值除了 "orientation" 价值。 也就是说,你必须声明 android:configChanges="orientation|screenSize" 但是,如果你的应用程序目标是 12或者更低的API,那么你的Activity 总是处理这个配置更改本身( 这里配置更改不会重新启动你的Activity,即使在 Android 3.2或者更高的设备上运行) 。

我所做的。。

在清单中,向 Activity 部分添加了:


android:configChanges="keyboardHidden|orientation"

在 Activity的代码中,实现了:


//used in onCreate() and onConfigurationChanged() to set up the UI elements
public void InitializeUI()
{
//get views from ID's
 this.textViewHeaderMainMessage = (TextView) this.findViewById(R.id.TextViewHeaderMainMessage);

//etc... hook up click listeners, whatever you need from the Views
}

//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);

 InitializeUI();
}

//this is called when the screen rotates.
//(onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
 super.onConfigurationChanged(newConfig);
 setContentView(R.layout.main);

 InitializeUI();
}

不要试图阻止 onCreate() 被完全激发,也许试着检查传递到事件中的BundlesavedInstanceState,看看它是不是空的。

例如,如果我有一些逻辑应该运行 Activity 时真正的创造,不是每个取向改变,我只运行的逻辑 onCreate() 只有在 savedInstanceState null。

否则,我仍然希望布局能够正确重画。


public void onCreate(Bundle savedInstanceState) {

 super.onCreate(savedInstanceState);

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

 setContentView(R.layout.activity_game_list);
}

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

你所描述的是默认行为。 你必须通过添加以下内容来检测并处理这些事件:


android:configChanges

到你的清单以及你想要处理的更改。 对于方向,你可以使用:


android:configChanges="orientation"

对于正在打开或者关闭的键盘,你可以使用:


android:configChanges="keyboardHidden"

如果你想处理这两个命令,就可以用管道命令将它们分开,比如:


android:configChanges="keyboardHidden|orientation"

这将触发onConfigurationChanged方法无论 Activity 你的呼唤。 如果你重写了方法,你可以传入新值。

希望这有帮助

我刚刚发现了这个传说:

保持 Activity 活着通过取向变化和处理通过 onConfigurationChanged上述代码示例文档 file: 建议的清单


android:configChanges="keyboardHidden|orientation"

它有额外的好处,它总是可以工作。

额外的知识是省略 keyboardHidden 看起来可能是逻辑上的,但它会导致 模拟器 ( 对于 Android 2.1,至少) 出现故障: 只指定 orientation 将使 模拟器 同时调用 OnCreateonConfigurationChanged,并且只在 OnCreate 下。

我还没有看到设备上的故障,但我听说过 模拟器 失败。 所以值得记录。

你也可以考虑使用Android的平台来跨方向更改数据: onRetainNonConfigurationInstance()getLastNonConfigurationInstance()

这允许你在配置更改持久化数据,比如信息你可能已经从服务器获取或别的以来 onCreate 或计算,同时也允许androidre-layout你 Activity 取向在使用xml文件使用。

在这里看到 ,这里是或者

应该注意的是,这些方法现在弃用( 虽然比处理取向更灵活改变自己是最上面的解决方案建议) 建议每个人 switch Fragments 而使用 setRetainInstance(true)Fragment 你想保留。

我只是添加了


 android:configChanges="keyboard|keyboardHidden|orientation"

在清单文件和没有添加onConfigurationChanged Activity 方法。

所以每次键盘滑出或者不发生时,

...