versiones sistema pie operativo developer caracteristicas app android

android - sistema - Error: onNewIntent no se llama para la actividad SingleTop con Intent.FLAG_ACTIVITY_NEW_TASK



android sistema operativo (1)

Esto es un poco tarde, pero como acabo de encontrarlo, como menciona Matt, la actividad de la bandera en la parte superior superior en el manifiesto y en la intención no es la misma (al menos en las versiones anteriores de Android).

en el método startActivityUncheckedLocked :

en gingerbread - https://github.com/android/platform_frameworks_base/blob/gingerbread/services/java/com/android/server/am/ActivityStack.java

mira la linea 2204 -

if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 && taskTop.realActivity.equals(r.realActivity)) {

así que solo está marcando las banderas de lanzamiento en la intención, y no revisando el manifiesto. compare esto con el lanzamiento de jellybean mr1:

https://github.com/android/platform_frameworks_base/blob/jb-mr1-release/services/java/com/android/server/am/ActivityStack.java

mira la linea 2835

if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) && taskTop.realActivity.equals(r.realActivity)) {

así que parece que en mr1, están comprobando r.launchMode (probablemente el valor de AndroidManifest.xml ) además de launchFlags (probablemente de la intención en sí), mientras que en las versiones anteriores, solo estaban comprobando las banderas de intención.

en realidad fue reparado el 16 de febrero de 2012, en este compromiso: https://github.com/android/platform_frameworks_base/commit/f363dfd26c304bca33f12065a9ed3de291193962

versión corta es: establezca la única bandera superior tanto en la intención como en el manifiesto.

(gracias a este comentario sobre el error asociado en el rastreador de errores de Android por indicarme a qué archivo fuente buscar: http://code.google.com/p/android/issues/detail?id=4155#c9 ).

Parece que hay un error en startActivity .

Al configurar las actividades para que sean singleTop con singleTop diferente en AndroidManifest.xml y usar Intent.FLAG_ACTIVITY_NEW_TASK al llamar a startActivity , se pueden crear dos actividades en dos tareas (una actividad por tarea).

startActivity llamar a startActivity volverá a la primera actividad / tarea y se llamará onNewIntent . Sin embargo, llamar a startActivity por cuarta vez volverá a la segunda actividad / tarea, pero no se llama onNewIntent .

La única diferencia entre las dos tareas es su taskAffinity tareas. De alguna manera, se observa un comportamiento asimétrico.

Sin embargo, si también se usa el Intent.FLAG_ACTIVITY_SINGLE_TOP , entonces se llama onNewIntent como se esperaba.

Parece que singleTop en AndroidManifest.xml no es lo mismo que Intent.FLAG_ACTIVITY_SINGLE_TOP en la Intent .

public class ActivityA extends Activity implements OnClickListener { private String tag; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); tag = getClass().getName(); Log.v(tag, "onCreate()"); setContentView(R.layout.main); Button button = (Button)findViewById(R.id.button); button.setText(tag.endsWith("ActivityA") ? "Activity B" : "Activity A"); button.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent; int flags = Intent.FLAG_ACTIVITY_NEW_TASK // | Intent.FLAG_ACTIVITY_SINGLE_TOP ; Log.v(tag, "onClick()"); intent = new Intent(this, tag.endsWith("ActivityA") ? ActivityB.class : ActivityA.class); intent.setFlags(flags); startActivity(intent); } @Override protected void onNewIntent(Intent intent) { Log.v(tag, "onNewIntent()"); } }

public class ActivityB extends ActivityA { }

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".ActivityA" android:launchMode="singleTop" android:label="Activity A"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ActivityB" android:launchMode="singleTop" android:label="Activity B" android:taskAffinity="activity.B"> </activity> </application> </manifest>