Ich bin eine neue Aktivität mit dem folgenden starten:Wie vermeidet man schwarzen Bildschirm auf startActivity, wenn FLAG_ACTIVITY_CLEAR_TASK gesetzt ist?
Intent intent = new Intent(this, MyNewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
overridePendingTransition(0, 0);
Während MyNewActivity
startet, wird ein schwarzer Bildschirm angezeigt.
Wenn ich Intent.FLAG_ACTIVITY_CLEAR_TASK
entferne, wird die Aktivität gestartet, ohne dass ein schwarzer Bildschirm angezeigt wird (stattdessen wird die vorherige Aktivität angezeigt, während die neue geladen wird).
Gibt es eine Möglichkeit, diesen schwarzen Bildschirm zu vermeiden? Das Entfernen der Flags scheint keine Option zu sein (ich muss den gesamten Stack der aktuellen Task löschen und eine neue Aktivität als Root starten).
EDIT: Ich füge einen sehr einfachen Code, der das Problem reproduziert (stellen Sie ein dunkles Thema wie Theme.AppCompat
für die App). Der schwarze Bildschirm wird für sehr wenig Zeit angezeigt (hängt davon ab, wie viele Arbeitsschritte die empfangende Aktivität beim Start ausführt), aber Sie können es sehen. Wenn Sie FLAG_ACTIVITY_CLEAR_TASK
nicht verwenden, wird der schwarze Bildschirm nicht dargestellt und der Übergang ist glatt:
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
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>
Dank!
App Fix, so dass es nicht viel in 'onCreate()' tut. Entladen Sie das Zeug in einen Hintergrund-Thread, den Sie stattdessen in 'onCreate()' starten. –
Ich kann es leider nicht mehr optimieren (die App hat einige sehr spezielle visuelle Designrichtlinien, die einige Hintergrundbilder im Hauptthread behandeln müssen). Wie auch immer, das ist ** nicht ** das Problem. Ich habe Beispielcode beigefügt, um es in jedem Projekt zu reproduzieren, selbst wenn es sich um eine Aktivität handelt, die nichts bewirkt. – Ereza
Eine andere Option wäre die Verwendung von 'Intent.FLAG_ACTIVITY_CLEAR_TOP' anstelle von' CLEAR_TASK'. Dies funktioniert nur, wenn Sie die ursprüngliche Instanz von 'MyNewActivity' im Stapel belassen (dh: Beenden Sie sie nicht, wenn Sie andere Aktivitäten starten). Wenn das Problem dadurch nicht behoben wird, können Sie 'Intent.FLAG_ACTIVITY_CLEAR_TOP | versuchen Intent.FLAG_ACTIVITY_SINGLE_TOP'. Dadurch werden alle anderen Aktivitäten vom Stapel entfernt und zur vorhandenen Instanz von MyNewActivity zurückgekehrt. In diesem Fall könnten Sie dem 'Intent' ein" Extra "hinzufügen, welches' MyNewActivity' in 'onNewIntent() 'einchecken kann und falls gesetzt, könnte es sich neu initialisieren. –