2016-03-11 37 views
36

Il collegamento diretto non funziona se l'app è già stata aperta tramite link diretto.Il collegamento diretto Android non funziona se l'app viene aperta tramite il collegamento diretto già

Tuttavia, se apro l'app non attivando un deeplink, ad esempio facendo clic sull'icona dell'app per aprire l'app. Quindi attivare il deeplink in seguito funzionerebbe sempre.


Arrivano i dettagli:

Così ho la mia attività specificati in questo modo in AndroidManifest, vale a dire LaunchActivity.

<activity 
    android:name="some.package.name.LaunchActivity" 
    android:screenOrientation="portrait" 
    android:theme="@style/Theme.SomeTheme"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </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:scheme="dlscheme" android:host="dlhost" /> 
    </intent-filter> 
</activity> 

E in LaunchActivity, vorrei stampare un log in onCreate() per indicare che ci sono stato.

ho usato

adb shell am start -W -a android.intent.action.VIEW -d "dlscheme://dlhost/param" some.package.name 

per testare il profondo legame.

Con l'app uccisa, ho utilizzato il comando precedente. Può aprire l'app e dirigersi verso l'attività corretta, nessun problema. E avere il seguente registro.

adb shell am start -W -a android.intent.action.VIEW -d "dlscheme://dlhost/param" some.package.name 
Starting: Intent { act=android.intent.action.VIEW dat=dlscheme://dlhost/param pkg=some.package.name } 
Status: ok 
Activity: some.package.name/.activity.LaunchActivity 
ThisTime: 898 
TotalTime: 898 
WaitTime: 919 
Complete 

Tuttavia, se inserisco nuovamente lo stesso comando, senza uccidere l'app. Aprirebbe solo l'app, ma non aprirà l'attività corretta e produrrà il seguente registro.

adb shell am start -W -a android.intent.action.VIEW -d "dlscheme://dlhost/param" some.package.name 
Starting: Intent { act=android.intent.action.VIEW dat=dlscheme://dlhost/param pkg=some.package.name } 
Warning: Activity not started, its current task has been brought to the front 
Status: ok 
Activity: some.package.name/.activity.LaunchActivity 
ThisTime: 0 
TotalTime: 0 
WaitTime: 6 
Complete 

con questa linea aggiuntiva

Warning: Activity not started, its current task has been brought to the front 

in realtà ho provato anche questo con un sito web, utilizzando questo intento cromo:

intent://dlhost/param#Intent;scheme=dlscheme;package=some.package.name;end 

e sarebbe lo stesso comportamento.

+0

Si vede il messaggio "Impostazione dell'ultima attività selezionata" in logcat? Stavo vedendo lo stesso comportamento, ma quel messaggio sembra indicare che questo comportamento è inteso. – Shane

risposta

2
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_recipe); 
    onNewIntent(getIntent()); 
} 

protected void onNewIntent(Intent intent) { 
    String action = intent.getAction(); 
    String data = intent.getDataString(); 
    if (Intent.ACTION_VIEW.equals(action) && data != null) { 
     String recipeId = data.substring(data.lastIndexOf("/") + 1); 
     Uri contentUri = RecipeContentProvider.CONTENT_URI.buildUpon() 
       .appendPath(recipeId).build(); 
     showRecipe(contentUri); 
    } 
} 
+0

Bene bello ... ma cosa fa questo codice? – Aks4125

5

Aggiungere android:launchMode="singleTop" in manifesta nelle vostre LaunchActivity tag attività

4

ho scoperto che l'aggiunta di android:launchMode="singleTask" opere. singleTop non ha funzionato per me.

3

Il file Mainefest assomiglia a questo campione

<activity 
        android:name=".user.HomeActivity" 
        android:screenOrientation="portrait" 
        android:exported="true" 
        android:launchMode="singleTop" 
        android:windowSoftInputMode="stateAlwaysHidden" 
        android:theme="@style/AppTheme.NoActionBar" > 
        <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="example"/> 
         <data android:host="example.com" 
          android:pathPrefix="/deeplink"/> 
         <action android:name="android.intent.action.MAIN" /> 
        </intent-filter> 
       </activity> 

HomeActivity

@Override 
      protected void onNewIntent(Intent intent) { 
       super.onNewIntent(intent); 
       Uri data = intent.getData(); 
       if (data != null) 
        callDeep(data); 
       setIntent(intent); 
       Log.d("DeepLinking", "new intent value==>" + data + "==== value===>"); 
      } 
     //or in on create 
     @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_home); 
      Uri data = intent.getData(); 
       Log.d("DeepLinking", "intent value==>" + data + "==== value===>" + bundle + "===action==>" + action); 
     } 
2

nel file manifesto del progetto, è necessario aggiungere il seguito alla vostra attività principale.

android:launchMode="singleTask" 

Così, nel manifesto, si dovrebbe avere qualcosa di simile a quello qui sotto:

<activity android:name="some.package.name.LaunchActivity" 
     android:launchMode="singleTask"> 
     android:screenOrientation="portrait" 
     android:theme="@style/Theme.SomeTheme"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </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:scheme="dlscheme" android:host="dlhost" /> 
      </intent-filter> 
</activity> 

Fondamentalmente ciò che fa è creare una nuova attività e una nuova istanza sarà spinto al compito come radice uno.Tuttavia, se esiste un'istanza di attività in qualsiasi attività, il sistema indirizza l'intento a quell'istanza di attività tramite la chiamata al metodo onNewIntent(). In questa modalità, le istanze di attività possono essere trasferite alla stessa attività. E se l'utente fa clic sul tasto INDIETRO dall'attività corrente, il sistema restituirà l'utente all'attività precedente.

D'altra parte, in singleTop se esiste già un'istanza di attività nella parte superiore dell'attività corrente e percorsi di sistema a questa attività, non verrà creata alcuna nuova istanza perché verrà generato un metodo onNewIntent() di creare un nuovo oggetto.

Maggiori informazioni possono essere trovate here.

2

"aggiungere Android: launchMode =" singleTop "in manifesta con la vostra attività"

se la modalità di lancio è di default allora questo allarme arriva "Attenzione: L'attività non ha iniziato, l'operazione in corso è stato portato al fronte "perché ogni volta che viene creando nuova istanza della vostra attività, mentre se si utilizza la modalità di lancio singolo Top allora il metodo onNewIntent() chiamato invece di creare un nuovo oggetto

2

Dal registro sua ha dichiarato:" Attenzione: L'attività non ha iniziato, il suo compito attuale è stato portato in primo piano ", quindi una nuova istanza dell'attività non è crea ted. In questi casi il nuovo intento verrà reindirizzato su onNewIntent (intento intenzionale) dell'attività.

Nel tuo caso sospetto che tu non abbia scavalcato questo metodo e estrarrà informazioni dal mehtod onCreate() dell'attività.

creare invece un metodo simile extractDataFromIntentAndProcess (intento Intent) e richiamarla da metodo OnCreate (extractDataFromIntentAndProcess (getIntent())) & anche da metodo onNewIntent (extractDataFromIntentAndProcess (intenti)) della vostra attività.

Problemi correlati