web-dev-qa-db-ja.com

スプラッシュスクリーンはどうやって作るのですか?

私は自分のアプリをよりプロフェッショナルに見せたいと思ったので、スプラッシュスクリーンを作りたいと思った。

それをどのように作成してから実装するのですか。

473
Ephraim

参考文献:

古い答え:

HOW TO シンプルスプラッシュスクリーン

この回答は、アプリの起動時にスプラッシュ画面を一定時間表示する方法を示しています。ブランドの理由例えば。あなたは3秒間スプラッシュスクリーンを表示することを選択するかもしれません。ただし、spash画面をさまざまな時間(アプリの起動時間など)表示したい場合は、Abdullah's answer https://stackoverflow.com/a/15832037/401025 を確認してください。ただし、新しいデバイスではアプリの起動が非常に高速になる可能性があるため、ユーザーにはUXの悪いフラッシュが表示されます。

最初にあなたのlayout.xmlファイルでspashスクリーンを定義する必要があります

  <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
          Android:orientation="vertical" Android:layout_width="fill_parent"
          Android:layout_height="fill_parent">

          <ImageView Android:id="@+id/splashscreen" Android:layout_width="wrap_content"
                  Android:layout_height="fill_parent"
                  Android:src="@drawable/splash"
                  Android:layout_gravity="center"/>

          <TextView Android:layout_width="fill_parent"
                    Android:layout_height="wrap_content"
                    Android:text="Hello World, splash"/>

  </LinearLayout>

そしてあなたの活動:

import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;
import Android.os.Handler;

public class Splash extends Activity {

    /** Duration of wait **/
    private final int SPLASH_DISPLAY_LENGTH = 1000;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.splashscreen);

        /* New Handler to start the Menu-Activity 
         * and close this Splash-Screen after some seconds.*/
        new Handler().postDelayed(new Runnable(){
            @Override
            public void run() {
                /* Create an Intent that will start the Menu-Activity. */
                Intent mainIntent = new Intent(Splash.this,Menu.class);
                Splash.this.startActivity(mainIntent);
                Splash.this.finish();
            }
        }, SPLASH_DISPLAY_LENGTH);
    }
}

それで全部です ;)

457
Artjom Zabelin

この解決法はユーザがそれ以上待たないようにすることに注意してください: スプラッシュスクリーンの遅延はアプリケーションの起動時間に依存します。

Androidアプリを開くと、デフォルトでアプリのタイトルとアイコンが上部に黒い画面が表示されますが、スタイル/テーマを使用してそれを変更できます。

まず、valuesフォルダーにstyle.xmlを作成し、そこにスタイルを追加します。

<style name="splashScreenTheme" parent="@Android:style/Theme.DeviceDefault.Light.NoActionBar">
    <item name="Android:windowBackground">@drawable/splash_screen</item>
</style>

@Android:style/Theme.DeviceDefault.Light.NoActionBarを使う代わりに、他のテーマを親として使うことができます。

次に、App Manifest.xmlでメインアクティビティにAndroid:theme="@style/splashScreenTheme"を追加します。

<activity
        Android:name="MainActivity"
        Android:label="@string/app_name"
        Android:theme="@style/splashScreenTheme" >

3つ目は、onCreate()起動アクティビティでテーマを更新します。

protected void onCreate(Bundle savedInstanceState) {
    // Make sure this is before calling super.onCreate
    setTheme(R.style.mainAppTheme);
    super.onCreate(savedInstanceState);
}

_ update _ この投稿をチェックする https://plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhd @ mat1hと@adelriosantiagoに感謝

513
Abdullah
  • アクティビティを作成する:Splash
  • レイアウトXMLファイルを作成します。splash.xml
  • UIコンポーネントをsplash.xmlレイアウトに配置して、好みの外観にします。
  • あなたのSplash.Javaはこのように見えるかもしれません:

    public class Splash extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.splash);
    
            int secondsDelayed = 1;
            new Handler().postDelayed(new Runnable() {
                    public void run() {
                            startActivity(new Intent(Splash.this, ActivityB.class));
                            finish();
                    }
            }, secondsDelayed * 1000);
        }
    }
    
  • スプラッシュスクリーンの後に開始したいアクティビティにActivityB.classを変更します

  • マニフェストファイルを確認してください。

        <activity
            Android:name=".HomeScreen"
            Android:label="@string/app_name">     
        </activity>

        <activity
            Android:name=".Splash"
            Android:label="@string/title_activity_splash_screen">     
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
51
binnyb

@ Abdullahの答えは正しいですが、Googleはあなたの活動のテーマを変えずにこれを適切に実装する方法に関する詳細な説明を投稿しました:

https://plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhd

Google MapsやYouTubeのようなアプリも同じ方法を使い始めました。

31
Matih

上記の答えはとても良いですが、他に何か追加したいと思います。私はAndroidに不慣れです、私は開発中にこれらの問題に出会いました。これが私のような人に役立つことを願っています。

  1. スプラッシュスクリーンは私のアプリの入り口なので、AndroidManifest.xmlに以下の行を追加します。

        <activity
            Android:name=".SplashActivity"
            Android:theme="@Android:style/Theme.DeviceDefault.Light.NoActionBar">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    
  2. スプラッシュスクリーンは、アプリのライフサイクルの中で一度だけ表示されるべきです。スプラッシュスクリーンの状態を記録するためにブール変数を使用し、最初に表示されます。

    public class SplashActivity extends Activity {
        private static boolean splashLoaded = false;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            if (!splashLoaded) {
                setContentView(R.layout.activity_splash);
                int secondsDelayed = 1;
                new Handler().postDelayed(new Runnable() {
                    public void run() {
                        startActivity(new Intent(SplashActivity.this, MainActivity.class));
                        finish();
                    }
                }, secondsDelayed * 500);
    
                splashLoaded = true;
            }
            else {
                Intent goToMainActivity = new Intent(SplashActivity.this, MainActivity.class);
                goToMainActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                startActivity(goToMainActivity);
                finish();
            }
        }
    }
    

ハッピーコーディング!

28
zdd
  1. ActivitySplashScreen.Javaを作成する

    public class SplashScreen extends Activity {
    protected boolean _active = true;
    protected int _splashTime = 3000; // time to display the splash screen in ms
    
    
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splashscreen);
    
        Thread splashTread = new Thread() {
            @Override
            public void run() {
                try {
                    int waited = 0;
                    while (_active && (waited < _splashTime)) {
                        sleep(100);
                        if (_active) {
                            waited += 100;
                        }
                    }
                } catch (Exception e) {
    
                } finally {
    
                    startActivity(new Intent(SplashScreen.this,
                            MainActivity.class));
                    finish();
                }
            };
                 };
        splashTread.start();
    }
     }
    
  2. splashscreen.xmlはこのようになります

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
      Android:layout_width="600px" Android:layout_height="1024px"
      Android:background="#FF0000">
    </RelativeLayout> 
    
13
saba

スプラッシュスクリーンは、デフォルトでは自動的にあなたのアプリケーションをよりプロフェッショナルに見せるわけではありません。専門的に設計されたスプラッシュスクリーンはあなたのアプリケーションをよりプロフェッショナルに見せる可能性があります、しかしあなたがそれを書く方法を知らないならばあなたのアプリケーションの残りが実際にどれほどプロフェッショナルになるか。

スプラッシュスクリーンを使用する唯一の理由(言い訳)は、大量の計算を行っているか、GPS/WiFiが起動する前にGPS/WiFiが起動するのを待っているためです。これらの計算の結果やGPS/WiFi(など)へのアクセスがないと、あなたのアプリケーションは水中では死んでいるので、スプラッシュスクリーンが必要であると感じます。 ).

そのようなスプラッシュスクリーンはあなたのフルスクリーンアプリケーションのように見えて、それが既に初期化されているという印象を与えるべきです、そして長い計算が完了した後に最終的な詳細が記入されます。その場合の チャンス 、またはそれがプログラムを設計できる唯一の方法である は非常に小さい です。

(待機時間が不確かな場合)しばらく時間がかかるものに依存するようにプログラムを設計するよりも、ユーザー(および残りのOS)が待機している間に他のことをできるようにするほうがよいでしょう。

GPS/WiFiが起動していることを示すアイコンがすでに携帯電話にあります。スプラッシュスクリーンが使用する時間またはスペースは、事前計算のロードまたは実際の計算の実行に費やされる可能性があります。あなたが作り出す問題と考慮すべきことについては、下記の最初のリンクを参照してください。

これらの計算またはGPS/WiFiを絶対に待たなければならない場合は、単にアプリケーションを起動させ、計算を待つ必要があるというポップアップが表示されるようにするのが最善です(テキスト「初期化」メッセージで結構です)。 GPS/WiFiを待つことが期待されています(他のプログラムで有効にされていない場合)ので、待ち時間を発表する必要はありません。

スプラッシュスクリーンがあなたのプログラムISを実際に起動して起動した時、あなたがしていることはあなたのプログラムの使用を遅らせることだけです。

プログラムを起動するたびにスプラッシュスクリーンを表示したほうがよいでしょう。WEそれが専門的に書かれているとは思われないでしょう。スプラッシュスクリーンをフルスクリーンにして実際のプログラムのスクリーンを複製すること(実際には初期化されていないときに初期化されると思います)(プログラムをよりプロフェッショナルに見せる)あなたの目的は達成できます。

なぜそれをしないのですか: http://cyrilmottier.com/2012/05/03/splash-screens-are-evil-dont-use-them/ /

そのやり方: https://encrypted.google.com/search?q=Android+splash+screen+source

だからそれをしないのにはもっともな理由がありますが、あなたの状況がどうにかしてこれらの例から外れることが確実ならば、それを行うための手段は上に与えられています。それが本当にあなたのアプリケーションをよりプロフェッショナルに見せるか、あなたがこれをするために与えた唯一の理由を破ったことを確かめてください。

これはYouTubeのチャンネルのように、長いグラフィックイントロ(およびアウトトロ)ですべてのビデオを開始したり、過去1週間の間に何が起こったのかを説明したり説明したりする必要があると感じます。ショーを見せるだけ! (ただプログラムを実行してください)。

13
Rob

何よりも答えは本当にとても良いです。ただし、メモリリークの問題があります。この問題は、Androidコミュニティでは "Leaking an Activity" として知られています。今それは正確にはどういう意味ですか?

向きの変更など設定の変更が発生すると、Androidはアクティビティを破棄して再作成します。通常、ガベージコレクタは古いActivityインスタンスの割り当てられたメモリをクリアするだけで、すべて問題ありません。

"アクティビティの漏洩" は、アクティビティインスタンスを存続していたオブジェクトからbeing (strong) referencedであるため、ガベージコレクタが古いアクティビティインスタンスの割り当てられたメモリをクリアできない状況を表します。すべてのAndroidアプリには、特定の量のメモリが割り当てられています。 Garbage Collectorが未使用のメモリを解放できない場合、アプリのパフォーマンスは徐々に低下し、やがてOutOfMemoryエラーでクラッシュします。

アプリがメモリをリークしているかどうかを判断する方法は?最速の方法は、Android Studioで[メモリ]タブを開き、向きを変更するときに割り当てられたメモリに注意を払うことです。割り当てられたメモリが増え続け、減少しない場合は、メモリリークが発生しています。

ユーザーが方向を変えるとき1.Memory漏出。 enter image description here

まず、レイアウトリソースのsplashscreen.xmlファイルにスプラッシュスクリーンを定義する必要があります。

スプラッシュスクリーンアクティビティのサンプルコード.

public class Splash extends Activity {
 // 1. Create a static nested class that extends Runnable to start the main Activity
    private static class StartMainActivityRunnable implements Runnable {
        // 2. Make sure we keep the source Activity as a WeakReference (more on that later)
        private WeakReference mActivity;

        private StartMainActivityRunnable(Activity activity) {
         mActivity = new WeakReference(activity);
        }

        @Override
        public void run() {
         // 3. Check that the reference is valid and execute the code
            if (mActivity.get() != null) {
             Activity activity = mActivity.get();
             Intent mainIntent = new Intent(activity, MainActivity.class);
             activity.startActivity(mainIntent);
             activity.finish();
            }
        }
    }

    /** Duration of wait **/
    private final int SPLASH_DISPLAY_LENGTH = 1000;

    // 4. Declare the Handler as a member variable
    private Handler mHandler = new Handler();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(icicle);
        setContentView(R.layout.splashscreen);

        // 5. Pass a new instance of StartMainActivityRunnable with reference to 'this'.
        mHandler.postDelayed(new StartMainActivityRunnable(this), SPLASH_DISPLAY_LENGTH);
    }

    // 6. Override onDestroy()
    @Override
    public void onDestroy() {
     // 7. Remove any delayed Runnable(s) and prevent them from executing.
     mHandler.removeCallbacksAndMessages(null);

     // 8. Eagerly clear mHandler allocated memory
     mHandler = null;
    }
}

詳細はこちらをご覧ください link

12

Abdullahの答えは素晴らしいです。しかし、私は私の答えと一緒にそれにいくつかの詳細を追加したいと思います。

スプラッシュスクリーンの実装

スプラッシュスクリーンを正しい方法で実装することは、想像以上に少し異なります。表示されるスプラッシュビューは、スプラッシュアクティビティでレイアウトファイルを膨らませる前であっても、すぐに準備ができている必要があります。

だからあなたはレイアウトファイルを使わないでしょう。代わりに、スプラッシュスクリーンの背景をアクティビティのテーマの背景として指定してください。これを行うには、まずres/drawableでXMLドロウアブルを作成します。

background_splash.xml

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

    <item
        Android:drawable="@color/gray"/>

    <item>
        <bitmap
            Android:gravity="center"
            Android:src="@mipmap/ic_launcher"/>
    </item>

</layer-list>

それはそれで中心の背景色のロゴ付きの単なるレイヤリストです。

これでstyles.xmlを開き、このスタイルを追加してください。

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

このテーマは、先ほど作成したアクションバーと背景を持つ必要があります。

そして明らかにあなたはSplashThemeをあなたがしぶきとして使いたい活動に設定する必要があります。

<activity
Android:name=".SplashActivity"
Android:theme="@style/SplashTheme">
<intent-filter>
    <action Android:name="Android.intent.action.MAIN" />

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

それからあなたの活動コードの中で意図を使ってしぶきの後に特定のスクリーンにユーザーをナビゲートする。

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

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

それが正しい方法です。私はこれらの参考文献を答えに使った。

  1. https://material.google.com/patterns/launch-screens.html
  2. https://www.bignerdranch.com/blog/splash-screens-the-right-way/ 私を正しい方向へと導いてくれてありがとう。受け入れられた答えはスプラッシュスクリーンをすることをお勧めしませんので私は他の人を助けたいです。
10
Zeeshan Shabbir

これは完全なコードです。

SplashActivity.Java

public class SplashActivity extends AppCompatActivity {

private final int SPLASH_DISPLAY_DURATION = 1000;

@Override
public void onCreate(Bundle bundle) {
    super.onCreate(bundle);


    new Handler().postDelayed(new Runnable(){
        @Override
        public void run() {

            Intent mainIntent = new Intent(SplashActivity.this,MainActivity.class);
            SplashActivity.this.startActivity(mainIntent);
            SplashActivity.this.finish();
        }
    }, SPLASH_DISPLAY_DURATION);
}}

ドロアブルでこれを作成します bg_splash.xml

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

<item
    Android:drawable="@color/app_color"/>

<item>
    <bitmap
        Android:gravity="center"
        Android:src="@drawable/ic_in_app_logo_big"/>
</item></layer-list>

styles.xml にカスタムテーマを作成する

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

そして最後に AndroidManifest.xml にあなたのアクティビティにテーマを指定してください

<activity
        Android:name=".activities.SplashActivity"
        Android:label="@string/app_name"
        Android:screenOrientation="portrait"
        Android:theme="@style/SplashTheme">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

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

乾杯。

4
awsleiman

Android Marshmallow 、その他のSplashスクリーンの生産的使用はあなたのアプリのスプラッシュスクリーンで 必要なAndroid Permissionsを要求する です。

ほとんどのアプリが許可要求をこのように処理するようです。

  • ダイアログはUIXを悪くし、メインフローを壊して実行時間を決めさせます。ほとんどのユーザーは、あなたのアプリがSDカードに何かを書きたいと思っても気にしないかもしれません。彼らの何人かは私達が平易な英語でそれを翻訳するまで私達が伝えようとしていることを理解さえしないかもしれません。

  • 一度に許可を要求すると、すべての操作の前の「if else」の数が減り、コードが雑然とした感じになります。

これは、Android OS 23以降を実行しているデバイスに対するスプラッシュアクティビティのアクセス許可を要求する方法の例です。

すべての権限が付与されている場合OR既に付与されているORアプリがPre Marshmallowで実行されている場合この質問を読み、最善を尽くそうとしています。

import Android.Manifest;
import Android.annotation.TargetApi;
import Android.app.AlertDialog;
import Android.content.DialogInterface;
import Android.content.Intent;
import Android.content.pm.PackageManager;
import Android.os.Build;
import Android.os.Bundle;
import Android.os.Handler;
import Android.support.v7.app.AppCompatActivity;
import Android.widget.Toast;

import com.c2h5oh.beer.R;
import com.c2h5oh.beer.utils.Animatrix;

import Java.util.ArrayList;
import Java.util.HashMap;
import Java.util.List;
import Java.util.Map;

public class SplashActivity extends AppCompatActivity {

    final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        //show animations 
        Animatrix.scale(findViewById(R.id.title_play), 100);
        Animatrix.scale(findViewById(R.id.title_edit), 100);
        Animatrix.scale(findViewById(R.id.title_record), 100);
        Animatrix.scale(findViewById(R.id.title_share), 100);

        if (Build.VERSION.SDK_INT >= 23) {

            // Marshmallow+ Permission APIs
            fuckMarshMallow();

        } else {

            // Pre-Marshmallow
            ///Display main contents
            displaySplashScreen();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: {
                Map<String, Integer> perms = new HashMap<String, Integer>();
                // Initial
                perms.put(Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.RECORD_AUDIO, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.MODIFY_AUDIO_SETTINGS, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.VIBRATE, PackageManager.PERMISSION_GRANTED);
                // Fill with results
                for (int i = 0; i < permissions.length; i++)
                    perms.put(permissions[i], grantResults[i]);

                // Check for ACCESS_FINE_LOCATION
                if (perms.get(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.MODIFY_AUDIO_SETTINGS) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.VIBRATE) == PackageManager.PERMISSION_GRANTED) {
                    // All Permissions Granted

                    // Permission Denied
                    Toast.makeText(SplashActivity.this, "All Permission GRANTED !! Thank You :)", Toast.LENGTH_SHORT)
                            .show();

                    displaySplashScreen();

                } else {
                    // Permission Denied
                    Toast.makeText(SplashActivity.this, "One or More Permissions are DENIED Exiting App :(", Toast.LENGTH_SHORT)
                            .show();

                    finish();
                }
            }
            break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }


    @TargetApi(Build.VERSION_CODES.M)
    private void fuckMarshMallow() {
        List<String> permissionsNeeded = new ArrayList<String>();

        final List<String> permissionsList = new ArrayList<String>();
        if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE))
            permissionsNeeded.add("Read SD Card");
        if (!addPermission(permissionsList, Manifest.permission.RECORD_AUDIO))
            permissionsNeeded.add("Record Audio");
        if (!addPermission(permissionsList, Manifest.permission.MODIFY_AUDIO_SETTINGS))
            permissionsNeeded.add("Equilizer");
        if (!addPermission(permissionsList, Manifest.permission.VIBRATE))
            permissionsNeeded.add("Vibrate");

        if (permissionsList.size() > 0) {
            if (permissionsNeeded.size() > 0) {

                // Need Rationale
                String message = "App need access to " + permissionsNeeded.get(0);

                for (int i = 1; i < permissionsNeeded.size(); i++)
                    message = message + ", " + permissionsNeeded.get(i);

                showMessageOKCancel(message,
                        new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                                        REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
                            }
                        });
                return;
            }
            requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                    REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
            return;
        }

        Toast.makeText(SplashActivity.this, "No new Permission Required- Launching App .You are Awesome!!", Toast.LENGTH_SHORT)
                .show();

        displaySplashScreen();
    }


    private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(SplashActivity.this)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", null)
                .create()
                .show();
    }

    @TargetApi(Build.VERSION_CODES.M)
    private boolean addPermission(List<String> permissionsList, String permission) {

        if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            permissionsList.add(permission);
            // Check for Rationale Option
            if (!shouldShowRequestPermissionRationale(permission))
                return false;
        }
        return true;
    }

    /**
     * Display main content with little delay just so that user can see
     * efforts I put to make this page
     */
    private void displaySplashScreen() {
        new Handler().postDelayed(new Runnable() {

        /*
         * Showing splash screen with a timer. This will be useful when you
         * want to show case your app logo / company
         */

            @Override
            public void run() {
                startActivity(new Intent(SplashActivity.this, AudioPlayerActivity.class));
                finish();
            }
        }, 500);
    }


}
4
Hitesh Sahu

スプラッシュスクリーンはレイアウトファイルからロードされるべきではありません、それをロードするときまだいくらかの遅れがあるかもしれません。

最良の方法はSplashScreenActivityのためだけにテーマを作成し、the Android:windowBackgroundを描画可能なリソースに設定することです。

https://www.bignerdranch.com/blog/splash-screens-the-right-way/ /

手短に:

マニフェストでSplashScreenActivityを宣言します。

<activity
        Android:name=".activities.SplashScreenActivity"
        Android:theme="@style/SplashTheme"
        Android:screenOrientation="portrait">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

あなたのSplashScreenActivity.Javaで:

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

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

}

次に、テーマの背景ウィンドウのリソースを作成します。

<style name="SplashTheme" parent="Theme.Bumpfie.Base">
    <item name="Android:windowBackground">@drawable/splash</item>
</style>

描画ファイルsplash.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@Android:color/white"/>
    <item>
        <bitmap
            Android:gravity="center"
            Android:src="@drawable/app_logo"/>
    </item>
</layer-list>
4
Danny Yassine

4の5秒間のスプラッシュスクリーンでの停止は、あまり意味がありません。バックグラウンドで何かをロードする場合はOkです。それ以外の場合は、このアプローチに従ってスプラッシュスクリーンを実装します。-スプラッシュスクリーンを正しい方法で実装することは、想像とは少し異なります。表示されるスプラッシュビューは、スプラッシュアクティビティでレイアウトファイルをインフレートする前であっても、すぐに準備する必要があります。

したがって、レイアウトファイルは使用しません。代わりに、スプラッシュスクリーンの背景をアクティビティのテーマの背景として指定します。これを行うには、最初にres/drawableでXMLドロアブルを作成します。

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

    <item
        Android:drawable="@color/gray"/>

    <item>
        <bitmap
            Android:gravity="center"
            Android:src="@mipmap/ic_launcher"/>
    </item>

</layer-list>

ここでは、背景色と画像を設定しました。

次に、これをテーマのスプラッシュアクティビティの背景として設定します。 styles.xmlファイルに移動して、スプラッシュアクティビティの新しいテーマを追加します。

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

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

</resources>

新しいSplashThemeで、ウィンドウの背景属性をXMLドロアブルに設定します。これをAndroidManifest.xmlでスプラッシュアクティビティのテーマとして設定します。

<activity
    Android:name=".SplashActivity"
    Android:theme="@style/SplashTheme">
    <intent-filter>
        <action Android:name="Android.intent.action.MAIN" />

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

最後に、SplashActivityクラスはあなたをメインアクティビティに転送するだけです。

     public class SplashActivity extends AppCompatActivity {

             @Override
             protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

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

詳細はこちらをご覧ください:1 . https://www.bignerdranch.com/blog/splash-screens-the-right-way/ 2 . http://blog.goodbarber。 com/3-tips-to-create-a-great-splash-screen-for-your-mobile-app_a287.html

4
vicky
public class MainActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Thread t=new Thread()
    {

        public void run()
        {   

            try {

                sleep(2000);
                finish();
                Intent cv=new Intent(MainActivity.this,HomeScreen.class/*otherclass*/);
                startActivity(cv);
            } 

            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    t.start();
}
3
kamalasekar

レイアウトファイルは使用しません。代わりに、スプラッシュスクリーンの背景をアクティビティのテーマの背景として指定してください。これを行うには、まずres/drawableでXMLドロウアブルを作成します。

注:以下のコードはすべて利用可能です GitHub Link

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

    <item
        Android:drawable="@color/gray"/>

    <item>
        <bitmap
            Android:gravity="center"
            Android:src="@mipmap/ic_launcher"/>
    </item>

</layer-list>

ここでは、背景色と画像を設定しました。

次に、これをスプラッシュアクティビティのテーマの背景として設定します。 styles.xmlファイルに移動して、スプラッシュアクティビティ用の新しいテーマを追加します。

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

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

</resources>

新しいSplashThemeで、ウィンドウの背景属性をXMLの描画可能オブジェクトに設定します。これをAndroidManifest.xmlのスプラッシュアクティビティのテーマとして設定します。

<activity
    Android:name=".SplashActivity"
    Android:theme="@style/SplashTheme">
    <intent-filter>
        <action Android:name="Android.intent.action.MAIN" />

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

最後に、あなたのSplashActivityクラスはあなたのメインアクティビティにあなたを連れて行くべきです:

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

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

このSplashActivityにはビューを設定していないことに注意してください。見解はテーマから来ています。テーマでスプラッシュアクティビティのUIを設定すると、すぐに利用可能になります。

スプラッシュアクティビティ用のレイアウトファイルがある場合、そのレイアウトファイルは、アプリケーションが完全に初期化された後になって初めてユーザーに表示されます。スプラッシュは、アプリが初期化される前のわずかな時間でのみ表示されるようにします。

3
Abhi Soni

スプラッシュスクリーンは、Androidでは少し使用できないオブジェクトです。メインアクティビティの起動遅延を隠すために、できるだけ早くロードすることはできません。それを使用する2つの理由があります:広告とネットワーク操作。

ダイアログとしての実装は、スプラッシュスクリーンからアクティビティのメインUIまで遅滞なくジャンプします。

public class SplashDialog extends Dialog {
    ImageView splashscreen;
    SplashLoader loader;
    int splashTime = 4000;

    public SplashDialog(Context context, int theme) {
        super(context, theme);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        setCancelable(false);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                cancel();
            }
        }, splashTime);

    }
}

レイアウト:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:background="@color/white">

    <ImageView
        Android:id="@+id/splashscreen"
        Android:layout_width="190dp"
        Android:layout_height="190dp"
        Android:background="@drawable/whistle"
        Android:layout_centerInParent="true" />

</RelativeLayout>

そして始めなさい:

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

        if (getIntent().getCategories() != null &&  getIntent().getCategories().contains("Android.intent.category.LAUNCHER")) {
            showSplashScreen();
        }
    }

    protected Dialog splashDialog;
    protected void showSplashScreen() {
        splashDialog = new SplashDialog(this, R.style.SplashScreen);
        splashDialog.show();
    }

    ...
}
2
tse

アクティビティを作成し、アクティビティを 'A'にしてから、myscreen.xmlというxmlファイルを作成し、スプラッシュスクリーン画像を背景に設定してから、カウントダウンタイマーを使用してあるアクティビティから別のアクティビティに移動します。カウントダウンタイマーの使い方を知るためには、この質問の回答を参照してください。 AndroidのTimerTask?

2
Sankar Ganesh

スプラッシュスクリーンの例:

public class MainActivity extends Activity {
    private ImageView splashImageView;
    boolean splashloading = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        splashImageView = new ImageView(this);
        splashImageView.setScaleType(ScaleType.FIT_XY);
        splashImageView.setImageResource(R.drawable.ic_launcher);
        setContentView(splashImageView);
        splashloading = true;
        Handler h = new Handler();
        h.postDelayed(new Runnable() {
            public void run() {
                splashloading = false;
                setContentView(R.layout.activity_main);
            }

        }, 3000);

    }

}
2
kablu
     - Add in SplashActivity 

   public class SplashActivity extends Activity {

       private ProgressBar progressBar;
       int i=0;
       Context context;
       private GoogleApiClient googleApiClient;

       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_splash);
           context = this;

           new Handler().postDelayed(new Runnable() {
               @Override
               public void run() {
                   startActivity(new Intent(Splash.this, LoginActivity.class));
                   finish();
               }
           }, 2000);

       }

   }

  - Add in activity_splash.xml

   <RelativeLayout
   xmlns:Android="http://schemas.Android.com/apk/res/Android"
       xmlns:tools="http://schemas.Android.com/tools"
       xmlns:custom="http://schemas.Android.com/apk/res-auto"
       Android:background="@color/colorAccent"
       Android:layout_width="match_parent"
       Android:layout_height="match_parent"
       tools:context=".Splash">

       <ImageView
           Android:id="@+id/ivLogo"
           Android:layout_width="match_parent"
           Android:layout_height="match_parent"
           Android:src="@mipmap/icon_splash"
           Android:layout_centerHorizontal="true"
           Android:layout_centerVertical="true"/>


       <ProgressBar
           Android:id="@+id/circle_progress"
           style="?android:attr/progressBarStyleHorizontal"
           Android:layout_width="fill_parent"
           Android:layout_height="wrap_content"
           Android:layout_alignParentBottom="true"
           Android:layout_marginBottom="5dp"
           Android:max="100"
           Android:progressTint="@color/green"
           Android:visibility="visible" />

   </RelativeLayout>

  - Add in AndroidManifest.xml

    <activity Android:name="ex.com.SplashActivity">
               <intent-filter>
                   <action Android:name="Android.intent.action.MAIN" />

                   <category Android:name="Android.intent.category.LAUNCHER" />
               </intent-filter>
           </activity>
1
Ashish Kumar

ユーザーがSplashActivityを開いてすぐに終了することもありますが、アプリはSPLASH_SCREEN_DISPLAY_LENGTHの後でMainActivityに移動します。

それを防ぐため:SplashActivityでは、SplashActivityに移動する前にMainActivityが終了しているかどうかを確認する必要があります。

public class SplashActivity extends Activity {

    private final int SPLASH_SCREEN_DISPLAY_LENGTH = 2000;

    @Override
    public void onCreate(Bundle icicle) {
        ...
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

                if (!isFinishing()) {//isFinishing(): If the activity is finishing, returns true; else returns false.
                    startActivity(new Intent(SplashActivity.this, MainActivity.class));
                    finish();
                }

            }, SPLASH_SCREEN_DISPLAY_LENGTH);
        }                             
   }                                
}

この助けを願っています

1
Phan Van Linh

良い答えがありますが、私はグーグル推奨方法を紹介します。

1)最初にスプラッシュスクリーン用のThemeを作成します。splashscreenThemeというテーマがあります。ランチャーテーマは次のようになります。

<style name="splashscreenTheme">
  <item name="Android:windowBackground">@drawable/launch_screen</item>
</style>

注意:

Android:windowBackgroundは既にあなたのスプラッシュスクリーン画像を設定します
これをUIで再度実行する必要があります。

あなたはドロアブルの代わりにここで色を使うこともできます。

2)splashscreenActivityを明示するようにテーマを設定します

   <activity
            Android:name=".activity.splashscreenActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/splashscreenTheme">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

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

3)画像が小さくない場合は、launch_screen drawabledrawableフォルダにないことを確認してください。

起動画面の起動が早くなり、黒い画面からあなたを救います。

それはまた余分な超過引き出しを避けます

1
Cold Fire

本当に簡単&gr8アプローチ:

楽しい!

実装に役立つ十分な答えがここにあります。この記事は、スプラッシュスクリーンを作成する最初のステップで他の人を助けるためのものです。

1
jony89

これは私がスプラッシュスクリーンで見た中で最高の投稿です: http://saulmm.github.io/avoding-Android-cold-starts

SaúlMolineroは、スプラッシュスクリーンに2つの異なる選択肢を用意しています。ウィンドウの背景を利用して初期スクリーンにアニメーション化することと、プレースホルダUIを表示することです。

コールドスタート時間を考慮し、長い起動時間によるユーザードロップオフを回避する必要があるたびに、この記事を参照してください。

お役に立てれば!

1
w3bshark

同じコードを使用でき、AndroidManifest.xmlで定義されているので、コードを変更する必要がまったくない、柔軟性の高い起動画面はどうでしょう。私は一般的にコードのライブラリを開発し、それがずさんなのでコードのカスタマイズを好みません。

<activity
        Android:name=".SplashActivity">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
        <meta-data Android:name="launch_class" Android:value="com.mypackage.MyFirstActivity" />
        <meta-data Android:name="duration" Android:value="5000" />
</activity>

それから、SpashActivity自身が "launch_class"のメタデータを調べて、インテント自体を作ります。メタデータの「期間」は、スプラッシュ画面が表示される時間を定義します。

public class SplashActivity extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.activity_splash);

    ComponentName componentName = new ComponentName(this, this.getClass());

    try {
        Bundle bundle = null;
        bundle = getPackageManager().getActivityInfo(componentName, PackageManager.GET_META_DATA).metaData;
        String launch_class = bundle.getString("launch_class");
        //default of 2 seconds, otherwise defined in manifest
        int duration = bundle.getInt("duration", 2000);

        if(launch_class != null) {
            try {
                final Class<?> c = Class.forName(launch_class);

                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Intent intent = new Intent(SplashActivity.this, c);
                        startActivity(intent);
                        finish();
                    }
                }, duration);

            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
  }
}
1
Joel Teply

CountDownTimerを使用して別のアプローチを達成する

@Override
public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.splashscreen);

 new CountDownTimer(5000, 1000) { //5 seconds
      public void onTick(long millisUntilFinished) {
          mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
      }

     public void onFinish() {
          startActivity(new Intent(SplashActivity.this, MainActivity.class));
          finish();
     }

  }.start();
}
1
ugur

あなたのonCreateメソッドにこれを追加することができます

new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    // going to next activity
                    Intent i=new Intent(SplashScreenActivity.this,MainActivity.class);
                    startActivity(i);
                    finish();
                }
            },time);

そしてあなたが望むようにミリ秒単位であなたの時間の値を初期化します...

private  static int time=5000;

詳細については、このリンクから完全なコードをダウンロードしてください...

https://github.com/Mr-Perfectt/Splash-Screen

0
Ankit Singh

単純なコード、それは動作します:) 単純なスプラッシュ

int secondsDelayed = 1;
    new Handler().postDelayed(new Runnable() {
        public void run() {
            startActivity(new Intent(LoginSuccessFull.this, LoginActivity.class));
            finish();
        }
    }, secondsDelayed * 1500);
0
Agilanbu

私の場合は、2秒間画像を表示するためだけに新しいアクティビティを作成したくありませんでした。 MainAvtivityを起動すると、picassoを使用してイメージがホルダーにロードされます。ロードには約1秒かかることがわかっているので、MainActivity OnCreate内で次のことを行うことにしました。

splashImage = (ImageView) findViewById(R.id.spllll);

    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    int secondsDelayed = 1;
    new Handler().postDelayed(new Runnable() {
        public void run() {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            splashImage.setVisibility(View.GONE);

        }
    }, secondsDelayed * 2000);

アプリケーションを起動すると最初に起こることはImageViewが表示され、statusBarがウィンドウフラグを全画面に設定することによって削除されることです。それからHandlerを使用して2秒間実行し、2秒後にフルスクリーンフラグをクリアしてImageViewの可視性をGONEに設定しました。簡単、簡単、効果的。

0
ClassA

Androidでは本当にシンプルで、スプラッシュスクリーンを実装するためにハンドラの概念を使用しています。

SplashScreenActivity Javaファイルに このコードを貼り付けてください。

SplashScreenActivity xmlファイルに imageviewを使用して任意の画像を配置.

public void LoadScreen() {
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {                 
                Intent i = new Intent(SplashScreenActivity.this, AgilanbuGameOptionsActivity.class);
                startActivity(i);
            }
        }, 2000);
    }
0
Agilanbu

Kotlinで次のコードを記述します。

 Handler().postDelayed({
            val mainIntent = Intent(this@SplashActivity, LoginActivity::class.Java)
            startActivity(mainIntent)
            finish()
        }, 500)

これがあなたを助けることを願っています。ありがとう........

0
Rahul Kushwaha
public class SplashActivity extends Activity {

  Context ctx;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      ctx = this;
      setContentView(R.layout.activity_splash);

      Thread thread = new Thread(){
          public void run(){
              try {
                  sleep(3000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }

              Intent in = new Intent(ctx,MainActivity.class);
              startActivity(in);
              finish();
          }
      };
      thread.start();
  }
}
0
Rishabh Dixit

私はスレッドを使ってAndroidのFlashスクリーンを作りました。

    import Android.content.Intent;
import Android.os.Bundle;
import Android.support.annotation.Nullable;
import Android.support.v7.app.AppCompatActivity;

public class HomeScreen extends AppCompatActivity{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.screen_home);

        Thread thread = new Thread(){
            public void run(){
                try {
                    Thread.sleep(3 * 1000);
                    Intent i = new Intent(HomeScreen.this, MainActivity.class);
                    startActivity(i);
                } catch (InterruptedException e) {
                }
            }
        };
        thread.start();
    }
}
0
Palak Jain