Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

24.07.2012, 21:10. Просмотров 1501. Ответов 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);
    }
}
То приложение запускается только в горизонтальном положение экрана, а в вертикальном долго думает и вылетает. Подскажите пожалуйста , почему так происходит и как можно иначе закрывать приложение без косяков?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2012, 21:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ориентация экрана конфликтует с onPause() (Программирование Android):

Ориентация экрана - Программирование Android
Здравствуйте!Хотелось бы услышать совета знающих людей:) Имеется Активити с открытой БД и Курсором...Необходимо сделать так, что бы...

ориентация экрана - Программирование Android
Как сделать так чтобы в тоже время запретить вертикальную ориентацию активити. Но в горизонтальном положении его можно было поворачивать...

Ориентация экрана и данные - Программирование Android
Здравствуйте! Подскажите такую вещь: У меня есть некоторые данные в активити а именно private MyObj myObj; У которого есть некоторые...

Ориентация экрана в эмуляторе - Программирование Android
Здравствуйте, к меня в эмуляторе не меняется ориентация экрана, при нажатии комбинации ctrl+ F11 или ctrl+F12 никакой реакции

Ориентация экрана при загрузке данных - Программирование Android
Добрый день! Приложение запрашивает HTML страницу которая загружется в doInBackground. Но при смене ориентции экрана приложение...

Метод onPause() - Программирование Android
У меня в приложении генерируется карта (двумерный массив значений) и там происходит игра. Если долго ни кто ничего не делает с телефоном -...

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

Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Можно конечно попытаться из класса GameView вызвать track.stop(); но хотелось бы все грамотнее сделать.
вот это и есть грамотно вызывать в onPause что-то вроде track.stop() или там track.pause(), а в onResume, track.resume()
1
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 319
26.07.2012, 14:42  [ТС] #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);
  }
}
0
Вложения
Тип файла: zip onpase.zip (818.2 Кб, 8 просмотров)
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.07.2012, 15:10 #10
ну, смотрите логи...
0
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 319
26.07.2012, 16:22  [ТС] #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 не вызывается? Может нужно вне этих методов их писать ?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.07.2012, 17:42 #12
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Только не понятно, почему не один метод из GameView не вызывается
в логах все написано...
0
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 319
21.04.2013, 08:33  [ТС] #13
Цитата Сообщение от V0v1k Посмотреть сообщение
кстати System.exit(0); прерывает жизненный цикл активити, а runFinalizersOnExit устаревший метод
А что плохого в этом устаревшем методе? Такой связкой останавливается все, и не нужно специально останавливать звуки, музыку и т.п.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 11:45 #14
This method was deprecated in API level 1. this method is unsafe.
этот метод устаревший и не безопасный.

нужно самому все корректно завершать и не вмешиваться в жизненный цикл в жизненный цикл компонентов андроида.
1
c4sp3r
21.04.2013, 18:32     Ориентация экрана конфликтует с onPause()
  #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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2013, 18:32
Привет! Вот еще темы с ответами:

Вызов onDestroy() без вызовов onPause() и onStop() - Программирование Android
наткнулся на вопрос в одном тесте "Последний метод, вызываемый в жизненном цикле Activity - это метод onDestroy(). Система вызывает...

HttpPost конфликтует с БД - Программирование Android
Добрый вечер! Столкнулся со следующей проблемой, я имею два корректно работающих приложения: первое выполняет POST запрос и получает...

Ориентация - Программирование Android
Народ помогите уже мучаюсь какой день не могу поменять ориентацию эмулятора. Сам эмулятор тока переворачивается(ctrl+F11, ctrl+F12,7,9) но...

SQlite + курсор + ориентация - Программирование Android
Всем добрый вечер. Хотя не совсем добрый (для меня). Уже два часа безрезультатно пытаюсь решить проблему. Если в двух словах: ...


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

Или воспользуйтесь поиском по форуму:
15
21.04.2013, 18:32
Ответ Создать тему
Опции темы

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