web-dev-qa-db-fra.com

Android lien profond ne fonctionne pas si l'application est déjà ouverte par lien profond

Le lien profond ne fonctionne pas si l'application est déjà ouverte par un lien profond.

Cependant, si j'ouvre l'application pas en déclenchant un lien profond, comme en cliquant sur l'icône de l'application pour ouvrir l'application. Ensuite, déclencher un lien profond ultérieurement fonctionnerait toujours.


Voici les détails:

J'ai donc mon activité configurée comme ceci dans AndroidManifest, à savoir 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>

Et dans LaunchActivity, j'imprimais un journal sur onCreate () pour indiquer qu'il y était.

J'ai utilisé

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

pour tester le lien profond.

Avec l'application supprimée, j'ai utilisé la commande ci-dessus. Il peut ouvrir l'application et vous diriger vers l'activité correcte, pas de problème. Et ayez le journal suivant.

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

Cependant, si j'entre à nouveau la même commande, sans tuer l'application. Cela n'ouvrirait que l'application, mais n'ouvrirait pas l'activité correcte et produirait le journal suivant.

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

avec cette ligne supplémentaire

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

En fait, j'ai également essayé cela avec un site Web, en utilisant cette intention chrome:

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

et il se comporterait de la même manière.

50
Shing

Ajouter Android:launchMode="singleTop" en manifeste dans vos balises d'activité LaunchActivity

8
DDsix

Dans le fichier manifeste de votre projet, vous devez ajouter ce qui suit à votre activité principale.

Android:launchMode="singleTask"

Donc, dans le manifeste, vous auriez quelque chose de similaire à ce qui suit:

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

Fondamentalement, cela crée une nouvelle tâche et une nouvelle instance sera poussée vers la tâche en tant que racine. Cependant, si une instance d'activité existe dans une tâche, le système achemine l'intention vers cette instance d'activité via l'appel de méthode onNewIntent (). Dans ce mode, les instances d'activité peuvent être poussées vers la même tâche. Et si l'utilisateur clique sur la touche RETOUR de l'activité en cours, le système ramènera l'utilisateur à l'activité précédente.

D'un autre côté, dans singleTop si une instance d'activité existe déjà en haut de la tâche actuelle et que les routes système sont destinées à cette activité, aucune nouvelle instance ne sera créée car elle déclenchera une méthode onNewIntent () au lieu de créer un nouvel objet.

Plus d'informations peuvent être trouvées ici .

7
Michele La Ferla

J'ai trouvé que l'ajout de Android:launchMode="singleTask" travaux. singleTop n'a pas fonctionné pour moi.

6
user1325843

Dans le fichier manifeste de votre projet, vous devez ajouter ce qui suit à votre activité principale.

Android:launchMode="singleTask"

Et gérer le lien profond à l'intérieur de onNewIntent()

@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);
    }
}
6
resource8218

Le fichier Mainefest ressemble à cet exemple

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

AccueilActivité

@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);
        }
4
pankaj yadav

"ajouter Android: launchMode =" singleTop "en manifeste avec votre activité"

si votre mode de lancement est par défaut, cet avertissement apparaît "Avertissement: l'activité non démarrée, sa tâche actuelle a été mise en avant" car chaque fois qu'il crée une nouvelle instance de votre activité, si vous utilisez le mode de lancement Single Top, la méthode onNewIntent () appelé au lieu de créer un nouvel objet

2
ashish srivastava

À partir des journaux, il est dit "Avertissement: l'activité n'a pas démarré, sa tâche actuelle a été placée au premier plan", de sorte qu'une nouvelle instance de l'activité n'est pas créée. Dans de tels cas, la nouvelle intention sera redirigée vers onNewIntent (intention d'intention) de l'activité.

Dans votre cas, je soupçonne que vous n'avez pas outrepassé cette méthode et que vous extrairez des informations du mehtod onCreate () de l'activité.

Au lieu de cela, créez une méthode comme extractDataFromIntentAndProcess (intention d'intention) et invoquez-la à partir de la méthode oncreate (extractDataFromIntentAndProcess (getIntent ())) & également à partir de la méthode onNewIntent (extractDataFromIntentAndProcess (intention)) de votre activité.

2
NIPHIN