Facebook глубокая привязка к Android

Я пытаюсь реализовать функцию глубокой привязки Facebook в своем приложении и столкнулся со следующим сценарием:

У меня есть активность под названием MainActivity, которая объявляется так:

<activity android:name="com.mypackage.android.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 

Это действие + имя моего пакета также объявлено в настройках моего приложения на веб-сайте разработчика facebook.

Как только ссылка нажимается на приложение Facebook, я должен обрабатывать это событие с помощью метода onCreate моей деятельности. Следующий код обрабатывает событие:

  public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Uri target = getIntent().getData(); if (target != null){ // got here via Facebook deep link // once I'm done parsing the URI and deciding // which part of my app I should point the client to // I fire an intent for a new activity and // call finish() the current activity (MainActivity) }else{ // activity was created in a normal fashion } } 

Все идет согласно плану, за исключением следующего сценария:

  1. Пользователь запустил мое приложение
  2. Создана MainActivity
  3. Создана вторичная активность
  4. MainActivity завершена
  5. Приложение переходит к фону с помощью кнопки устройства на устройстве
  6. Глубокая ссылка нажимается на приложение Facebook

В этом случае мое приложение снова переходит на передний план, но функция onCreate / onNewIntent MainActivity не вызывается, вместо этого функция onResume () SecondaryActivity вызывается и восстанавливается до последнего состояния.

Примечание. Я протестировал эту проблему на Samsung Nexus с Android 4.2.1 и получил этот результат, хотя при тестировании на Galaxy S1 с Android 2.3.5 он работал, как я и ожидал.

Любая помощь будет принята с благодарностью, спасибо.

Facebook запускает ваше приложение из собственного приложения, явно запустив «MainActivity» (тот, который вы предоставили им на странице разработчика).

startActivity() самым – поведение Android по умолчанию: если приложение уже выполняется, то вызов снова в startActivity() не запускает новую задачу с нуля, а восстанавливает только startActivity() задачу уже запущенной задачи.

Но хорошей новостью является то, что вы можете изменить это поведение по умолчанию, добавив в свой MainActivity android:launchMode="singleTask" . Это определение:

Система создает новую задачу и запускает действие в корне новой задачи. Однако, если экземпляр активности уже существует в отдельной задаче, система направляет намерение на существующий экземпляр посредством вызова его метода onNewIntent () вместо создания нового экземпляра. За один раз может существовать только один случай активности.

С этого момента вы всегда можете ответить на начальное намерение, и с этой точки вы всегда можете вернуться к задаче, которая уже была в фоновом режиме (если существует), перезапустив Intent.FLAG_ACTIVITY_SINGLE_TOP с помощью обоих флагов. Intent.FLAG_ACTIVITY_SINGLE_TOP && комбинация Intent.FLAG_ACTIVITY_CLEAR_TOP

См. http://developer.android.com/guide/topics/manifest/activity-element.html.

Вы можете играть с:

 android:clearTaskOnLaunch android:noHistory android:launchMode 

Вы должны иметь больше информации в своем фильтре намерений:

 <intent-filter> <action android:name="android.intent.action.VIEW"></action> <category android:name="android.intent.category.DEFAULT"></category> <category android:name="android.intent.category.BROWSABLE"></category> <data android:host="www.yoursite.com" android:scheme="http"></data> </intent-filter> 

Это позволит захватить ссылки, идущие на ваш сайт (обязательно измените URL-адрес), и направить их на любой вид деятельности, который вы определяете в этом проекте.