2010-10-26 17 views
17

Parece haber un error en startActivity.Error: onNewIntent no se ha llamado a la actividad singleTop con Intent.FLAG_ACTIVITY_NEW_TASK

Al establecer las actividades a ser diferente con singleToptaskAffinity en AndroidManifest.xml y utilizando el Intent.FLAG_ACTIVITY_NEW_TASK al llamar startActivity, dos actividades se pueden crear de dos tareas (una actividad por tarea).

Llamando startActivity volverá a la primera actividad/tarea y se llamará onNewIntent. Sin embargo, llamando al startActivity un cuarto momento volverá a la segunda actividad/tarea, pero no se llama al onNewIntent.

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

Sin embargo, si también se usa 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 el 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> 

Respuesta

11

esto es un poco tarde, pero ya que me encontré con esto - como Matt menciona, la actividad de la bandera solo tapa en el manifiesto y en el intento no son lo mismo (al menos en versiones anteriores de Android).

en startActivityUncheckedLocked método:

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

vistazo a la línea 2204 -

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

por lo que se acaba de comprobar las banderas de lanzamiento en el intento, y no revisar el manifiesto . comparar esto con la liberación mr1 jellybean:

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

vistazo a la línea 2835 -

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

lo que parece que en MR1, están comprobando r.launchMode (presumiblemente el valor AndroidManifest.xml) además al launchFlags (presumiblemente del intento mismo), mientras que en las versiones anteriores, solo estaban verificando los indicadores de intención.

en realidad fue fijado el 16 de febrero del 2012, en esta confirmación: https://github.com/android/platform_frameworks_base/commit/f363dfd26c304bca33f12065a9ed3de291193962

versión corta es - establece el indicador de la parte superior solo en la intención y en el manifiesto.

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

Cuestiones relacionadas