58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
1

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

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

Author24 — интернет-сервис помощи студентам
Есть главное activity, которое запускает сервис. Сервис выполняет длительную операцию. При нажатии Back приложение сворачивается, сервис работает - так и надо. При закрытии приложения через TaskManager закрывается и сервис и приложение - норм. Но если удерживаем клавишу "Домик" и оттуда закрываем свернутое приложение - выскакивает окно ошибки. Подозреваю что сервис проверяет связь с активити и выдает ошибку. Как решить проблему?
При нажатии Back вызывается onDestroy(), что тогда вызывается при закрытии через ДОМИК?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2013, 13:59
Ответы с готовыми решениями:

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

IntelliTrace остается в процессах после закрытия программы. Правильное завершение программы?
Много (очень много) раз запускал программу, закрывал через крестик. Вдруг винда сообщает, что...

завершение программы
помогите сообразить #include <StdAfx.h> #include <iostream> #include <conio.h> #include...

Завершение программы
Здравствуйте, есть, например, код: a, b = map(int, input().split()) print(a ** b) для...

12
Командир зеленых роботов
349 / 286 / 54
Регистрация: 08.10.2013
Сообщений: 576
25.12.2013, 15:27 2
Давай посмотрим на стектрейс для начала
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
25.12.2013, 22:51  [ТС] 3
Цитата Сообщение от angryrobot Посмотреть сообщение
Давай посмотрим на стектрейс для начала
Как его посмотреть?
0
Командир зеленых роботов
349 / 286 / 54
Регистрация: 08.10.2013
Сообщений: 576
25.12.2013, 23:33 4
Цитата Сообщение от ASDFD12 Посмотреть сообщение
Как его посмотреть?
Просто подключи устройство к компьютеру, запусти Eclipse и воспроизведи сценарий когда возникает окно ошибки. Потом посмотри в LogCat и там будет стек вызовов.
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
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
Командир зеленых роботов
349 / 286 / 54
Регистрация: 08.10.2013
Сообщений: 576
26.12.2013, 19:59 6
Случился NullPointerException
Показывай код теперь :-)
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
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
349 / 240 / 34
Регистрация: 16.01.2010
Сообщений: 766
27.12.2013, 14:21 8
Цитата Сообщение от ASDFD12 Посмотреть сообщение
где у меня принимаються данные из главного активити, которого уже нет - соответственно происходит ошыбка.
Как это вообще происходит? После onDestroy() ничего уже никуда не передаться. Ибо нет уже никаких данных.
Они до этого, должны быть как сохранены, или переданы.
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
27.12.2013, 14:41  [ТС] 9
Я же подробно все описал. При закрытии свернутого приложения происходит, не могу понять почему, повторный вызов методов onCreate() и onStartCommand() сервиса, последний и вызывает ошибку. Для того чтобы устранить ошибку надо придумать способ, чтобы при закрытии свернутого приложения удалялся сервис.
0
349 / 240 / 34
Регистрация: 16.01.2010
Сообщений: 766
27.12.2013, 15:08 10
Может и подробно, но как то не понятно onCreate() не может быть повторно вызван (без пересоздания).
Кроме того, нужно помнить, что методы onStop() и onDestroy() вообще могут быть не вызваны, никогда.
P.S. Вы не можете управлять этим методами, они "отданы на откуп" системе. Другими словами, когда и что вызывать не вам решать.
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
27.12.2013, 17:27  [ТС] 11
Я просто описал, что у меня за чем вызывается. А почему оно вызывается я хз.

Добавлено через 29 минут
я только описал что происходит на самом деле
0
349 / 240 / 34
Регистрация: 16.01.2010
Сообщений: 766
27.12.2013, 17:49 12
Цитата Сообщение от ASDFD12 Посмотреть сообщение
При нажатии Back вызывается onDestroy(), что тогда вызывается при закрытии через ДОМИК?
Не факт. Вызовами этих методов невозможно управлять, и не известно что вызывается, когда вы нажимаете (Back или ДОМИК). Можно сказать, что точно вызывается onPause(). А все остальное - непредсказуемо.
Можете ради интереса, в каждом методе (onDestroy, onStop() и прочих) вызвать Log, и посмотреть
какие методы будут вызваны. Проделать это неоднократно, для наглядности.
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2013, 13:40
Помогаю со студенческими работами здесь

БД. Завершение программы
Хочу попробовать для хранения данных программы-бота SQLite. Опыт работы с этой БД уже есть, однако...

Завершение программы
Как сделать чтобы после выполнения кода программа не завершала свою работу? program Project1; ...

Завершение программы 1/0
Нужно сделать так чтобы на 1 программа продолжалась, а на 0 завершалась! // Функция.cpp:...

Завершение программы
Добрый вечер. Хотел прояснить следующие моменты. Если программа пишется под DOS (на чистом асме...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru