2015-03-12 8 views
9

Sto lanciando una nuova attività utilizzando il seguente:Come evitare la schermata nera su startActivity quando è impostato FLAG_ACTIVITY_CLEAR_TASK?

Intent intent = new Intent(this, MyNewActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 
overridePendingTransition(0, 0); 

Mentre MyNewActivity lancia, viene mostrata una schermata nera.

Se rimuovo Intent.FLAG_ACTIVITY_CLEAR_TASK, l'attività viene avviata senza mostrare una schermata nera in qualsiasi momento (invece, l'attività precedente viene visualizzata mentre il nuovo viene caricato).

C'è un modo per evitare questo schermo nero? La rimozione dei flag sembra non essere un'opzione (ho bisogno di cancellare tutto lo stack delle attività correnti e avviare una nuova attività come quella di root).

MODIFICA: Allego un codice molto semplice che riproduce il problema (imposta un tema scuro come Theme.AppCompat per l'app). La schermata nera viene mostrata per pochissimo tempo (dipende da quanti lavori svolge l'attività di ricezione al momento dell'avvio), ma puoi vederla. Se non si utilizza FLAG_ACTIVITY_CLEAR_TASK, lo schermo nero non viene mostrata e la transizione è liscio:

MainActivity

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(MainActivity.this, MyNewActivity.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(intent); 
       overridePendingTransition(0,0); 
      } 
     }); 
    } 
} 

MyNewActivity

public class MyNewActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_new); 
    } 
} 

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/holo_blue_bright"> 

    <Button 
     android:id="@+id/button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="CLICK ME!" /> 

</RelativeLayout> 

activity_new.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/holo_green_light"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="I am the new activity!" /> 

</RelativeLayout> 

Grazie!

+1

fissare la vostra applicazione in modo che non fa molto in 'onCreate()'. Scarica il materiale in un thread in background che inizi invece in "onCreate()". –

+0

Purtroppo non riesco più a ottimizzarlo (l'app ha delle linee guida per la progettazione visiva molto speciali che richiedono una gestione delle immagini di sfondo nel thread principale). Ad ogni modo, questo è ** non ** il problema. Ho allegato un codice di esempio per riprodurlo su qualsiasi progetto, anche con un'attività che non fa nulla. – Ereza

+1

Un'altra opzione sarebbe utilizzare 'Intent.FLAG_ACTIVITY_CLEAR_TOP' invece di' CLEAR_TASK'. Questo funzionerà solo se si lascia l'istanza originale di 'MyNewActivity' nello stack (es .: non finirlo quando si lanciano altre attività). Se il problema persiste, prova con 'Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP'. Questo cancellerà tutte le altre attività dalla pila e ritornerà all'istanza esistente di 'MyNewActivity'. In questo caso, puoi aggiungere un "extra" all'intento ', che' MyNewActivity' può controllare in 'onNewIntent()' e se impostato, potrebbe reinizializzarsi. –

risposta

12

di evitare completamente il "schermo nero" (alias "preview") è possibile aggiungere quanto segue al AppTheme:

<style name="AppTheme" parent="Theme.AppCompat"> 
    <item name="android:windowDisablePreview">true</item> 
    ... 
</style> 

Tuttavia un approccio migliore è fare meno cose sul thread principale durante Activity.onCreate e lasciare che spettacolo la schermata di anteprima mentre l'utente è in attesa. Per una transizione graduale, è possibile impostare uno sfondo personalizzato per le finestre di aggiungere questo al vostro tema:

<style name="AppTheme" parent="Theme.AppCompat"> 
    <item name="android:windowBackground">@drawable/slash_screen</item> 
    ... 
</style> 
+0

Grazie mille! Non ho mai pensato che quello che veniva mostrato fosse l'anteprima! – Ereza

Problemi correlati