web-dev-qa-db-ger.com

Android Deep Link funktioniert nicht, wenn die App bereits über Deep Link geöffnet wurde

Deep Link funktioniert nicht, wenn die App bereits über Deep Link geöffnet wurde.

Wenn ich die App jedoch nicht öffne, indem ich einen Deeplink auslöse, klicken Sie beispielsweise auf das App-Symbol, um die App zu öffnen. Dann würde es immer funktionieren, wenn Sie anschließend den Deeplink auslösen.


Hier kommen die Details:

So habe ich meine Aktivität in AndroidManifest eingerichtet, nämlich 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>

Und in LaunchActivity würde ich ein Protokoll in onCreate () drucken, um anzuzeigen, dass es dort gewesen ist.

Ich benutzte

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

um den deep link zu testen.

Nachdem die App beendet wurde, habe ich den obigen Befehl verwendet. Es kann die App öffnen und zur richtigen Aktivität weiterleiten, kein Problem. Und haben das folgende Protokoll.

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

Wenn ich jedoch den gleichen Befehl erneut eingebe, ohne die App zu beenden. Es wird nur die App geöffnet, aber nicht die richtige Aktivität und das folgende Protokoll erstellt.

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

mit dieser extra leitung

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

Ich habe es auch mit einer Website versucht, mit der Absicht chrome:

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

und es würde sich genauso verhalten.

50
Shing

Hinzufügen Android:launchMode="singleTop" in Manifest in Ihren LaunchActivity-Aktivitätstags

8
DDsix

In der Manifestdatei Ihres Projekts müssen Sie Ihrer Hauptaktivität die folgenden Elemente hinzufügen.

Android:launchMode="singleTask"

Im Manifest hätten Sie also etwas Ähnliches wie das Folgende:

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

Im Grunde bedeutet dies, dass eine neue Aufgabe erstellt wird und eine neue Instanz als Stamminstanz an die Aufgabe übertragen wird. Wenn jedoch in einem Vorgang eine Aktivitätsinstanz vorhanden ist, leitet das System die Absicht über den Methodenaufruf onNewIntent () an diese Aktivitätsinstanz weiter. In diesem Modus können Aktivitätsinstanzen an dieselbe Aufgabe übertragen werden. Wenn der Benutzer in der aktuellen Aktivität auf die Taste ZURÜCK klickt, kehrt das System zum vorherigen Vorgang zurück.

Auf der anderen Seite wird in singleTop keine neue Instanz erstellt, da eine onNewIntent () -Methode ausgelöst wird, wenn oben in der aktuellen Aufgabe bereits eine Aktivitätsinstanz vorhanden ist und das System die Absicht zu dieser Aktivität weiterleitet anstatt ein neues Objekt zu erstellen.

Weitere Informationen finden Sie hier .

7

Ich fand das Hinzufügen von Android:launchMode="singleTask" funktioniert. singleTop hat bei mir nicht funktioniert.

6
user1325843

In der Manifestdatei Ihres Projekts müssen Sie Ihrer Hauptaktivität die folgenden Elemente hinzufügen.

Android:launchMode="singleTask"

Und kümmere dich um den Deeplink in 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

Die Mainefest-Datei sieht aus wie in diesem Beispiel

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

HomeAktivität

@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

"Android hinzufügen: launchMode =" singleTop "im Manifest mit Ihrer Aktivität"

wenn der Startmodus standardmäßig eingestellt ist, wird die Warnung "Warnung: Die Aktivität wurde nicht gestartet, die aktuelle Aufgabe wurde in den Vordergrund gestellt" angezeigt, da jedes Mal, wenn eine neue Instanz Ihrer Aktivität erstellt wird, der Startmodus "Single Top" verwendet wird, die Methode "onNewIntent ()" aufgerufen, anstatt ein neues Objekt zu erstellen

2

Aus den Protokollen geht hervor, dass "Warnung: Aktivität nicht gestartet, die aktuelle Aufgabe wurde in den Vordergrund gestellt", sodass keine neue Instanz der Aktivität erstellt wird. In solchen Fällen wird die neue Absicht zu onNewIntent (Absicht) der Aktivität umgeleitet.

Ich vermute, Sie haben diese Methode nicht überschrieben und extrahieren Informationen aus dem onCreate () -Methode der Aktivität.

Erstellen Sie stattdessen eine Methode wie extractDataFromIntentAndProcess (Absicht) und rufen Sie sie über die oncreate-Methode (extractDataFromIntentAndProcess (getIntent ()) und auch über die onNewIntent-Methode (extractDataFromIntentAndProcess (Absicht)) Ihrer Aktivität auf.

2
NIPHIN