Как я могу найти то, что останавливает мою деятельность

У меня есть одно действие с парой фрагментов, которое останавливается случайным образом, и я пытаюсь выяснить причину. Проблема, аналогичная этой (Почему активность моего Android останавливается?) но несвязанный ответ.

Активность выполняется на Android Wear, при этом собираются данные акселерометра. Он останавливается только в том случае, если я также взаимодействую с устройством во время его перемещения, например, касаясь экрана. Я пытался:

  1. Отключение изменения ориентации при встряхивании устройства приводит к изменению конфигурации.
  2. Отключение swipeToDismissв действии Wear на случай, если касание было неверно истолковано как быстрое смахивание для закрытия.
  3. Переопределение onLowMemory() с помощью точек останова, чтобы проверить, не связана ли проблема с ресурсами.
  4. Переопределение onFinish() с точками останова в случае непреднамеренного вызова finish()

Активность запускается из службы с

    Intent startIntent = new Intent( this, WearActivity.class );
    startIntent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
    startActivity( startIntent );

с активностью, установленной на android:launchMode="singleTask", но есть только один запрос на запуск.

У меня закончились идеи. Есть ли способ определить, кто отправляет стоп-сообщение? Ниже приведена полная трассировка стека, активность останавливается получением системного сообщения STOP_ACTIVITY_HIDE в ActivityThread.handleMessage():

  at myRandomApp.WearActivity.onStop(WearActivity.java:76)
  at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1212)
  at android.app.Activity.performStop(Activity.java:5387)
  at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3196)
  at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3245)
  at android.app.ActivityThread.access$1100(ActivityThread.java:138)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1236)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:136)
  at android.app.ActivityThread.main(ActivityThread.java:5026)
  at java.lang.reflect.Method.invokeNative(Method.java:-1)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
  at dalvik.system.NativeStart.main(NativeStart.java:-1)

EDIT:
В ответ на некоторые комментарии, приведенная выше трассировка стека не была сгенерирована из-за исключения. Именно здесь я наткнулся на точку останова, чтобы увидеть историю вызовов, приведших к остановке приложения. Приложение выходит чисто, я пытаюсь понять, почему оно вообще хочет выйти.

ОБНОВЛЕНИЕ: я наконец нашел виновника. Неизменно, прежде чем мое приложение закрывается, я получаю это несколькими моментами раньше в выводе журнала:

I/ActivityManager﹕ START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.google.android.wearable.app/com.google.android.clockwork.home.HomeActivity (has extras)}

Кажется, что перемещение часов увеличивает количество шагов шагомера, что приводит к отображению новой информационной карты на главном экране часов. Эта карточка прерывает мою полноэкранную активность и закрывает ее. Кто-нибудь знает способ предотвратить это? Это похоже на ошибку Wear, я не уверен, что другие приложения должны иметь возможность прерывать работающее приложение переднего плана.

Я нашел причину, по которой мое приложение закрывается, но только из-за удачной информации, отправленной в журнал. Я все еще ищу ответ на свой первоначальный вопрос, общий способ определить причину остановки приложений системой Android. Может быть, это просто невозможно?


person Morne    schedule 04.09.2014    source источник
comment
Увидев logcat, я думаю, что с вашим методом onStop что-то не так...   -  person Umair    schedule 04.09.2014
comment
Нет, мой onStop просто вызывает super.onStop(). Здесь просто нужно разместить точку останова и поймать точку, в которой активность остановлена, чтобы получить трассировку стека. Исключение нигде не выбрасывается.   -  person Morne    schedule 04.09.2014
comment
Не выбрасывается ли какое-либо исключение? Я скучаю по этому в вашем Logcat ...   -  person Anthea    schedule 04.09.2014
comment
опубликуйте полный logcat, это только его часть. должно быть исключение   -  person Ker p pag    schedule 04.09.2014
comment
Что такое строка at myRandomApp.WearActivity.onStop(WearActivity.java:76)?   -  person EpicPandaForce    schedule 04.09.2014
comment
Все, пожалуйста, не зацикливайтесь на поиске исключения. Как уже упоминалось как в моем посте, так и в комментариях, НИКАКИХ ИСКЛЮЧЕНИЙ не выбрасывается, есть точка останова, установленная мной в строке 76, которая просто вызывает super.onStop(). Мой первоначальный вопрос состоял в том, чтобы найти способ выяснить, ПОЧЕМУ моя деятельность останавливается (чисто).   -  person Morne    schedule 04.09.2014


Ответы (1)


У меня нет ответа на мой первоначальный вопрос, но у меня есть обходной путь для симптомов, вызванных им. Вместо того, чтобы запускать свое приложение как полноэкранное действие, я вместо этого создаю уведомление в потоке контекста с действием для перехода в полноэкранный режим. Уведомление постоянное, поэтому даже когда другие карты входят в поток, это не приводит к завершению моей задачи.

Я отправил сообщение об ошибке для этой проблемы по адресу https://code.google.com/p/android/issues/detail?id=75918&thanks=75918&ts=1410235765

Первоначальный вопрос остается открытым, но я подозреваю, что на него нет ответа...

person Morne    schedule 11.09.2014
comment
Входящие текстовые сообщения также вызывают у вас проблему? Или это просто всплывающее уведомление шагомера? - person Wayne Piekarski; 17.09.2014
comment
Так было со всеми новыми картами, а не только с шагомером. Легко воспроизвести, отправив демонстрационные карты из приложения Android Wear на портативном устройстве. Стоит отметить, что я создаю свое уведомление с настраиваемым макетом, установленным с помощью setDisplayIntent(), чтобы запустить действие, связанное с моим приложением, и сохранить задачу. - person Morne; 18.09.2014