Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 293
#1

Ориентация экрана конфликтует с onPause() - Программирование Android

24.07.2012, 21:10. Просмотров 1442. Ответов 16
Метки нет (Все метки)

Здравствуйте. В своем проекте я использую класс GameView (extends SurfaceView implements Runnable) и загружаю его в onCreate через setContentView(new GameView(this));.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
 
public class Main extends Activity {
    /** Called when the activity is first created. */
   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // если хотим, чтобы приложение постоянно имело портретную ориентацию
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
 
        // если хотим, чтобы приложение было полноэкранным
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
 
        // и без заголовка
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        
        setContentView(new GameView(this));
    }
  
}
Все работает нормально, но если добавить снизу признак хорошего тона

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Main extends Activity {
    /** Called when the activity is first created. */
   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // если хотим, чтобы приложение постоянно имело портретную ориентацию
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
 
        // если хотим, чтобы приложение было полноэкранным
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
 
        // и без заголовка
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        
        setContentView(new GameView(this));
    }
 
 
//                  от сюда
    @Override
    public void onPause() {
        // Это то что происходит когда активити уходит на паузу
        // например когда нажали кнопку хоум 
        super.onPause(); 
        
        // просто завершаем приложение. 
        // нечего ему висеть в воздухе. 
        System.runFinalizersOnExit(true);
        System.exit(0);
    }
}
То приложение запускается только в горизонтальном положение экрана, а в вертикальном долго думает и вылетает. Подскажите пожалуйста , почему так происходит и как можно иначе закрывать приложение без косяков?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.07.2012, 23:16     Ориентация экрана конфликтует с onPause() #2
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Java
1
2
3
4
5
6
7
8
9
10
11
@Override
    public void onPause() {
        // Это то что происходит когда активити уходит на паузу
        // например когда нажали кнопку хоум 
        super.onPause(); 
        
        // просто завершаем приложение. 
        // нечего ему висеть в воздухе. 
        System.runFinalizersOnExit(true);
        System.exit(0);
    }
Это что за изврат такой?

Добавлено через 29 минут
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
вылетает
Оно не вылетает, ты сам его закрываешь вот этим - "System.exit(0);"

Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
можно иначе закрывать приложение без косяков
а в чем косяк? закрылось нормально. только зачем его закрывать в onPause?

Добавлено через 9 минут
кстати, оно закрывает только активити в котором вызвано, ну а активити обычно методом finish.

Добавлено через 22 минуты
кстати System.exit(0); прерывает жизненный цикл активити, а runFinalizersOnExit устаревший метод.
о каком таком хорошем тоне идет речь?
@gent
16 / 16 / 1
Регистрация: 19.10.2009
Сообщений: 91
25.07.2012, 00:03     Ориентация экрана конфликтует с onPause() #3
Ко всему сказанному от пользователя V0v1k, добавлю что super.onPause() и подобные, отвечающие за завершение чего-либо, вызываются в конце кода.
И еще замечу, что в этом методе не стоит его убивать, ибо для чего? В onDestroy() это делается. У андроида с выгрузкой устаревших активностей всё в порядке. Так что пусть лучше оно висит в памяти, нежели потом будет заново создаваться. Единственный момент, в onPause обычно отключают различного рода ресиверы и слушатели, также GPS и т.д.
А вообще советую почитать книгу Рето Майера - Android 2, а также посмотреть уроки вот тут
http://startandroid.ru/uroki/vse-uroki-spiskom.html
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.07.2012, 00:15     Ориентация экрана конфликтует с onPause() #4
Цитата Сообщение от @gent Посмотреть сообщение
В onDestroy() это делается.
Само делается. Не нужно ничего вызывать там.
@gent
16 / 16 / 1
Регистрация: 19.10.2009
Сообщений: 91
25.07.2012, 01:11     Ориентация экрана конфликтует с onPause() #5
Ну я имел ввиду что в onDestroy() это по дефолту делается =) А вызывать всё таки нужно super.onDestroy(); =)
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.07.2012, 01:20     Ориентация экрана конфликтует с onPause() #6
можно просто не переопределять этот метод)
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 293
26.07.2012, 08:22  [ТС]     Ориентация экрана конфликтует с onPause() #7
Цитата Сообщение от V0v1k Посмотреть сообщение
Оно не вылетает, ты сам его закрываешь вот этим - "System.exit(0);"
А почему тогда оно в горизонтальном положение экрана не закрывается при запуске ?
Дело в том ,что если не закрывать, то при нажатие на кнопке "назад" или "хоум" музыка не останавливается (да и все остальный просчеты по видимому работают в фоновом режиме - не знаю). Можно конечно попытаться из класса GameView вызвать track.stop(); но хотелось бы все грамотнее сделать. Вот я и думаю как это лучше сделать.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.07.2012, 10:58     Ориентация экрана конфликтует с onPause() #8
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
А почему тогда оно в горизонтальном положение экрана не закрывается при запуске ?
При смене ориентации вызывается onPause, onStop, onDestroy, onCreate, onStart, onResume.
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
"назад" или "хоум" музыка не останавливается
а System.exit останавливает?

Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Можно конечно попытаться из класса GameView вызвать track.stop(); но хотелось бы все грамотнее сделать.
вот это и есть грамотно вызывать в onPause что-то вроде track.stop() или там track.pause(), а в onResume, track.resume()
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 293
26.07.2012, 14:42  [ТС]     Ориентация экрана конфликтует с onPause() #9
Цитата Сообщение от V0v1k Посмотреть сообщение
вот это и есть грамотно вызывать в onPause что-то вроде track.stop() или там track.pause(), а в onResume, track.resume()
Не получается у меня почему то вызвать не один из методов GameView - пишет Закрыть принудительно
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.media.MediaPlayer;
 
public class Main extends Activity {
    /** Called when the activity is first created. */
    private GameView musicn;
     private MediaPlayer track2;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // если хотим, чтобы приложение постоянно имело портретную ориентацию
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
 
        // если хотим, чтобы приложение было полноэкранным
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
 
        // и без заголовка
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        
        setContentView(new GameView(this));
    }
    @Override
    public void onStart() {
        super.onStart();
        musicn.Musicnstartn();
    }
    @Override
    public void onResume() {
        super.onResume();
        
 //       musicn.Musicnstartn();
    }
  @Override
  public void onPause() {
    // Это то что происходит когда активити уходит на паузу
    // например когда нажали кнопку хоум 
      super.onPause();
    //  track2.release();
      musicn.Musicnpausen(); 
//      // просто завершаем приложение. 
//      // нечего ему висеть в воздухе. 
//      System.runFinalizersOnExit(true);
 //     System.exit(0);
  }
}
Вложения
Тип файла: zip onpase.zip (818.2 Кб, 8 просмотров)
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.07.2012, 15:10     Ориентация экрана конфликтует с onPause() #10
ну, смотрите логи...
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 293
26.07.2012, 16:22  [ТС]     Ориентация экрана конфликтует с onPause() #11
Цитата Сообщение от V0v1k Посмотреть сообщение
Это что за изврат такой?
Можно еще больше извратится и сделать так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.media.MediaPlayer;
 
public class Main extends Activity {
    /** Called when the activity is first created. */
    private GameView musicn;
     private MediaPlayer track2;
     long musictimeonpausen;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // если хотим, чтобы приложение постоянно имело портретную ориентацию
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
 
        // если хотим, чтобы приложение было полноэкранным
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
 
        // и без заголовка
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        musictimeonpausen = System.currentTimeMillis();
        setContentView(new GameView(this));
    }
    @Override
    public void onStart() {
        super.onStart();
//        musicn.Musicnstartn();
    }
    @Override
    public void onResume() {
        super.onResume();
        
 //       musicn.Musicnstartn();
    }
  @Override
  public void onPause() {
    // Это то что происходит когда активити уходит на паузу
    // например когда нажали кнопку хоум 
      super.onPause();
    //  track2.release();
//    musicn.Musicnpausen(); 
//      // просто завершаем приложение. 
//      // нечего ему висеть в воздухе. 
      if (System.currentTimeMillis()-musictimeonpausen>15555){
    System.runFinalizersOnExit(true);
    System.exit(0);
      }
  }
}
тогда все коряво, но работает и при нажатие на кнопку хоум музыка перестает играть. Только не понятно, почему не один метод из GameView не вызывается? Может нужно вне этих методов их писать ?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.07.2012, 17:42     Ориентация экрана конфликтует с onPause() #12
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Только не понятно, почему не один метод из GameView не вызывается
в логах все написано...
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 293
21.04.2013, 08:33  [ТС]     Ориентация экрана конфликтует с onPause() #13
Цитата Сообщение от V0v1k Посмотреть сообщение
кстати System.exit(0); прерывает жизненный цикл активити, а runFinalizersOnExit устаревший метод
А что плохого в этом устаревшем методе? Такой связкой останавливается все, и не нужно специально останавливать звуки, музыку и т.п.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 11:45     Ориентация экрана конфликтует с onPause() #14
This method was deprecated in API level 1. this method is unsafe.
этот метод устаревший и не безопасный.

нужно самому все корректно завершать и не вмешиваться в жизненный цикл в жизненный цикл компонентов андроида.
c4sp3r
21.04.2013, 18:32
  #15

Не по теме:

Цитата Сообщение от @gent Посмотреть сообщение
добавлю что super.onPause() и подобные, отвечающие за завершение чего-либо, вызываются в конце кода.
Java
1
2
3
4
5
6
@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first
 
    ...
}
http://developer.android.com/trainin...e/pausing.html

nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 293
21.04.2013, 21:43  [ТС]     Ориентация экрана конфликтует с onPause() #16
Цитата Сообщение от V0v1k Посмотреть сообщение
этот метод устаревший и не безопасный.

нужно самому все корректно завершать и не вмешиваться в жизненный цикл в жизненный цикл компонентов андроида.
Ну а все же, что самое страшное может произойти, не закроется или вся система зависнет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2013, 21:51     Ориентация экрана конфликтует с onPause()
Еще ссылки по теме:
HttpPost конфликтует с БД Android
Ориентация Android
Android Портретная\Альбомная ориентация
Android SQlite + курсор + ориентация
Ориентация экрана в андроид Delphi FireMonkey

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 21:51     Ориентация экрана конфликтует с onPause() #17
последствия непредсказуемы.
Yandex
Объявления
21.04.2013, 21:51     Ориентация экрана конфликтует с onPause()
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru