2015-03-12 10 views
9

मैं निम्नलिखित का उपयोग कर एक नई गतिविधि शुरू करने कर रहा हूँ: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); 

जबकि MyNewActivity लॉन्च कर रहा है, एक काली स्क्रीन दिखाया गया है।

अगर मैं Intent.FLAG_ACTIVITY_CLEAR_TASK निकालने के लिए, गतिविधि किसी भी क्षण में एक काले रंग की स्क्रीन को दिखाने के बिना शुरू की है (बजाय, पिछले गतिविधि जबकि नए भार दिखाया गया है)।

क्या इस ब्लैक स्क्रीन से बचने का कोई तरीका है? झंडे को हटाने का विकल्प नहीं लगता है (मुझे सभी मौजूदा कार्य के ढेर को साफ़ करने और जड़ के रूप में एक नई गतिविधि लॉन्च करने की आवश्यकता है)।

संपादित करें: मैं एक बहुत ही सरल कोड संलग्न करता हूं जो इस मुद्दे को पुन: उत्पन्न करता है (ऐप के लिए Theme.AppCompat जैसे अंधेरे विषय को सेट करें)। ब्लैक स्क्रीन बहुत कम समय के लिए दिखाया गया है (इस पर निर्भर करता है कि लॉन्च होने पर प्राप्त करने वाली गतिविधि कितनी काम करती है), लेकिन आप इसे देख सकते हैं। आप FLAG_ACTIVITY_CLEAR_TASK का उपयोग नहीं करते हैं, तो काली स्क्रीन नहीं दिखाया गया है और संक्रमण चिकनी है:

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> 

धन्यवाद!

+1

इतना है कि यह 'onCreate में बहुत कुछ कर नहीं करता है अपने अनुप्रयोग निश्चित करें()'। सामान को उस पृष्ठभूमि थ्रेड में ऑफ़लोड करें जिसे आप 'onrereate()' में शुरू करते हैं। –

+0

मैं अब इसे अनुकूलित नहीं कर सकता, दुर्भाग्यवश (ऐप में कुछ बहुत ही विशेष दृश्य डिज़ाइन दिशानिर्देश हैं जिन्हें मुख्य थ्रेड में पृष्ठभूमि छवियों के कुछ हैंडलिंग करने की आवश्यकता है)। वैसे भी, यह ** नहीं ** समस्या है। मैंने किसी भी प्रोजेक्ट पर इसे पुन: पेश करने के लिए नमूना कोड संलग्न किया है, यहां तक ​​कि ऐसी गतिविधि के साथ जो कुछ भी नहीं करता है। – Ereza

+1

एक और विकल्प 'CLEAR_TASK' के बजाय' Intent.FLAG_ACTIVITY_CLEAR_TOP' का उपयोग करना होगा। यह केवल तभी काम करेगा जब आप स्टैक में 'MyNewActivity' का मूल उदाहरण छोड़ दें (यानी: जब आप अन्य गतिविधियां लॉन्च करते हैं तो इसे समाप्त न करें)। यदि यह अभी भी इसे ठीक नहीं करता है, तो आप 'Intent.FLAG_ACTIVITY_CLEAR_TOP | आज़मा सकते हैं Intent.FLAG_ACTIVITY_SINGLE_TOP'। यह ढेर से अन्य सभी गतिविधियों को साफ़ करेगा और 'MyNewActivity' के मौजूदा उदाहरण पर वापस आ जाएगा। इस मामले में, आप 'इरादा' में एक "अतिरिक्त" जोड़ सकते हैं, जो 'MyNewActivity'' न्यूइन्टेंट() 'पर जांच कर सकता है और यदि सेट हो, तो यह स्वयं को पुनः आरंभ कर सकता है। –

उत्तर

12

पूरी तरह से "काली स्क्रीन" (उर्फ "पूर्वावलोकन") से बचने के लिए आप अपने AppTheme के लिए निम्न जोड़ सकते हैं:

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

हालांकि एक बेहतर दृष्टिकोण Activity.onCreate दौरान मुख्य थ्रेड पर कम बातें करते हैं और शो करते है पूर्वावलोकन स्क्रीन जबकि उपयोगकर्ता इंतजार कर रहा है। सुचारु लिए, आप अपने विषय को यह जोड़ने से आपके खिड़कियों के लिए एक कस्टम पृष्ठभूमि सेट कर सकते हैं:

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

बहुत बहुत धन्यवाद! मैंने कभी नहीं सोचा था कि क्या प्रदर्शित किया जा रहा था पूर्वावलोकन था! – Ereza

संबंधित मुद्दे