android:clearTaskOnLaunch не работает Как очистить задний стек, когда он выходит на передний план?

Мне нужно такое поведение в моем приложении: «пользователь должен входить в систему каждый раз, когда он пытается запустить его (касаясь значка приложения напрямую, или с помощью диспетчера задач, или через последние приложения)». Таким образом, действия выполняются в этом порядке (подумайте, что приложение имя приложение Foo)

  1. S – заставка
  2. L – экран загрузки
  3. Lo — экран входа в систему
  4. M — Главное меню (со списком задач)
  5. T — Экран задач

"Пользователь запускает приложение и действует в следующем порядке: S -> L -> Lo (вход в систему) -> M (выбирает одну из задач) -> Экран задач

  • поэтому, пока он находится на экране задач, он нажимает кнопку «Домой», и приложение переходит в фоновый режим, и он использует другое приложение. и снова запускает приложение Foo. Таким образом, если он нажал кнопку «Назад», он показывает ранее использовавшийся Экран задач??? а если нажать кнопку "Назад" еще раз, он снова переходит на Главный экран и так далее...???

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

Примечание. все экраны имеют расширенный класс BaseActivity, который расширяет класс Activity. и там я использовал метод onResume(), onPause() и другой пользовательский метод, чтобы узнать, когда расширенный дочерний класс переходит на паузу и возобновляется, когда приложение выходит из фона !!! И в некоторых экранах мне тоже приходилось использовать фрагменты...!

Заранее спасибо за ваше время и помощь!


person Randika Vishman    schedule 14.06.2013    source источник
comment
Отклонено из-за дубликатов здесь (кстати, очень хороший ответ) и здесь   -  person verybadalloc    schedule 14.06.2013
comment
Если пользователь нажал Домой или какая-то другая активность вышла сверху (входящая звонилка), то когда пользователь вернется к вашей активности (по значку приложения или обратно) то ОН ДОЛЖЕН ОЖИДАТЬ, что увидит ваше приложение там, где оно было. Я не видел, чтобы СЕРЬЕЗНОЕ и ПОПУЛЯРНОЕ приложение для Android вело себя по-другому... Я не вижу причин, по которым оно не должно вести себя как таковое.   -  person gunar    schedule 14.06.2013
comment
Спасибо за оба комментария в первую очередь. @verybadalloc Эй, я тоже так ответил, прежде чем публиковать это, но те вещи, которые я реализовал в своем приложении, но не дали желаемых результатов! :(   -  person Randika Vishman    schedule 15.06.2013
comment
@gunar Привет, Гунар, если вы можете просто представить себе приложение, в котором вы можете скрыть или заблокировать все изображения, которые вы выбираете через приложение, и в любое время, когда вам нужен доступ к этим изображениям, вам нужно будет войти в систему через приложение. , но не непосредственно в последней просматриваемой фотогалерее этого приложения. поэтому для реализации такого поведения нам нужно реализовать вышеупомянутый сценарий   -  person Randika Vishman    schedule 15.06.2013
comment
Когда BackStack активности выглядит следующим образом: A -> B -> C -> D в D он нажимает кнопку "Домой". Каким бы способом он ни запускал приложение позже, я хочу, чтобы он вернулся к действию A, например, просто открыл стек до A!Поскольку это Активность входа, я все еще не могу подойти к этому! Я могу узнать в любом месте приложения, что, когда оно возвращается из фона на передний план и передает метод Intent to StartActivity с FLAG_ACTIVITY_CLEAR_TASK, и я уже использовал **android:clearTaskOnLaunch=true **, но все же проблема есть!   -  person Randika Vishman    schedule 17.06.2013


Ответы (2)


Добавьте тег android:clearTaskOnLaunch="true" в корневой (основной) тег действия в манифесте. Тогда пользователь всегда будет возвращаться к этому действию.

Чтобы перейти к входу в систему из любого другого действия, используйте:

public static void logoff(Context c){
    Intent logoff = new Intent(c,LoginActivity.class);
    logoff.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
    c.startActivity(logoff);
}
person S.D.    schedule 14.06.2013
comment
Привет, спасибо за ответ, я думаю, я сделал то же самое, но на самом деле это не сработало! В любом случае, в чем причина создания статического метода? И когда это звонить? Мой вопрос на самом деле заключается в том, что я также делаю то же самое и успешно запускаю новую активность входа или могу перейти на экран-заставку, но проблема в том, что в этот момент, если пользователь нажимает кнопку «Назад», он / она все еще может получить доступ к предыдущее действие на заднем стеке, которое он использовал в последний раз, когда использовал его! :( (Такое поведение необходимо, чтобы не обеспечивать защиту информации в приложении) Любая помощь? - person Randika Vishman; 15.06.2013
comment
@Vishman Метод logoff будет делать то, что он говорит, он вернет пользователя к входу в систему из любого другого действия. И пользователь не может отменить это, нажав назад, потому что это завершает старую задачу и запускает новую. Это статично, поэтому его можно легко вызвать из любого места. Теперь добавление android:clearTaskOnLaunch="true" к активности входа в манифест гарантирует, что когда пользователь куда-то уходит и возвращается в приложение, он переходит к активности входа и в обновленной новой задаче (точно так же, как методы logoff). Кроме того, я рекомендую использовать фрагменты и размещать заставку/ фрагменты загрузки/входа только в активность входа. - person S.D.; 16.06.2013
comment
привет, спасибо за ваше объяснение, я попробую это и сообщу вам результаты, хорошо? - person Randika Vishman; 17.06.2013
comment
Когда BackStack активности выглядит следующим образом: A -> B -> C -> D в D он нажимает кнопку "Домой". Каким бы способом он ни запускал приложение позже, я хочу, чтобы он вернулся к действию A, например, просто открыл стек до A!Поскольку это Активность входа, я все еще не могу подойти к этому! Я могу узнать в любом месте приложения, что, когда оно возвращается из фона на передний план и передает метод Intent to StartActivity с FLAG_ACTIVITY_CLEAR_TASK, и я уже использовал **android:clearTaskOnLaunch=true **, но все же проблема есть! - person Randika Vishman; 17.06.2013
comment
Извините, ребята, но это немного глупо, однако я нашел половинчатое решение своего вопроса, получив помощь в следующем ответе Надеюсь, это будет полезно для всех вас, если вы столкнулись с одним и тем же вопросом. - person Randika Vishman; 12.07.2013

Я не собираюсь спорить, почему ваш вопрос описывает не очень приятный пользовательский опыт, но что вы скажете о приведенном ниже решении?

Замените Lo, M и T как фрагменты. Таким образом, после L у вас будет действие (PostL), в котором вы показываете первый фрагмент Lo, а затем при действии пользователя вы добавляете поверх Lo фрагмент M на get(Supported)FragmentManager.beginTransation().add(id, fragment).commit(), затем, двигаясь дальше, вы замените M на T: get(Supported)FragmentManager.beginTransation().replace(id, fragment).commit(). - или вы можете добавить T поверх M, это ваш выбор, так как это может подойти лучше.

В этом действии PostL в методе onPause() вы должны вызывать только get(Supported)FragmentManager.popBackStack(), если стопка фрагментов состоит из более чем одного фрагмента — нижний фрагмент — Lo.

Таким образом, будет охватывать оба случая, когда пользователь нажимает на главном экране и повторно входит в приложение (независимо от того, откуда), или любое другое приложение выходит на передний план. Кроме того, если вы правильно считаете размер обратного стека, если пользователь коснется назад, он всегда будет открывать последний фрагмент (это может быть M или Lo).

надеюсь смысл есть...

person gunar    schedule 16.06.2013
comment
Ну, спасибо за ваше предложение в первую очередь. Но это выглядит как целая новая ветвь изменений разработки, к которой у меня сейчас есть большая часть готового продукта. В любом случае, спасибо, и если я не смогу решить эту проблему каким-либо другим способом, я тоже попробую это решение и обязательно сообщу вам, что произошло, хорошо? :) еще раз спасибо! - person Randika Vishman; 17.06.2013
comment
Вам не нужно выполнять эту работу, так как относительно легко мигрировать с Activity на Fragment и наоборот. Их жизненный цикл очень похож, обратные вызовы похожи, поэтому у вас не должно быть слишком много работы. Можно выделить на это скажем 2 часа, если получится, то ок, если нет, то можно оставить как есть. - person gunar; 17.06.2013
comment
Спасибо за помощь! Так что, если я выберу это решение, мне придется перенести все остальные задачи из Activity в Fragment, верно? Если не снова, это вызовет проблему позже. - person Randika Vishman; 17.06.2013
comment
Извините, ребята, но это немного глупо, однако я нашел половинчатое решение своего вопроса, получив помощь в следующем ответе Надеюсь, это будет полезно для всех вас, если вы столкнулись с одним и тем же вопросом. - person Randika Vishman; 12.07.2013
comment
Посмотрите на комментарий Radu к этому ответу. Это хакерский способ ничего не делать. - person gunar; 12.07.2013
comment
Это правда, когда мы видим это с первого взгляда. Но, однако, основываясь на этом ответе, я использовал пользовательский метод для определения того, когда он исходит из фона, а также тот ответ, который я дал ссылку, у меня была решена только половина проблемы. Когда пользователь нажимает на значок приложения, и приложение выводится на передний план, удивительно, что задний стек был очищен. Но если пользователь обращался к нему в недавних приложениях, та же проблема все еще существовала, то есть пользователь мог получить доступ к предыдущим действиям. :( Даже вспоминать эту головную боль не хочется!!! - person Randika Vishman; 12.07.2013