2013-04-24 11 views
20

próbuję wdrożyć precyzyjne linki funkcji Facebooka na moim app i napotkał następujący scenariusz:Facebook głębokie powiązanie na Androida

Mam aktywność nazywa główną działalność, która jest zadeklarowana tak:

<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> 

To działanie + nazwa mojego pakietu są również zadeklarowane w ustawieniach mojej aplikacji na stronie dewelopera facebook.

Po kliknięciu łącza na aplikacji Facebooka, mam obsłużyć to wydarzenie za pomocą metody onCreate mojej aktywności. Poniższy kod obsługi zdarzenia:

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 
     } 
    } 

Wszystko idzie zgodnie z planem, z wyjątkiem następujących sytuacji:

  1. użytkownika rozpoczętego moją aplikację
  2. główną działalność utworzonego
  3. SecondaryActivity stworzony
  4. główną działalność zakończone
  5. Aplikacja przechodzi do tła za pomocą urządzenia hom Przycisk e
  6. Głęboki związek dostaje kliknięciu na Facebooka aplikacji

W tym przypadku moja aplikacja przechodzi ponownie na pierwszym planie, ale główną działalność na onCreate/onNewIntent nie daj się nazywa, zamiast SecondaryActivity za onResume() jest wywoływana i przywrócony do to jest ostatni stan: .

Uwaga: testowałem ten problem na Samsung Nexusie z Androidem 4.2.1 i osiągnąłem ten wynik, chociaż testowany na Galaxy S1 z Androidem 2.3.5 działał tak, jak początkowo zakładałem.

Każda pomoc byłaby bardzo doceniana, Dziękuję.

+1

+1: Zauważyłem ten problem/problem/nieporozumienie dotyczące ics + również z powiadomieniami. –

+0

Witaj, Tomku, pomóż mi w rozwiązaniu tego głębokiego linku do Facebooka http://stackoverflow.com/q/22372788/1503130 – Prateek

Odpowiedz

9

Facebook uruchamia aplikację z własnej aplikacji jawnie rozpocząć swoją „główną działalność” (ten, Twój przewidzianego je na stronie dewelopera).

według tego - domyślne zachowanie Androida to: jeśli aplikacja jest już uruchomiona, ponowne wywołanie do startActivity() nie rozpocznie nowego zadania od nowa, ale tylko przywróci na pierwszym planie już uruchomione zadanie.

ale dobrą wiadomością jest to, że możesz zmienić to domyślne zachowanie, dodając do swojej MainActivity android:launchMode="singleTask".to jest:

system tworzy nowe zadanie i tworzy instancję działania w katalogu głównym nowego zadania. Jeśli jednak wystąpienie działania już istnieje w oddzielnym zadaniu, system kieruje intencję do istniejącej instancji poprzez wywołanie metody onNewIntent() zamiast tworzenia nowej instancji. W danym momencie może istnieć tylko jedna instancja działania.

od tego momentu zawsze można odpowiedzieć na zamiarem wyjścia i od tego momentu zawsze można nawigować z powrotem do zadania, które już były w tle (jeśli istnieje) poprzez ponowne uruchomienie aktywności z obu flag Intent.FLAG_ACTIVITY_SINGLE_TOP & & Intent.FLAG_ACTIVITY_CLEAR_TOP kombinowane

0

Trzeba mieć więcej informacji w filtrze zamiar:

<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> 

To uchwycić linki zamiar witryny (upewnij się, aby zmienić adres URL) i kierować je na cokolwiek aktywny zdefiniować Ta metoda filtru pod.

Powiązane problemy