java - Android-स्टार्टअप पर सफेद स्क्रीन को रोकें




multithreading performance (10)

इस समस्या को हल करने का अनुशंसित तरीका उत्तरों में गायब है। इसलिए मैं यहां अपना उत्तर जोड़ रहा हूं। व्हाईट-स्क्रीन-एट-स्टार्टअप समस्या प्रारंभिक रिक्त स्क्रीन के कारण होती है जो कि ऐप को लॉन्च करते समय सिस्टम प्रक्रिया आरेखित करती है। इसे हल करने का एक सामान्य तरीका यह है कि इस प्रारंभिक स्क्रीन को अपनी styles.xml जोड़कर बंद कर दें। styles.xml फ़ाइल।

<!-- Base application theme. -->
 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

        <!-- Customize your theme here. -->
        <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowDisablePreview">true</item>
        <item name="android:windowBackground">@null</item>
        <item name="android:windowIsTranslucent">true</item>

 </style>

लेकिन एंड्रॉइड डॉक्यूमेंटेशन के अनुसार इसके परिणामस्वरूप लंबे समय तक स्टार्टअप हो सकता है। Google के अनुसार इस प्रारंभिक श्वेत स्क्रीन से बचने का अनुशंसित तरीका गतिविधि का windowBackground थीम विशेषता का उपयोग करना है और शुरुआती गतिविधि के लिए एक सरल कस्टम windowBackground प्रदान करना है।

ऐशे ही:

my_drawable.xml लेआउट फ़ाइल, my_drawable.xml

<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
     // Other stuff
</application>

अपनी शैलियों में एक नई शैली बनाएँ। styles.xml

<item name="android:windowDisablePreview">true</item>

इस विषय को मेनिफेस्ट फ़ाइल में अपनी शुरुआती गतिविधि में जोड़ें

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
  <!-- The background color, preferably the same as your normal theme -->
  <item android:drawable="@android:color/white"/>
  <!-- Your product logo - 144dp color version of your app icon -->
  <item>
    <bitmap
      android:src="@drawable/product_logo_144dp"
      android:gravity="center"/>
  </item>
</layer-list>

और जब आप super.onCreate() और setContentView() कॉल करने से पहले अपने सामान्य थीम कॉल setTheme(R.style.Apptheme) वापस संक्रमण करना चाहते हैं।

<!-- Base application theme. -->
<style name="AppTheme">
    <!-- Customize your theme here. -->               
</style>

<!-- Starting activity theme -->
<style name="AppTheme.Launcher">
    <item name="android:windowBackground">@drawable/my_drawable</item>
</style>

यह समस्या को हल करने का अनुशंसित तरीका है और यह Google सामग्री डिज़ाइन पैटर्न से है।

जैसा कि हम सभी जानते हैं, कई एंड्रॉइड ऐप अपनी पहली Activity फोकस में आने से पहले एक सफेद स्क्रीन को बहुत संक्षेप में प्रदर्शित करते हैं। यह समस्या निम्नलिखित मामलों में देखी गई है:

  • Android एप्लिकेशन जो वैश्विक Application वर्ग का विस्तार करते हैं और उसमें प्रमुख आरंभिक प्रदर्शन करते हैं। Application ऑब्जेक्ट हमेशा पहली Activity (एक तथ्य जिसे डीबगर में देखा जा सकता है) से पहले बनाया जाता है, इसलिए यह समझ में आता है। यह मेरे मामले में देरी का कारण है।

  • एंड्रॉइड ऐप जो छप स्क्रीन से पहले डिफ़ॉल्ट पूर्वावलोकन विंडो प्रदर्शित करते हैं।

android:windowDisablePreview = "true" सेट करना android:windowDisablePreview = "true" स्पष्ट रूप से यहां काम नहीं करता है। न ही मैं छप स्क्रीन के मूल विषय को Theme.Holo.NoActionBar में here वर्णित के रूप में सेट कर सकता हूँ, क्योंकि [दुर्भाग्य से] मेरी स्प्लैश स्क्रीन एक ActionBar का उपयोग करती है।

इस बीच, एप्लिकेशन जो एप्लिकेशन क्लास का विस्तार नहीं करते हैं वे स्टार्टअप पर सफेद स्क्रीन नहीं दिखाते हैं।

बात यह है कि, आदर्श रूप से पहले दिखाई गई Activity से पहले Application ऑब्जेक्ट में किए गए इनिशियलाइज़ेशन की आवश्यकता होती है। तो मेरा सवाल यह है कि मैं एक Application ऑब्जेक्ट का उपयोग किए बिना ऐप स्टार्टअप पर ये इनिशियलाइज़ेशन कैसे कर सकता हूं? संभवतः एक Thread या Service का उपयोग करते हुए, मुझे लगता है?

यह सोचने के लिए एक दिलचस्प समस्या है। मैं इसे सामान्य तरीके से ( NoActionBar थीम को सेट करके) बायपास नहीं कर सकता, क्योंकि वास्तव में मेरे स्पलैश स्क्रीन में वास्तव में कुछ असंबंधित कारणों के कारण ActionBar है।

ध्यान दें:

मैंने पहले ही निम्नलिखित प्रश्नों का उल्लेख किया है:

  • ऐप स्टार्ट पर सफेद स्क्रीन को कैसे ठीक करें?

  • Android छप स्क्रीन शुरुआत में सफेद है?

  • स्प्लैशस्क्रीन से पहले सफेद स्क्रीन

  • एंड्रॉइड ऐप शुरू होने पर सफेद पृष्ठभूमि

  • एंड्रॉइड में ऐप्स चलाना शुरू करने पर 1sec के लिए एक सफेद स्क्रीन क्यों दिखाई देती है?

संदर्भ:


कृपया अपने प्रकट ऐप थीम में इन दो पंक्तियों को कॉपी और पेस्ट करें / Res / स्टाइल / AppTheme। तो यह आकर्षण की तरह काम करेगा ..

<item name="android:windowDisablePreview">true</item>
<item name="android:windowIsTranslucent">true</item>

कृपया एक बार यह कोशिश करें।

1) एक ड्रा करने योग्य फ़ाइल splash_background.xml को क्रेट करें

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/{your color}" />

    <item>
        <bitmap
            android:layout_width="@dimen/size_250"
            android:layout_height="@dimen/size_100"
            android:gravity="center"
            android:scaleType="fitXY"
            android:src="{your image}"
            android:tint="@color/colorPrimary" />
    </item>

</layer-list>

2) इसे style.xml में डालें

     <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
         <item name="android:windowBackground">@drawable/background_splash</item>
     </style>

3) अपने AndroidMainfest.xml में लॉन्च गतिविधि के लिए उपरोक्त थीम सेट करें।

       <activity
            android:name=".SplashScreenActivity"
            android:screenOrientation="portrait"
            android:theme="@style/SplashTheme"
            android:windowSoftInputMode="stateVisible|adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

क्या आपने android:windowBackground सेट करने का प्रयास किया है android:windowBackground एट्रिब्यूट अपनी लॉन्चर एक्टिविटी के विषय में, या तो कलर या ड्रॉबल के लिए?

उदाहरण के लिए यह:

<item name="android:windowBackground">@android:color/black</item>

जब लॉन्चर में जोड़ा जाता है तो थीम थीम स्टार्टअप पर काले रंग (सफेद रंग के बजाय) दिखाई देगी। अपने उपयोगकर्ताओं को कुछ दिखाते हुए, लंबी इनिशियलाइज़ेशन को छिपाने के लिए यह एक आसान ट्रिक है, और यह तब भी ठीक काम करता है , जब आप एप्लिकेशन ऑब्जेक्ट को उप-वर्ग करते हैं।

लंबे आरंभीकरण कार्य करने के लिए अन्य निर्माणों (यहां तक ​​कि थ्रेड्स) का उपयोग करने से बचें, क्योंकि आप अंत में ऐसे निर्माणों के जीवनचक्र को नियंत्रित करने में सक्षम नहीं हो सकते हैं। इस प्रकार की क्रियाओं को करने के लिए एप्लिकेशन ऑब्जेक्ट सही जगह है।


जीवनचक्र कॉलबैक विधियों के भीतर, आप यह घोषित कर सकते हैं कि जब उपयोगकर्ता गतिविधि छोड़ता है और गतिविधि में फिर से प्रवेश करता है तो आपकी गतिविधि कैसे व्यवहार करती है। याद रखें कि जिस तरह से एंड्रॉइड डिज़ाइन किया गया है, उसमें प्रत्येक ऐप के लिए एक जीवनचक्र है। यदि आप onCreate() विधि में बहुत अधिक लोड डालते हैं (जो कि लेआउट फ़ाइलों को लोड करने के लिए उपयोग की जाने वाली विधि है और इसमें आपके पास कोई भी नियंत्रण सम्मिलित है), तो सफेद स्क्रीन अधिक दिखाई देगी, क्योंकि लेआउट फ़ाइल को अधिक समय लगेगा भार।

मैं एक गतिविधि शुरू करते समय कई अलग-अलग तरीकों का उपयोग करने का सुझाव देता हूं। इस तरह के onStart() (एप्लिकेशन लोड होने के बाद पहली चीज़ के रूप में कहा जा रहा है), onActivityCreated() (लेआउट प्रदर्शित होने के बाद कॉल किया जा रहा है और उपयोगी है यदि आप गतिविधि शुरू करने पर कोई डेटा प्रोसेसिंग कर रहे हैं)।

आपके लिए इसे आसान बनाने के लिए, नीचे आधिकारिक गतिविधि जीवनचक्र आरेख है:


जैसा कि आप पहले से ही जानते हैं कि यह सफेद स्क्रीन क्यों है, जैसा कि पृष्ठभूमि प्रक्रियाओं या एप्लिकेशन आरंभीकरण या बड़ी फ़ाइलों के कारण होता है, इसलिए इससे दूर होने के लिए बस नीचे दिए गए विचार की जांच करें।

ऐप की शुरुआत में इस सफेद स्क्रीन को रोकने के लिए, एक तरीका छप स्क्रीन है, यह सिर्फ एक तरीका है जो अंतिम नहीं है और आपको इसका उपयोग करना होगा।

जब आप अपनी स्प्लैश स्क्रीन से दिखा सकते हैं। xml फ़ाइल, तब यह मुद्दा भी वही रहेगा,

इसलिए आपको छप स्क्रीन के लिए शैली में .tml फ़ाइल बनाना होगा और वहां आपको अपनी छप छवि के रूप में विंडो बैकग्राउंड सेट करना होगा और फिर उस विषय को अपनी फ़ाइल को दिखावा गतिविधि से लागू करना होगा। इसलिए अब जब आप ऐप चलाएंगे, तो पहले यह थीम सेट करेगा और इस तरह से उपयोगकर्ता सफेद स्क्रीन के बजाय सीधे स्प्लैश छवि देख पाएंगे।


मूल्यों / शैलियों में आइटम लिखें। xml:

<item name="android:windowBackground">@android:color/black</item>

उदाहरण के लिए, AppTheme में:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>

    <item name="android:windowBackground">@android:color/black</item>

    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

मेरे पास एक ही मुद्दा था, आपको अपनी शैली को अपडेट करना होगा।

style.xml

<activity ...
android:theme="@style/AppTheme.Launcher" />

आपकी मैनिफ़ेस्ट फ़ाइल नीचे की तरह दिखनी चाहिए।

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // Make sure this is before calling super.onCreate
    setTheme(R.style.Theme_MyApp);
    super.onCreate(savedInstanceState);
    // ...
  }
}

बाहर बाहर:

आशा है कि यह आपकी मदद करेगा।


सफेद पृष्ठभूमि के साथ समस्या एंड्रॉइड की ठंड शुरू होने के कारण होती है, जबकि ऐप मेमोरी में लोड होता है, और इसके साथ बचा जा सकता है:

public class OnboardingWithCenterAnimationActivity extends AppCompatActivity {
public static final int STARTUP_DELAY = 300;
public static final int ANIM_ITEM_DURATION = 1000;
public static final int ITEM_DELAY = 300;

private boolean animationStarted = false;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    setTheme(R.style.AppTheme);
    getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_onboarding_center);
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {

    if (!hasFocus || animationStarted) {
        return;
    }

    animate();

    super.onWindowFocusChanged(hasFocus);
}

private void animate() {
    ImageView logoImageView = (ImageView) findViewById(R.id.img_logo);
    ViewGroup container = (ViewGroup) findViewById(R.id.container);

    ViewCompat.animate(logoImageView)
        .translationY(-250)
        .setStartDelay(STARTUP_DELAY)
        .setDuration(ANIM_ITEM_DURATION).setInterpolator(
            new DecelerateInterpolator(1.2f)).start();

    for (int i = 0; i < container.getChildCount(); i++) {
        View v = container.getChildAt(i);
        ViewPropertyAnimatorCompat viewAnimator;

        if (!(v instanceof Button)) {
            viewAnimator = ViewCompat.animate(v)
                    .translationY(50).alpha(1)
                    .setStartDelay((ITEM_DELAY * i) + 500)
                    .setDuration(1000);
        } else {
            viewAnimator = ViewCompat.animate(v)
                    .scaleY(1).scaleX(1)
                    .setStartDelay((ITEM_DELAY * i) + 500)
                    .setDuration(500);
        }

        viewAnimator.setInterpolator(new DecelerateInterpolator()).start();
    }
}
}

ख़ाका

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?colorPrimary"
android:orientation="vertical"
>

<LinearLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center"
    android:orientation="vertical"
    android:paddingTop="144dp"
    tools:ignore="HardcodedText"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="16dp"
        android:alpha="0"
        android:text="Hello world"         android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse"
        android:textColor="@android:color/white"
        android:textSize="22sp"
        tools:alpha="1"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="8dp"
        android:alpha="0"
        android:gravity="center"
        android:text="This a nice text"
      android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle.Inverse"
        android:textSize="20sp"
        tools:alpha="1"
        />

    <Button
        android:id="@+id/btn_choice1"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:scaleX="0"
        android:scaleY="0"
        android:text="A nice choice"
        android:theme="@style/Button"
        />

    <Button
        android:id="@+id/btn_choice2"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:scaleX="0"
        android:scaleY="0"
        android:text="Far better!"
        android:theme="@style/Button"
        />

</LinearLayout>

<ImageView
    android:id="@+id/img_logo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:src="@drawable/img_face"
    tools:visibility="gone"
    />
</FrameLayout>

img चेहरा

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:opacity="opaque">

<item android:drawable="?colorPrimary"/>
<item>
    <bitmap
        android:gravity="center"
        android:src="@drawable/img_face"/>
</item>

इस थीम को अपने स्प्लैशस्क्रीन में जोड़ें

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowBackground">@null</item>
</style>

<style name="AppTheme.CenterAnimation">
    <item name="android:windowBackground">@drawable/ll_face_logo</item>
</style>

जो इस तरह से प्रभाव पैदा करेगा

अधिक जानकारी और अधिक समाधानों के लिए आप इस BlogPost जांच कर सकते हैं


सफेद स्क्रीन को हटाने के लिए सबसे पहले इसे पढ़ें - https://www.bignerdranch.com/blog/splash-screens-the-right-way/

लेकिन इससे भी महत्वपूर्ण बात यह है कि अपने प्रारंभिक भार को अनुकूलित करें और जब भी आपके पास इसे चलाने का समय हो तब किसी भी भारी काम को टाल दें। यदि आप चाहते हैं कि हम इस पर एक नज़र डालें तो यहां अपना आवेदन वर्ग पोस्ट करें।







cold-start