Facebook глубокая ссылка на Android
Я пытаюсь реализовать функцию Facebook Deep Linking в своем приложении и столкнулся со следующим сценарием:
У меня есть функция 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
}
}
Все идет согласно плану, за исключением следующего сценария:
- Пользователь запустил мое приложение
- Создана MainActivity.
- Создана вторичная активность
- MainActivity завершена
- Приложение переходит в фоновое изображение с помощью кнопки устройства.
- Глубокая ссылка попадает в приложение Facebook.
В этом случае мое приложение снова переходит на передний план, но MainActivity onCreate/onNewIntent
не вызывается, вместо этого SecondaryActivity onResume() вызывается и восстанавливается
Последнее состояние.
Примечание. Я протестировал эту проблему на Samsung Nexus с Android 4.2.1 и получил этот результат, хотя при тестировании на Galaxy S1 с Android 2.3.5 он работал, как я и ожидал.
Любая помощь будет принята с благодарностью,
Спасибо.
Ответы
Ответ 1
Facebook запускает ваше приложение из своего собственного приложения, явно запустив свой "MainActivity" (тот, который вы предоставили на странице разработчика).
тем самым: поведение Android по умолчанию: если приложение уже выполняется, повторный вызов startActivity()
не запускает новую задачу с нуля, но восстанавливает только переднюю задачу уже запущенной задачи.
но хорошая новость заключается в том, что вы можете изменить это поведение по умолчанию, добавив в свой MainActivity android:launchMode="singleTask"
. это определение:
система создает новую задачу и запускает действие в корне новой задачи. Однако, если экземпляр активности уже существует в отдельной задаче, система перенаправляет намерение на существующий экземпляр посредством вызова его метода onNewIntent() вместо создания нового экземпляра. Только один экземпляр действия может существовать одновременно.
с этого момента вы всегда можете ответить на исходное намерение, и с этой точки вы всегда можете вернуться к задаче, которая уже была в фоновом режиме (если существует), перезапустив активность с помощью обоих флагов Intent.FLAG_ACTIVITY_SINGLE_TOP
&& Intent.FLAG_ACTIVITY_CLEAR_TOP
комбинация
Ответ 2
См. http://developer.android.com/guide/topics/manifest/activity-element.html
Вы можете играть с помощью:
android:clearTaskOnLaunch
android:noHistory
android:launchMode
Ответ 3
Вам нужно иметь больше информации в вашем фильтре намерений:
<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-адрес), и направьте их на любой вид деятельности, который вы определяете в этом объекте.