Ошибка в ActivityManger в Android 2.1 при длительном нажатии на клавишу Home. - PullRequest
1 голос
/ 28 февраля 2011

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

Активность, которую я запускаю, на самом деле представляет собой «всплывающее окно», в котором тема всплывающего окна (android:theme="@android:style/Theme.Dialog") определена в манифесте. Код для ожидающего намерения ниже:

Intent intent = new Intent(this, PopupWindow.class);
PendingIntent launchIntent = PendingIntent.getActivity(context, 0 , intent, 0);

notificationManager.notify(notificationRef, notification);

Все прекрасно работает в Android 2.2, но при тестировании в Android 2.1, новое всплывающее окно не фокусируется на экране.

Я знаю, что действие начинается, потому что если я удерживаю кнопку «Домой», чтобы открыть недавно запущенные приложения, всплывающее окно «волшебно» появляется и фокусируется.

Есть что-то, что я здесь упускаю? Почему мой код работает в Android 2.2, а не 2.1?

1 Ответ

1 голос
/ 02 марта 2011

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

Это произошло ТОЛЬКО в том случае, если вы вышли из Деятельности А с использованием длинного нажатия на клавишу возврата ТОЛЬКО в версиях Android <2.1.Любой другой случай перехода от Деятельности A (короткое нажатие клавиши «Домой», нажатие клавиши «назад») позволил бы открыть ожидающее намерение на Деятельности B и сфокусироваться над всем на экране.В Android 2.2 и выше код работает абсолютно без проблем.Очень странно.Чтобы сделать вещи еще более странными, если я добавлю сообщение Toast для отображения в методе onRestart упражнения A, проблема полностью исчезнет.В методе onPause действия A тоже нет ничего странного .... Я до сих пор не знаю. </p>

Я перепробовал почти все флаги в ожидающем намерении для действия B, но ни один из них не позволил бывсплывающее окно, чтобы добраться до вершины стека активности .... Я думаю, что Nanne и willytate поставили меня на правильный путь ...

Я отказался от метода установки ожидающего намерения внутри службы, ядумаю, что это нарушает сходство между действием A и действием B. Когда я установил ожидающее намерение для действия B внутри действия A, в отличие от службы, работающей в фоновом режиме, действия B (в форме всплывающего окна через android:theme = "@ android: style / Theme.Dialog" в манифесте) всегда будет отображаться в верхней части стека.

Еще раз, эта "потеря фокуса" на деятельности только когда-либо случалась со мнойв этом процессе:

  1. Android 2.1
  2. Запуск активности A
  3. Использование службы для установки уведомления в строке состояния с ожидающим намерением запустить Activity B
  4. Перейдите от действия , удерживая нажатой клавишу Home * , к любому другому приложению.
  5. Служба запускает уведомление в строке состояния с намерением запустить действие B.
  6. Нажмите на уведомление, чтобы открыть действие B.
  7. Операция B, созданная в виде диалога, не найдена, и действие A останавливается в стеке, но остается на паузе.Нет ответа на прикосновение пользователя вообще к действию А, и отображаемый таймер не движется.Возможно, задание застряло в onPause?

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

  1. Список недавно использованных приложений.
  2. Упражнение B.
  3. Acitivyt A.

Нажатие кнопки «Назад», чтобы закрыть список недавно использованных приложений, позволит Упражнению B принять пользовательский ввод, и оттуда всеработает нормально.

Если бы это не было пустой тратой времени, я бы лучше понял, как Android обрабатывает стек приложений.

Может кто-нибудь еще (если они действительно этого хотят)заново создать эту проблему?

...