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