2013-09-23 3 views
1

В настоящее время я разрабатываю приложение для Android, которое использует активность входа и как только пользователь вошел в систему, является основным видом деятельности. Пользователям приложения предоставляется фоновая служба (IntentService) для связи с сервером во время входа пользователя. Затем служба сохраняет загруженные данные пользователя в базе данных, так что пользователю не нужно входить в систему каждый раз, когда он запускает приложение.Перезагрузка данных на экране вращения

После того, как пользователь входит в основное действие, он извлекает некоторые данные через службу с сервера. Затем эти данные отображаются (программно) на экране. Я думаю, что это вполне сопоставимо с тем, как работает приложение (хорошо известное) Wordfeud. Сначала он регистрирует вас, затем он извлекает игры, которые вы играете с сервера, а затем отображает их.

Моя проблема в том, что если я поверну свой экран, основное действие будет уничтожено и перезапущено, что вызовет функцию oncreate(). В моем текущем проекте это означает, что данные снова извлекаются с сервера, что совершенно необязательно. Я хочу, чтобы данные снова были загружены, если пользователь закрыл приложение и снова начнет использовать его позже.

Мне интересно, что было бы лучше всего исправить это? Простым способом было бы запретить поворот экрана, но, на мой взгляд, это не очень удобно. Другим способом было бы получить все данные, пока приложение связывается с сервером для входа в систему пользователя, и добавьте кнопку перезагрузки/выборки на экран, чтобы пользователь мог получать данные вручную. Недостатком этого подхода было бы то, что если пользователь снова откроет приложение через несколько часов, данные будут/могут быть устаревшими. Это не так удобно.

Возможно, есть другие решения этой проблемы, о которых я не знаю, как о возможности обхода (частей) функции oncreate(), когда экран вращается или что-то в этом роде.

Мне очень любопытно, есть ли решение для этого, и если да, то каким бы оно было!

+0

Возможный дубликат [Активность перезагрузки при ротации Android] (http://stackoverflow.com/questions/456211/activity-restart-on-rotation-android) –

ответ

-1

Попробуйте этот способ работать со мной

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

Использование android: configChanges звучит как хороший вариант, хотя в руководстве API Android указано, что _ «Этот метод следует рассматривать как последнее средство, когда вы должны избегать перезапуска из-за изменения конфигурации и не рекомендуется для большинства приложений». _ Source: [ссылка] (http://developer.android.com/guide/topics/resources/runtime-changes.html). Если я использую configChanges, значит ли это, что мне нужно реализовать много дополнительного кода, или я должен оставить onConfigurationChanged() пустым, так как мне не нужно ничего перерисовывать? – Koningh

+1

НЕТ дополнительной необходимости кода. Этот параметр не перезагружает активность, просто обновляя views.onConfigurationChanged() не является обязательным для переопределения –

+0

Просто попробовал, и он работает! Никакой дополнительный код не нужен. Я использовал пример onConfigurationChanged в API API Android, чтобы проверить, как он работает, но мое приложение по-прежнему ведет себя нормально после удаления переопределенной функции. Благодаря! – Koningh

1

Посмотрите на Forcing Android to not redraw activity on orientation change. Если вам нужно что-то настроить при вращении, вы можете переопределить метод Activity.onConfigurationChanged.

Чтобы восстановить данные, когда пользователь возвращается в приложение, переопределите метод onResume и поместите туда свою логику. Очень полезно познакомиться с Activity lifecycle.

+0

Да! Я заметил аккуратный график потока жизненного цикла активности, когда искал причину, по которой мой код повторно выполнялся при изменении ориентации. Поэтому, глядя на график, OnResume() также вызывается, если изменяется поворот экрана. Разве это не произойдет, даже если я буду использовать android: configChanges? – Koningh

-1

При повороте телефона функция oncreate() снова вызывается. Симметричные преодолеть эту проблему добавить эту строку в очевидном теге активности

android:configChanges="orientation" 

потом ovverride onConfigurationChanged в вашей деятельности. Затем запустите приложение, и теперь он будет вызываться, когда вы поворачиваете экран, где будет вызываться onConfigurationChanged.

Я думаю, что это может решить вашу проблему

-1

Вы должны добавить к вашему манифеста что-то вроде этого:

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

Затем на ориентировки изменить вашу деятельность не будет перезапущен - OnCreate не будет называться , но вы можете обрабатывать событие изменения ориентации, используя метод onConfigurationChanged(Configuration newConfig)

0

Попробуйте использовать android:configChanges="orientation|keyboardHidden|screenSize" в Android-манифеста

Внимание: Начиная с Android 3.2 (уровень API-13), «размер экрана», также изменяется, когда устройство переключается между портретной и альбомной ориентации. Таким образом, если вы хотите предотвратить перезагрузку во время изменения ориентации при разработке для уровня API 13 или выше (в соответствии с атрибутами minSdkVersion и targetSdkVersion), вы должны включить значение «screenSize» в дополнение к значению «ориентация». То есть, вы должны decalare android: configChanges = "orientation | screenSize". Однако, если ваше приложение нацелено на уровень API 12 или ниже, ваша деятельность всегда обрабатывает это изменение самой конфигурации (это изменение конфигурации не перезапускает вашу активность даже при работе на устройстве Android 3.2 или выше).

Источник: Documentation

Следовательно, добавить «| Размер экрана» к configChanges, если ваши цели применения API 13 и выше

1

Ну хотя ответы, приведенные выше работы, но я всегда чувствовал, что это чтобы быть более взломанным. Пожалуйста, посмотрите на ответ Ромен Гай в this SO link, чтобы понять, как с этим справиться. Это может быть немного больше работы, но я определенно нахожу его намного лучше, чем приведенные выше ответы. Однако, пожалуйста, используйте то, что вам удобно.

Смежные вопросы