روش صحیح ساختن Splash در اندروید

باید و نباید وجود Splash رو نمیخوام بحث کنم ولی همیشه باعث اعصاب خوردیم میشد که وقتی یک اپلیکیشن رو باز میکنم و هی صفحه Splash رو به روخ میکشه ! من میدونم چه اپی رو باز کردم فقط بزار ازش استفاده کنم !!!!!
توسعه دهنده اندروید هستم این باعث شد که متوجه بشم که وقتی تو پروژه هام از Splash استفاده میکنم شاید همینقدر برای کاربر رو مخ باشه...

گوگل چی میگه ؟

گوگل قبلا از Splash حمایت میکرده ولی همیشه اینطور نبوده و حتی اون رو انتی پترن صدا زده.

Splash به روش صحیح !

از صفحه های Splash استفاده نکنید وقت کاربر رو هدر میده , خب پس چیکار کنیم ؟
دیدید وقتی اپلیکیشن رو باز میکنید یه چند ثانیه اول تاخیر داره و بعضی اوقات صفحه خالی نشون میده ؟

https://media.giphy.com/media/mks5DcSGjhQ1a/giphy.gif

بووووم همینه !

باید از موقعیت ها استفاده کنیم , چرا کاربر رو معطل کنیم ؟ وقتی چند ثانیه وقت داریم تا اپ باز بشه چرا همونجا کار رو یکسره نکنیم و 3 ثانیه دیگه به انتظارش اضافه نکنیم ؟
اگه به اپدیت های جدید اپ های گوگل نگاه کنید میبینید که همین کارو کردن مثلا YouTube :

Splash YouTube
Splash YouTube

مقدار زمانی که شما صرف دیدن این صفحه میکنید دقیقا همون زمانیه که اپلیکیشن نیاز داره تا قشنگ لود بشه و در صورت لود شدن اپلیکیشن تقریبا بلافاصله از بین میره

خب بریم سر اجرا

اجرا ممکنه با اون چیزی که فک میکنید یکم متفاوت باشه چون صفحه باید سریع بالا بیاد حتی وقت این رو هم ندارید که توی SplashActivity صفحه رو inflate کنین !
ما از layout استفاده نمیکنیم , بجاش بکگراند رو از Theme تنظیم میکنیم برای این کار یه فایل XML drawable در res/drawable ایجاد میکنیم :

<?xml version=&quot1.0&quot encoding=&quotutf-8&quot?> 
<layer-list xmlns:android=&quothttp://schemas.android.com/apk/res/android&quot> 
    <item
         android:drawable=&quot@color/gray&quot/>
     <item> 
        <bitmap
             android:gravity=&quotcenter&quot
             android:src=&quot@mipmap/ic_launcher&quot/>
     </item>
 </layer-list>

در اینجا ، من یک رنگ پس زمینه و یک تصویر تنظیم کرده ام.

خب حالا برید داخل فایل Style.xml و یک Theme جدید برای SplashActivity اضافه کنید :

<resources>
    <!-- Base application theme. -->
    <style name=&quotAppTheme&quot parent=&quotTheme.AppCompat.Light.DarkActionBar&quot>
        <!-- Customize your theme here. -->
    </style>
    <style name=&quotSplashTheme&quot parent=&quotTheme.AppCompat.NoActionBar&quot>
        <item name=&quotandroid:windowBackground&quot>@drawable/background_splash</item>
    </style>
</resources>

و حالا باید داخل AndroidManifest.xml به SplashActivity اتربیوت Theme رو اضافه کنید و اون Theme که ساختید رو بهش بدید :

 <activity
    android:name=&quot.SplashActivity&quot
    android:theme=&quot@style/SplashTheme&quot>
    <intent-filter>
        <action android:name=&quotandroid.intent.action.MAIN&quot />

        <category android:name=&quotandroid.intent.category.LAUNCHER&quot />
    </intent-filter>
</activity>

و در اخر باید SplashActivity باید به MainActivity فروارد بشه :

public class SplashActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}

توجه داشته باید که شما هیچ View برای SplashActivity نساختید و View از Theme میاد

درست انجام دادیم :)


فرقش با روش قدیمی اینه که وقتی نشون داده میشه که اپ داره کانفیگ میشه و اگر از روش قدیمی استفاده کنید بعد از کانفینگ اپ بالا میاد
برفرض اینکه کانفیگ اپ شما 2 ثانیه باشه :
روش قدیمی : شما 2 ثانیه هم به Splash میدید و وقتی اپ رو باز میکنید دو ثانیه کانفیگ میشه و بعد 2 ثانیه Splash شمارو نشون میده.
روش جدید : در همون 2 ثانیه کانفیگ Splash شما نشون داده میشه و هیچ وقتی از کاربر نمیگیره

انقدر کاربرا رو اذیت نکنید !



امیدوارم که تونسته باشم کمکتون کنم اگه جایی اشتباه کردم اول معذرت میخوام دوم لطفا بهم بگید تا ویرایش کنم !

راستی پست قبلی منو خوندید ؟
یه سری بهش بزنید

http://vrgl.ir/KZWHV
https://vrgl.ir/vMKTC

Ref :

- https://www.bignerdranch.com/blog/splash-screens-the-right-way/
- https://medium.com/@shishirthedev/the-right-way-to-implement-a-splash-screen-in-android-acae0e52949a