Запуск стороннего приложения перезапускает его вместо возобновления

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

После поиска правильного FLAGS, который будет использоваться для intent при запуске приложения, это мой код:

 Intent i = getPackageManager().getLaunchIntentForPackage(pkgName);
            i.setAction(Intent.ACTION_MAIN);
            i.addCategory(Intent.CATEGORY_DEFAULT);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                            | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

 if (i != null) startActivity(i);

Хотя это прекрасно работает для некоторых приложений, для других это работает странно.

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

А у других он перезапускается в первый раз, а затем начинает возобновляться. Для таких приложений, как Whatsapp, Adobe Reader.

При запуске приложений из других лаунчеров таких проблем нет.


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

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


Редактировать

Если это как-то связано с манифестом, вот оно,

  ...  
  <activity
        android:name=".SwitchActivity"
        android:excludeFromRecents="true"
        android:label="@string/title_activity_switch"
        android:noHistory="true"
        android:launchMode="singleTask"
        android:clearTaskOnLaunch="true"
        android:stateNotNeeded="true"
        android:theme="@android:style/Theme.NoDisplay">
  ...

person Abhishek    schedule 04.09.2015    source источник
comment
Что произойдет, если вы просто используете Intent, возвращенный getLaunchIntentForPackage(), не изменяя его?   -  person Karakuri    schedule 04.09.2015
comment
@Karakuri Затем все приложения пересчитываются.   -  person Abhishek    schedule 04.09.2015


Ответы (1)


Попробуйте удалить линии между ними, как это

 Intent i = getPackageManager().getLaunchIntentForPackage(pkgName);

 if (switchIntent != null) startActivity(i);

Проблема, вероятно, вызвана следующей строкой

i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                            | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

Более того, setAction и addCategory тоже не нужны, так как их уже должен сделать getLaunchIntentForPackage.

Редактировать:

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

Однако getRunningTasks отключено, начиная с Lollipop.

http://developer.android.com/reference/android/app/ActivityManager.html

Этот метод устарел на уровне API 21. Начиная с LOLLIPOP, этот метод больше не доступен для сторонних приложений: введение ориентированных на документы недавних сообщений означает, что он может передавать информацию о человеке вызывающей стороне. Для обратной совместимости он по-прежнему будет возвращать небольшое подмножество своих данных: по крайней мере, собственные задачи вызывающей стороны и, возможно, некоторые другие задачи, такие как home, которые, как известно, не являются конфиденциальными.

person Derek Fung    schedule 04.09.2015
comment
Удалил строки, как вы сказали, но все равно безуспешно :( - person Abhishek; 04.09.2015
comment
это хоть решит эту проблему? And for others, it restarts for the first time and then starts resuming. For applications like Whatsapp, Adobe Reader. - person Derek Fung; 04.09.2015
comment
Да есть, только что проверил. Эта проблема исправлена, но другая все еще существует. - person Abhishek; 04.09.2015
comment
На самом деле getLaunchIntentForPackage эквивалентно открытию приложения в Launcher или домашнем экране, который вы можете вызвать. Таким образом, для некоторых приложений оно может быть спроектировано таким образом, что оно не возобновится, если вы откроете его из Launcher. - person Derek Fung; 04.09.2015
comment
Ооо, а что добавляют в него другие лаунчеры, чтобы нормально возобновить работу этих приложений? - person Abhishek; 04.09.2015
comment
если вы говорите о кнопке переключения задач на Android, я полагаю, что она обрабатывается системным приложением, а не Launcher, я отредактировал, чтобы добавить еще одну альтернативу, однако getRunningTasks был отключен с Lollipop - person Derek Fung; 04.09.2015
comment
Нет-нет, даже лаунчеры возобновляют работу этих приложений даже в Lollipop. Не знаю как :( - person Abhishek; 04.09.2015
comment
Вы уверены, что это лаунчеры? Какой лаунчер? Может быть, я тоже посмотрю и чему-нибудь научусь. - person Derek Fung; 04.09.2015
comment
Средство запуска по умолчанию, похоже, работает как-то, но я попробую это на телефоне моего друга с леденцом, используя другие средства запуска, и свяжусь позже. Спасибо. - person Abhishek; 04.09.2015
comment
Только скажите, что нет целой кучи таких приложений, которые нельзя возобновить. - person Abhishek; 04.09.2015
comment
Совсем не работает, братан, не в Lollipop. Все приложения перезапускаются. - person Abhishek; 04.09.2015