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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
ASDFD12
46 / 46 / 11
Регистрация: 15.09.2012
Сообщений: 488
#1

Коректное завершение программы - Программирование Android

25.12.2013, 13:59. Просмотров 1760. Ответов 12
Метки нет (Все метки)

Есть главное activity, которое запускает сервис. Сервис выполняет длительную операцию. При нажатии Back приложение сворачивается, сервис работает - так и надо. При закрытии приложения через TaskManager закрывается и сервис и приложение - норм. Но если удерживаем клавишу "Домик" и оттуда закрываем свернутое приложение - выскакивает окно ошибки. Подозреваю что сервис проверяет связь с активити и выдает ошибку. Как решить проблему?
При нажатии Back вызывается onDestroy(), что тогда вызывается при закрытии через ДОМИК?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2013, 13:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Коректное завершение программы (Программирование Android):

Поиск и завершение всех Service программы - Программирование Android
Как убить все сервисы при выходе? У меня прога запускает в ходе работы четыре сервиса которые следят друг за другом и в случаи падения...

При попытке открыть второй и третий Activity происходит завершение работы программы - Программирование Android
Подскажите где ошибка. В программирование андроида пару дней. При попытке открыть второй и третий Activity происходит завершение работы...

Завершение сервиса - Программирование Android
вот метод завершающий сервис в основной активности: public void onClickStop(View v) { stopService(new Intent(this,...

Завершение потока - Программирование Android
Необходимо корректно завершить поток. Сейчас код такой class MyThread extends Thread { private void method() throws...

Завершение работы приложения - Программирование Android
у меня есть менюшка. там есть кнопочка quit, мне нужна чтоб она полностью прекращала работу приложения. Я пытаюсь сделать подобным образом:...

Завершение потока AsyncTask - Программирование Android
Доброго времени суток. Возникла проблема с закрытием потока. Первый раз код выполняется и все норм, но т.к. при нажатии на кнопку...

12
angryrobot
Командир зеленых роботов
348 / 285 / 53
Регистрация: 08.10.2013
Сообщений: 564
25.12.2013, 15:27 #2
Давай посмотрим на стектрейс для начала
0
ASDFD12
46 / 46 / 11
Регистрация: 15.09.2012
Сообщений: 488
25.12.2013, 22:51  [ТС] #3
Цитата Сообщение от angryrobot Посмотреть сообщение
Давай посмотрим на стектрейс для начала
Как его посмотреть?
0
angryrobot
Командир зеленых роботов
348 / 285 / 53
Регистрация: 08.10.2013
Сообщений: 564
25.12.2013, 23:33 #4
Цитата Сообщение от ASDFD12 Посмотреть сообщение
Как его посмотреть?
Просто подключи устройство к компьютеру, запусти Eclipse и воспроизведи сценарий когда возникает окно ошибки. Потом посмотри в LogCat и там будет стек вызовов.
0
ASDFD12
46 / 46 / 11
Регистрация: 15.09.2012
Сообщений: 488
26.12.2013, 19:47  [ТС] #5
Цитата Сообщение от angryrobot Посмотреть сообщение
Просто подключи устройство к компьютеру, запусти Eclipse и воспроизведи сценарий когда возникает окно ошибки. Потом посмотри в LogCat и там будет стек вызовов.
Вот что получил
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
12-26 17:44:38.145: E/AndroidRuntime(3409): FATAL EXCEPTION: main
12-26 17:44:38.145: E/AndroidRuntime(3409):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2822)
12-26 17:44:38.145: E/AndroidRuntime(3409):     at android.app.ActivityThread.access$1900(ActivityThread.java:156)
12-26 17:44:38.145: E/AndroidRuntime(3409):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1437)
12-26 17:44:38.145: E/AndroidRuntime(3409):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-26 17:44:38.145: E/AndroidRuntime(3409):     at android.os.Looper.loop(Looper.java:153)
12-26 17:44:38.145: E/AndroidRuntime(3409):     at android.app.ActivityThread.main(ActivityThread.java:5297)
12-26 17:44:38.145: E/AndroidRuntime(3409):     at java.lang.reflect.Method.invokeNative(Native Method)
12-26 17:44:38.145: E/AndroidRuntime(3409):     at java.lang.reflect.Method.invoke(Method.java:511)
12-26 17:44:38.145: E/AndroidRuntime(3409):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
12-26 17:44:38.145: E/AndroidRuntime(3409):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
12-26 17:44:38.145: E/AndroidRuntime(3409):     at dalvik.system.NativeStart.main(Native Method)
12-26 17:44:38.145: E/AndroidRuntime(3409): Caused by: java.lang.NullPointerException
12-26 17:44:38.145: E/AndroidRuntime(3409):     at com.example.prosto.MyService.onStartCommand(MyService.java:73)
12-26 17:44:38.145: E/AndroidRuntime(3409):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2805)
12-26 17:44:38.145: E/AndroidRuntime(3409):     ... 10 more
0
angryrobot
Командир зеленых роботов
348 / 285 / 53
Регистрация: 08.10.2013
Сообщений: 564
26.12.2013, 19:59 #6
Случился NullPointerException
Показывай код теперь :-)
0
ASDFD12
46 / 46 / 11
Регистрация: 15.09.2012
Сообщений: 488
27.12.2013, 12:18  [ТС] #7
Цитата Сообщение от angryrobot Посмотреть сообщение
Случился NullPointerException
Показывай код теперь :-)
Я так понял здесь зарыта собака. Из главного активити запускается сервис. Метод OnStartCommand сервиса - здесь происходит получение данных из главного активити.
Java
1
2
3
4
5
6
7
8
9
10
11
 public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(LOG_TAG, "onStartCommand");
        
        
         a=intent.getStringExtra("a");
         b=intent.getStringExtra("b");
         c=intent.getLongExtra("c", 15000);
         
        someTask();
        return super.onStartCommand(intent, flags, startId);
      }
Добавлено через 58 минут
Цитата Сообщение от ASDFD12 Посмотреть сообщение
Я так понял здесь зарыта собака. Из главного активити запускается сервис. Метод OnStartCommand сервиса - здесь происходит получение данных из главного активити.
Java
1
2
3
4
5
6
7
8
9
10
11
 public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(LOG_TAG, "onStartCommand");
        
        
         a=intent.getStringExtra("a");
         b=intent.getStringExtra("b");
         c=intent.getLongExtra("c", 15000);
         
        someTask();
        return super.onStartCommand(intent, flags, startId);
      }
Ситуация такая. Когда я нажимаю клавишу Back вызывается метод onDestroy() главного активити, а сервис продолжает жить своей жизнью - мне так и надо. Когда я сворачиваю приложение кнопкой Home - вызывается метод onStop() главного активити - сервис работает - так и надо. Когда я удерживаю клавишу Home - вызываю список запущенных приложений и удаляю его оттуда, перетянув в сторону - вызывается метод onDestroy() главного активити и ---- ВНИМИНИЕ --- вызывается метод onCreate сервиса, потом onStartCommand()? где у меня принимаються данные из главного активити, которого уже нет - соответственно происходит ошыбка. ПОЧЕМУ так происходит при закрытии программы как я описал и что надо предпринять?

Добавлено через 15 часов 7 минут
Есть предложения?
0
Vladimirys
309 / 206 / 25
Регистрация: 16.01.2010
Сообщений: 586
27.12.2013, 14:21 #8
Цитата Сообщение от ASDFD12 Посмотреть сообщение
где у меня принимаються данные из главного активити, которого уже нет - соответственно происходит ошыбка.
Как это вообще происходит? После onDestroy() ничего уже никуда не передаться. Ибо нет уже никаких данных.
Они до этого, должны быть как сохранены, или переданы.
0
ASDFD12
46 / 46 / 11
Регистрация: 15.09.2012
Сообщений: 488
27.12.2013, 14:41  [ТС] #9
Я же подробно все описал. При закрытии свернутого приложения происходит, не могу понять почему, повторный вызов методов onCreate() и onStartCommand() сервиса, последний и вызывает ошибку. Для того чтобы устранить ошибку надо придумать способ, чтобы при закрытии свернутого приложения удалялся сервис.
0
Vladimirys
309 / 206 / 25
Регистрация: 16.01.2010
Сообщений: 586
27.12.2013, 15:08 #10
Может и подробно, но как то не понятно onCreate() не может быть повторно вызван (без пересоздания).
Кроме того, нужно помнить, что методы onStop() и onDestroy() вообще могут быть не вызваны, никогда.
P.S. Вы не можете управлять этим методами, они "отданы на откуп" системе. Другими словами, когда и что вызывать не вам решать.
0
ASDFD12
46 / 46 / 11
Регистрация: 15.09.2012
Сообщений: 488
27.12.2013, 17:27  [ТС] #11
Я просто описал, что у меня за чем вызывается. А почему оно вызывается я хз.

Добавлено через 29 минут
я только описал что происходит на самом деле
0
Vladimirys
309 / 206 / 25
Регистрация: 16.01.2010
Сообщений: 586
27.12.2013, 17:49 #12
Цитата Сообщение от ASDFD12 Посмотреть сообщение
При нажатии Back вызывается onDestroy(), что тогда вызывается при закрытии через ДОМИК?
Не факт. Вызовами этих методов невозможно управлять, и не известно что вызывается, когда вы нажимаете (Back или ДОМИК). Можно сказать, что точно вызывается onPause(). А все остальное - непредсказуемо.
Можете ради интереса, в каждом методе (onDestroy, onStop() и прочих) вызвать Log, и посмотреть
какие методы будут вызваны. Проделать это неоднократно, для наглядности.
0
ASDFD12
46 / 46 / 11
Регистрация: 15.09.2012
Сообщений: 488
28.12.2013, 13:40  [ТС] #13
Я так и сделал. прописал логи и смотрел что вызывается. если нажать back вызывается on stop и onDestroy главного активити, сервис продолжает работать. Если после этого удерживают home , программа есть в списке, и я её закрывают - никакой метод из активити не запускается, но запускается onCreate и onStartCommand сервиса, что провоцирует ошибку.

Добавлено через 2 часа 58 минут
Еще раз подробнее опишу логи, может кто-то что-то сообразит
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
1. Запускаю программу (логи)
onCreate Main
onResume Main
onPause Main
onCreate заставка
onResume заставка
onStop Main
onPause заставка
onResume Main
onStop заставка
onDestroy заставка
// далее я запускаю кнопкой сервис
onCreate Servise
onStartCommand Servise
идет задача которую выполняет сервис в бесконечном цикле someTask - так мне и нужно
... и тут я нажимаю клавишу Back
onPause Main
onStop Main
onDestroy Main
идет задача которую выполняет сервис someTask - так мне и нужно
.. я удерживаю клавишу Home , там есть мое приложение и я его раскрываю..
onCreate MAIN
OnResume MAIN
OnPause MAIN 
onCreate заставка
onResume заставка
onStop заставка
onDestroy заставка
задача сервиса someTask - так и нужно
// я сворачиваю приложение клавишей Home
onPause Main
onStop Main
задача сервиса someTask - так и нужно
// удерживаю клавишу Home - появляется список приложений и удаляю приложение из списка
on Destroy Main
on Create Servise
on StartCommand Servise - в котором идет прием данных из активити, а его нет - ошибка
Добавлено через 18 минут
пропустил после 28 строки onResume Main - но это не важно

Добавлено через 15 часов 55 минут
Кто сталкивался с подобным, есть предложения.
0
28.12.2013, 13:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2013, 13:40
Привет! Вот еще темы с ответами:

Принудительное завершение звонка - Программирование
Здравствуйте. Подскажите пожалуйста как завершить звонок не дожидаясь, когда на него ответят. Звоню так: Intent intent = new...

Программное завершение приложения - Программирование Android
Здравствуйте. Как программно завершить приложение? То есть не завершить активность через finish(), а именно выйти из приложения вообще.

Завершение предыдущего активити (удаление из стека) - Программирование Android
товарищи, подскажите способы завершения предыдущего активити в стеке, чтобы по нажатию клавиши "назад" из последующего я уже не возобновлял...

.NET 4.x IntelliTrace остается в процессах после закрытия программы. Правильное завершение программы? - C# WPF
Много (очень много) раз запускал программу, закрывал через крестик. Вдруг винда сообщает, что виртуальная память вся забита (8к). Открываю...


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

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

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