重新加载屏幕旋转数据

时间:2013-09-23 11:54:47

标签: android android-activity android-service

目前我正在开发一个Android应用程序,该应用程序使用登录活动,一旦用户登录,即成为主要活动。应用程序用户使用后台服务(IntentService)在用户登录时与服务器通信。然后,服务将获取的用户详细信息存储在数据库中,以便用户无需在每次启动时登录应用程序。

用户输入主活动后,活动将通过服务从服务器获取一些数据。然后在屏幕上以编程方式显示该数据。我认为这与(众所周知的)Wordfeud应用程序的工作方式非常相似。首先它会让你登录,然后它从服务器中取出正在播放的游戏,然后显示它们。

我的问题是,如果我旋转屏幕,主活动将被销毁并重新启动,从而导致再次调用oncreate()函数。在我目前的设计中,这意味着再次从服务器获取数据,这是非常不必要的。我只希望在用户关闭应用程序并在以后再次开始使用时再次获取数据。

我想知道解决这个问题的最佳方法是什么?简单的方法是禁止旋转屏幕,但在我看来这不是非常用户友好。另一种方法是在应用程序与服务器通信以登录用户时获取所有数据,并向屏幕添加重新加载/获取按钮,以便用户可以手动获取数据。这种方法的缺点是,如果用户在几小时后重新打开应用程序,则数据可能已过时。这也不是那么用户友好。

也许还有其他我不了解的问题的解决方案,比如在屏幕旋转时绕过(部分)oncreate()函数的能力等等。

我很好奇是否有解决方案,如果有,那会是什么!

6 个答案:

答案 0 :(得分:1)

看看Forcing Android to not redraw activity on orientation change。如果您需要在旋转时调整任何内容,可以覆盖Activity.onConfigurationChanged方法。

要在用户返回应用程序时重新获取数据,请覆盖onResume方法并将逻辑放在那里。熟悉Activity lifecycle

非常有用

答案 1 :(得分:1)

虽然上面给出的答案有效,但我一直觉得这更像是一个黑客。请查看Romain Guy在this SO link中的答案,了解如何处理此问题。这可能是一个更多的工作,但我肯定发现它比上述答案好得多。但请使用舒适的东西。

答案 2 :(得分:0)

尝试在android-manifest

中使用android:configChanges="orientation|keyboardHidden|screenSize"

警告:从Android 3.2(API级别13)开始,"屏幕大小"当设备在纵向和横向之间切换时也会发生变化。因此,如果您希望在开发API级别13或更高级别(由minSdkVersiontargetSdkVersion属性声明)时因方向更改而阻止运行时重新启动,则必须包含" screenSize&# 34;价值以及"方向"值。也就是说,你必须decalare android:configChanges =" orientation | screenSize" 。但是,如果您的应用程序的目标是API级别12或更低,那么您的活动始终会自行处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动您的活动。)

来源:Documentation

因此,如果您的应用程序针对 API 13及以上

,还要将" | screenSize" 添加到configChanges

答案 3 :(得分:-1)

旋转手机时,会再次调用活动的oncreate()。为了克服这个问题,在清单活动标记

中添加此行
android:configChanges="orientation"

然后在你的活动中改变onConfigurationChanged。然后运行你的app现在oncreate将在你调用onConfigurationChanged时旋转屏幕时不会被调用。

我认为这可以解决您的问题

答案 4 :(得分:-1)

您应该在清单中添加以下内容:

<activity android:name=".activity.YourActivity" android:configChanges="orientation"/>

然后在方向更改时,您的活动将不会重新启动 - 不会调用onCreate,但您可以使用方法onConfigurationChanged(Configuration newConfig)处理方向更改事件

答案 5 :(得分:-1)

尝试这种方式与我合作

<activity
        android:name="yourActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"/>