2016-10-12 2 views
2

Я разрабатываю приложение для Android, которое имеет 2 метода запуска. Один из них - обычный способ, нажав значок приложения на телефоне. Другой метод - это глубокая ссылка с веб-сайта.Android: Recents начинает некорректную деятельность

Deeplink также отправляет некоторые данные, которые приложение должно выполнять «материал». Однако это следует делать только один раз. Когда операция депипликации завершена, она начинает основное действие. Однако, когда я нажимаю (на устройстве) и открываю приложение из recents, он снова открывает операцию deeplink.

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

Как предотвратить запуск активности deeplink из недавних приложений?

Мои Manifest:

<activity 
     android:name="MainActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:launchMode="singleTask" 
     android:theme="@style/AppTheme"> 
    </activity> 

    <activity 
     android:name="DeeplinkActivity" 
     android:label="@string/app_name" 
     android:noHistory="true" 
     android:screenOrientation="portrait" 
     android:launchMode="singleTask" 
     android:theme="@style/AppTheme"> 

     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:scheme="app_name" android:host="test" /> 
     </intent-filter> 

     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:host="test" android:path="/" android:scheme="app_name" /> 
     </intent-filter> 
    </activity> 

Для переключения на MainActivity я делаю следующее:

 Intent intent = new Intent(this, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 

EDIT: Это сообщение было помечено как дубликат с: Android: Starting app from 'recent applications' starts it with the last set of extras used in an intent

Однако, что после относится к одной и той же деятельности. Я хочу изменить корневую активность, поэтому, когда я запускаю приложение из recents, он не запускает DeeplinkActivity. Да, в качестве обходного пути я могу проверить флаг Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY. Но каждый раз, когда пользователь запускает приложение из recents, DeeplinkActivity открывается, пока он больше не нужен.

Установка и/или удаление значений целевого назначения не работает. Я использую информацию из getIntent(). GetData()

Если вы все еще чувствуете, что это дубликат, пожалуйста, объясните.

+0

Я открыл вопрос. –

ответ

1

Ваша проблема в том, что оба DeepLinkActivity и MainActivity находятся в одной и той же задачи, поэтому, когда пользователь выбирает приложение из списка последних задач, Android будет либо привести существующую задачу на первый план, или, если нет существующей задачи (с активной/активной деятельностью в нем), запустите Activity, который был корнем Activity в самой последней задаче. Вы не можете предсказать, какой из Activity будет корнем Activity, так как задача может быть запущена либо с DeepLinkActivity, либо с MainActivity, в зависимости от того, какой пользователь выбрал первым.

Вам действительно нужно иметь две отдельные задачи для этого. Одна задача будет содержать ваш DeepLinkActivity, и эту задачу следует исключить из «недавнего списка задач». Другая задача будет содержать ваш MainActivity.

Я предполагаю, что MainActivity имеет <intent-filter> с ACTION = MAIN и CATEGORY = LAUNCHER, хотя ваш опубликованный манифест не показывает это.

Ваш манифест должен выглядеть следующим образом:

<activity 
    android:name="MainActivity" 
    android:label="@string/app_name" 
    android:screenOrientation="portrait" 
    android:theme="@style/AppTheme"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

<activity 
    android:name="DeeplinkActivity" 
    android:label="@string/app_name" 
    android:noHistory="true" 
    android:screenOrientation="portrait" 
    android:taskAffinity="" 
    android:excludeFromRecents="true" 
    android:theme="@style/AppTheme"> 

    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <data android:scheme="app_name" android:host="test" /> 
    </intent-filter> 

    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <data android:host="test" android:path="/" android:scheme="app_name" /> 
    </intent-filter> 
</activity> 

Вы, безусловно, не нужно launchMode="singleTask" для MainActivity, и вы, вероятно, не нужно для DeepLinkActivity либо (это зависит от того, что еще вы делаете с этим).

taskAffinity="" Указания гарантирует, что DeepLinkActivity не запускается в те же задачи, как MainActivity, и позволяет запускать MainActivity из DeepLinkActivity в отдельной задаче. ПРИМЕЧАНИЕ. Без указания taskAffinity оба действия будут работать в одной и той же задаче, даже если вы укажете launchMode="singleTask" для обоих из них.

Задание excludeFromRecents="true" на DeepLinkActivity сообщает Android, что задача с DeepLinkActivity в качестве ее корневой активности не должна отображаться в списке последних задач.

При запуске MainActivity из DeepLinkActivity, вы должны сделать это:

Intent intent = new Intent(this, MainActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 

и убедитесь, что вы называете finish() на DeepLinkActivity.

При необходимости вы также можете добавить noHistory="true" в DeepLinkActivity, но я не думаю, что это необходимо. Если пользователь находится в DeepLinkActivity и получает входящий телефонный звонок, по окончании телефонного разговора должен отображаться DeepLinkActivity. Если вы укажете noHistory="true", DeepLinkActivity будет завершен немедленно, когда пользователь примет входящий телефонный звонок.

Дайте мне знать, если это ясно и работает на вас.

+1

Спасибо за твой зонт. На самом деле, это способ решить мою проблему. Как небольшая заметка. – remcoj

+0

для меня потребовалось использовать noHistory. Потому что в вашем примере есть вызов. Когда пользователь возвращается в приложение, процесс необходимо перезагрузить. – remcoj

Смежные вопросы