добавил TextToSpeech в мою деятельность, и теперь мой onDestroy больше не вызывается, ошибка? - PullRequest
0 голосов
/ 13 апреля 2010

Я добавил TextToSpeech в свое приложение, следуя инструкциям в следующем посте:

http://android -developers.blogspot.com / 2009/09 / введение в текст-в-речь-in.html

и теперь мой onDestroy больше не вызывается при нажатии кнопки назад. Я подал сообщение об ошибке относительно этого: http://code.google.com/p/android/issues/detail?id=7674

Понял, я должен спросить здесь, видел ли это кто-то еще и нашел решение?

Кажется, что именно намерение вызывает проблему, то есть следующее:

Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);

Если я пропущу это намерение и просто создам экземпляр tts, он работает нормально. Есть какие-нибудь подсказки, что не так с этим намерением?

Ответы [ 2 ]

1 голос
/ 16 апреля 2010

Думаю, я понял это. Моя проблема в том, что я предполагал, что onDestroy будет вызван, когда моя деятельность закончится, чтобы я мог сохранить состояние (и настройки, и т. Д.). И я предполагал, что onDestroy всегда будет происходить до создания нового экземпляра действия, чтобы новый экземпляр в onCreate мог загрузить состояние, сохраненное старым экземпляром.

В общем, это не так. Это даже не относится к onStop.

Решением для меня было просто сохранить то, что я хотел, в onPause. Кажется, я могу рассчитывать на то, что этот вызов будет вызван до создания любого нового экземпляра. Но так как onPause вызывается во многих случаях, когда мне не нужно сохранять, я также проверяю isFinishing (). То есть если isFinishing () в onPause, то я сохраняю.

Обратите внимание, что если бы я запустил свою деятельность в однопользовательском режиме, это не имело значения, я все равно получил бы два "живых" экземпляра. Тот, который был на пути к уничтожению (вызывался onPause, но еще не был введен onStop или onDestroy), а другой находился в onCreate.

Во всяком случае, я надеюсь, что я решил это сейчас.

0 голосов
/ 01 ноября 2010

Воспроизводится. Похоже, что ключ - это то, откуда вы вызываете свой метод initTTS () (или его эквивалент). Если он вызывается из onCreate (), я также вижу поведение выше (onDestroy никогда не вызывался). Подсказанный документом для startActivityForResult (где вызов из onCreate является особым случаем), я попытался вызвать намерение через отложенное сообщение для моего собственного обработчика.

Теперь снова вызывается onDestroy!

(также прокомментировал это в сообщении об ошибке)

...