首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环启动活动,Android

循环启动活动,Android
EN

Stack Overflow用户
提问于 2009-01-19 00:28:29
回答 33查看 405K关注 0票数 1.5K

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

  1. 将所有初始设置放在另一个函数中,这样就不会在设备旋转或
  2. 使其不再调用onCreate,并且布局只是调整或
  3. 限制应用程序仅仅是肖像,这样onCreate就不会被调用。
EN

回答 33

Stack Overflow用户

回答已采纳

发布于 2009-01-19 08:47:59

使用应用程序类

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

代码语言:javascript
运行
复制
public class MyApplicationClass extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // TODO Put your application initialization code here.
  }
}

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

很好的做法是将该类的实例公开为单例,并公开使用getters和setter初始化的应用程序变量。

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

代码语言:javascript
运行
复制
<application
    android:name="com.you.yourapp.MyApplicationClass"

响应配置更改的() [UPDATE:这是从API 13;http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html中删除的]

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

从将android:configChanges节点添加到活动的清单节点开始

代码语言:javascript
运行
复制
 <activity android:name=".MyActivity"
      android:configChanges="orientation|keyboardHidden"
      android:label="@string/app_name">

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

代码语言:javascript
运行
复制
<activity android:name=".MyActivity"
      android:configChanges="keyboardHidden|orientation|screenSize"
      android:label="@string/app_name">

然后,在活动中重写onConfigurationChanged方法,并调用setContentView强制在新的方向上重新执行GUI布局。

代码语言:javascript
运行
复制
@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.myLayout);
}
票数 994
EN

Stack Overflow用户

发布于 2012-03-03 21:56:40

Android 3.2及更高版本的更新:

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

来自http://web.archive.org/web/20120805085007/http://developer.android.com/guide/topics/resources/runtime-changes.html

票数 191
EN

Stack Overflow用户

发布于 2012-08-04 21:04:23

与其试图完全阻止onCreate()被触发,不如尝试检查传递到事件中的Bundle savedInstanceState,看看它是否为空。

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

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

代码语言:javascript
运行
复制
public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

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

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

票数 137
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/456211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档