2015-03-12 16 views
9

aşağıdaki kullanarak yeni bir etkinlik başlatıyoruz ediyorum: başlatıyorFLAG_ACTIVITY_CLEAR_TASK ayarlandığında siyah ekran nasıl engellenir?

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

MyNewActivity ederken, siyah bir ekran gösterilir.

Intent.FLAG_ACTIVITY_CLEAR_TASK'u kaldırırsam, etkinlik herhangi bir anda siyah bir ekran gösterilmeden başlatılır (bunun yerine, yeni yük yüklenirken önceki etkinlik gösterilir).

Bu siyah ekrandan kaçınmanın bir yolu var mı? Bayrakların kaldırılması bir seçenek gibi görünmüyor (mevcut görev yığınının tümünü temizlemem ve kök olarak yeni bir etkinlik başlatmam gerekiyor).

DÜZENLEME: Sorunu yeniden üreten çok basit bir kod iliştiriyorum (uygulama için Theme.AppCompat gibi koyu bir temayı belirleyin). Siyah ekran çok az bir süre gösterilir (alım etkinliğinde başlatma etkinliğinin kaç tane çalıştığına bağlıdır), ancak bunu görebilirsiniz. Eğer FLAG_ACTIVITY_CLEAR_TASK kullanmazsanız, siyah ekran gösterilen ve geçiş pürüzsüz değildir:

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> 

teşekkürler! Ancak daha iyi bir yaklaşım Activity.onCreate sırasında ana iş parçacığı üzerinde daha az şeyler yapmak ve gösteri izin vermek

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

:

+1

uygulamanızı Fix()'. Bunun yerine, 'onCreate() 'ile başlattığınız bir arka plan iş parçacığına boşaltma yapın. –

+0

Artık ne yazık ki optimize edemiyorum (uygulamada, ana iş parçacığında arka plan resimlerinin işlenmesini gerektiren çok özel görsel tasarım yönergeleri var). Her neyse, bu ** sorun değil. Hiçbir şey yapmayan bir etkinlikle bile, herhangi bir projede çoğaltmak için örnek kod ekledim. – Ereza

+1

Başka bir seçenek de "CLEAR_TASK" yerine "Intent.FLAG_ACTIVITY_CLEAR_TOP" kullanmaktır. Bu, yalnızca "MyNewActivity" öğesinin orijinal örneğini yığınta bırakırsanız çalışır (yani: diğer Etkinlikler'i başlattığınızda tamamlamayın). Bu hala düzeltmezse, 'Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP'. Bu, diğer tüm etkinlikleri yığından silecek ve mevcut olan "MyNewActivity" örneğine dönecektir. Bu durumda, "MyNewActivity" nin "onNewIntent()" de kontrol edebileceği "Intent" e "extra" ekleyebilir ve ayarlanmışsa kendini yeniden başlatabilirsiniz. –

cevap

12

tamamen size AppTheme için aşağıdaki ekleyebilir "siyah ekran" (aka "önizleme") önlemek için Kullanıcı beklerken önizleme ekranı. sorunsuz bir geçiş için, size temaya bu ekleme pencerenize Özel bir arka plan ayarlayabilirsiniz: o onCreate `çok şey yapmaz, böylece

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

Çok teşekkür ederim! Görüntülenmekte olan şeyin önizleme olduğunu hiç düşünmemiştim! – Ereza

İlgili konular