pantalla negra carga android deep-linking

android - negra - spotify no carga



El enlace profundo de Android no funciona si la aplicación ya está abierta por un enlace profundo (7)

El enlace profundo no funciona si la aplicación ya está abierta por un enlace profundo.

Sin embargo, si abro la aplicación, no desencadenar un enlace, como hacer clic en el icono de la aplicación para abrirla. Entonces, disparar el deeplink después siempre funcionaría.

Aquí vienen los detalles:

Así que tengo mi actividad configurada de esta manera en AndroidManifest, a saber, 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>

Y en LaunchActivity, imprimiría un registro en onCreate () para indicar que ha estado allí.

solía

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

para probar el enlace profundo.

Con la aplicación muerta, usé el comando anterior. Puede abrir la aplicación y encaminar a la actividad correcta, no hay problema. Y tener el siguiente 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

Sin embargo, si vuelvo a ingresar el mismo comando, sin matar la aplicación. Solo abriría la aplicación, pero no abrirá la actividad correcta y generará el siguiente 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 esta linea extra

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

En realidad, también intenté esto con un sitio web, usando esta intención de Chrome:

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

Y se comportaría igual.


"agrega android: launchMode =" singleTop "en el manifiesto con tu actividad"

si su modo de inicio es el predeterminado, entonces aparece esta advertencia "Advertencia: la actividad no se inició, su tarea actual se ha llevado al frente" porque cada vez que crea una nueva instancia de su actividad, si utiliza el modo de inicio Single Top, entonces el método onNewIntent () Llamado en lugar de crear un nuevo objeto.


Agregue android:launchMode="singleTop" en el manifiesto en sus etiquetas de actividad LaunchActivity


Desde los registros se dice "Advertencia: la actividad no comenzó, su tarea actual se ha llevado al frente", por lo que no se crea una nueva instancia de la actividad. En tales casos, la nueva intención se redirigirá a onNewIntent (intención de intención) de la actividad.

En su caso, sospecho que no ha anulado este método y extraerá información del método onCreate () de la actividad.

En su lugar, cree un método parecido a extractDataFromIntentAndProcess (Intención) e invoque desde el método oncreate (extractDataFromIntentAndProcess (getIntent ())) y también desde el método onNewIntent (extractDataFromIntentAndProcess (intent)) de su actividad.


El archivo Mainefest se parece a este ejemplo.

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

InicioActividad

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


En el archivo de manifiesto de su proyecto, debe agregar el seguimiento a su actividad principal.

android:launchMode="singleTask"

Entonces, en el manifiesto, tendrías algo similar a lo siguiente:

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

Básicamente, lo que esto hace es crear una nueva tarea y una nueva instancia se enviará a la tarea como la raíz. Sin embargo, si existe alguna instancia de actividad en alguna tarea, el sistema dirige la intención a esa instancia de actividad a través de la llamada al método onNewIntent (). En este modo, las instancias de actividad se pueden enviar a la misma tarea. Y si el usuario hace clic en la tecla ATRÁS de la actividad actual, el sistema devolverá al usuario a la actividad anterior.

Por otro lado, en singleTop si ya existe una instancia de actividad en la parte superior de la tarea actual y el sistema encamina la intención de esta actividad, no se creará una nueva instancia porque activará un método onNewIntent () en lugar de crear una nueva objeto.

Más información se puede encontrar here .


Encontré que agregar android:launchMode="singleTask" funciona. singleTop no funcionó para mí.


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