Android: поворот экрана, уничтожить и загадка услуг - PullRequest
2 голосов
/ 08 февраля 2012

Я изменил пример чата Bluetooth из демоверсий SDK, чтобы иметь возможность управлять светодиодной матрицей с питанием от Arduino. Используя программу чата, я могу отправлять сообщения на дисплей через Bluetooth. У меня проблема, хотя. Я сделал две компоновки экрана, портрет и пейзаж. Таким образом, интерфейс может занимать как можно больше места на телефоне независимо от ориентации.

Проблема в том, что если телефон поворачивается, вызывается OnDestroy (), чтобы перезагрузить новый макет (альбомную или книжную). В процедуре OnDestroy () я также уничтожаю ссылку bluetooth, если она установлена:

   public void onDestroy() {
        super.onDestroy();
        // Stop the Bluetooth chat services
        if (mChatService != null)
            mChatService.stop();
        if (D)
            Log.e(TAG, "--- ON DESTROY ---");
    }

Читая другие посты здесь, я обнаружил, что вы можете предотвратить остановку сервиса, добавив "android: configChanges =" Ориентация "" в манифест. При этом, когда я поворачиваю экран, моя связь Bluetooth с дисплеем больше не прерывается, однако теперь экран не перерисовывается в альбомном режиме.

Чтобы исправить это, я думаю об удалении раздела «if mchatservice ...», который завершает соединение, но тогда мне все равно понадобится код для запуска при окончательном завершении приложения.

Есть ли способ перерисовать экран при повороте, не прерывая соединение? Если нет, я думаю, что я всегда могу переместить служебный код в событие OnPause (), однако это приведет к разрыву соединения, если приложение когда-либо потеряет фокус на землю.

Есть ли другие способы?

Спасибо.

Ответы [ 3 ]

9 голосов
/ 08 февраля 2012

Если вы добавите «android: configChanges =« direction »» в свой манифест, чтобы предотвратить разрушение и повторное создание действия, вы можете захотеть реализовать метод:

public void onConfigurationChanged(Configuration newConfig)

Этот метод выполняется каждый раз при изменении конфигурации системы, т. Е. При повороте телефона и изменении ориентации. Внутри этого метода вы можете повторно применить новый макет для вашей деятельности:

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Log.e(TAG, "ORIENTATION_LANDSCAPE");
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Log.e(TAG, "ORIENTATION_PORTRAIT");
    }
}
0 голосов
/ 14 сентября 2015

Рекомендованный способ сделать это состоит в том, чтобы TaskFragment обрабатывал вашу логику, а затем некоторые обратные вызовы вашей активности для синхронизации с вашим пользовательским интерфейсом.

Более подробное объяснение см. На следующем сайте: http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

0 голосов
/ 14 сентября 2015

, чтобы добавить к @ alex.veprix точный (и правильный, я должен упомянуть) ответ: если вы создаете устройства с API уровня 13 или выше, не забудьте добавить атрибут ScreenSize следующим образом: android:configChanges="orientation|screenSize"

Подробности здесь: http://developer.android.com/guide/topics/manifest/activity-element.html

...