Когда необходимо использовать singleTop launchMode в виджете или приложении Android?

Я просто обжегся виджетом. Я мог видеть причину проблемы, но не мог определить причину или ее решение. Мой виджет выполнял поиск (SearchManager), и действие запускало диалоговое окно поиска, но когда оно вызывало мой виджет, оно создавало другую ссылку на виджет (т. е. идентификатор потока был тем же самым, но идентификатор виджета изменено с 65 на 0).

Это навело меня на мысль, что создается новый экземпляр, и я искал в документации настройки, применимые к проблеме. В конце концов, я наткнулся на android:launchMode="singleTop", и как только я установил его в AndroidManifest, альт! Мой виджет заработал.

На отладку у меня ушло почти два дня.

Есть ли другие ситуации или есть более технически правильный ответ на мою проблему?


person mobibob    schedule 16.07.2010    source источник
comment
Я не думаю, что заголовок вопроса полезен для содержания. Я надеялся увидеть вопрос и ответы о подходящих вариантах использования singleTop. Это небольшой рассказ о разработке, а затем цитата из документации.   -  person helloPiers    schedule 18.11.2012
comment
@ Lot105 - достаточно справедливо. Идите вперед и добавьте несколько ответов. Это была огромная проблема, с которой я столкнулся, поэтому я задал и ответил на ваш собственный вопрос, как это было предложено SO. Я уверен, что ваши ответы и другие ответы улучшат эти вопросы и ответы. У него более 3000 просмотров, так что интерес явно есть. Я сомневаюсь, что мой ответ является ЕДИНСТВЕННЫМ ответом :) И, конечно же, это ссылка и цитата из документа, поскольку именно там я получил свой ответ. Лично я нахожу реальную ценность в этом вопросе / ответе стиля, поскольку он разъясняет DOC.   -  person mobibob    schedule 20.11.2012
comment
Я должен был быть яснее. Тело вопроса и ответ полезны и интересны сами по себе, абсолютно.   -  person helloPiers    schedule 09.12.2012


Ответы (1)


Я больше читал в Android Docs — я мог бы провести всю жизнь, читая их документы, и найти новую тонкую деталь, которая ломает мне мозг :) Это объясняет мои множественные случаи, которые я не ожидал, однако я настроил так, чтобы они происходили.

Документ Android по определению активности для AndroidManifest.xml

Режимы «стандартный» и «singleTop» отличаются друг от друга только в одном отношении: каждый раз, когда возникает новое намерение для «стандартного» действия, создается новый экземпляр класса, отвечающий на это намерение. Каждый экземпляр обрабатывает одно намерение. Точно так же может быть создан новый экземпляр действия «singleTop» для обработки нового намерения. Однако, если целевая задача уже имеет существующий экземпляр действия в верхней части стека, этот экземпляр получит новое намерение (в вызове onNewIntent()); новый экземпляр не создается. В других обстоятельствах — например, если существующий экземпляр действия «singleTop» находится в целевой задаче, но не на вершине стека, или если он находится на вершине стека, но не в целевой задаче — будет создан новый экземпляр и помещен в стек.

person mobibob    schedule 19.07.2010
comment
или если он находится на вершине стека, но не в целевой задаче — будет создан новый экземпляр и помещен в стек. Почему? Может ли кто-нибудь объяснить этот цитируемый раздел дальше? - person Patrick; 16.09.2015
comment
@Patrick Патрик Я считаю, что это сценарий, когда вы используете FLAG_ACTIVITY_NEW_TASK. В этом случае вам не нужна существующая задача, и вы создаете новую задачу, поэтому ваша активность становится единственной в новой задаче. Поправьте меня если я ошибаюсь. - person Gokhan Arik; 08.01.2018
comment
@ Гохан Арик Я не думаю, что это правильно. Это документация для FLAG_ACTIVITY_NEW_TASK: при использовании этого флага, если задача уже запущена для действия, которое вы сейчас запускаете, то новое действие не будет запущено; вместо этого текущая задача будет просто перенесена на передний план экрана в том состоянии, в котором она была в последний раз. См. FLAG_ACTIVITY_MULTIPLE_TASK для флага, отключающего это поведение. Итак, вы видите, что FLAG_ACTIVITY_NEW_TASK не обязательно создает новую задачу — только при необходимости. В противном случае он повторно использует существующую задачу. - person Andy Weinstein; 25.11.2018