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!
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()". –
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
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. –