2015-03-12 9 views
9

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!

+1

App Fix, so dass es nicht viel in 'onCreate()' tut. Entladen Sie das Zeug in einen Hintergrund-Thread, den Sie stattdessen in 'onCreate()' starten. –

+0

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

+1

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. –

Antwort

12

Um vollständig die „black screen“ (auch bekannt als „Vorschau“) vermeiden Sie Folgendes zu Ihrer AppTheme hinzufügen:

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

jedoch ein besserer Ansatz zu tun ist weniger Dinge auf Hauptthread während Activity.onCreate und lassen Sie zeigen der Vorschaubildschirm, während der Benutzer wartet. Für einen reibungslosen Übergang, können Sie einen benutzerdefinierten Hintergrund zu Ihrem Fenster gesetzt, diese zu Ihrem Thema:

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

Vielen Dank! Ich hätte nie gedacht, dass das, was gezeigt wurde, die Vorschau war! – Ereza

Verwandte Themen