Android 初心者向け スプラッシュの入れ方

##概要
Androidアプリを作る際に、一番最初のアニメーションみたいなのをSplashと言います。
このスプラッシュを取り入れるための方法をAndroidアプリ開発初心者向けに書きたいと思います。以下のようなものを今回はSampleとして作りました。

<img width="350" alt="ファイル名" src="https://media.giphy.com/media/3o6Zt1SvwZbdR7g9Ak/giphy.gif">

##方法
![スクリーンショット 2016-08-16 18.45.26.png](https://qiita-image-store.s3.amazonaws.com/0/56510/d48dd5d6-ee3a-ca93-3bfa-d45cbb555064.png)


###1.Activityの新規追加
java > .....みたいなところを右クリック
New > Activity > EmptyActivity を選択

![スクリーンショット 2016-08-16 18.52.34.png](https://qiita-image-store.s3.amazonaws.com/0/56510/224f520b-cdf1-dffa-0156-807cf9ea95c3.png)

名前を好きなように変更(今回は`SplashActivity`に変更)

![スクリーンショット 2016-08-16 18.52.44.png](https://qiita-image-store.s3.amazonaws.com/0/56510/a20e4b29-35e0-eba6-39a6-b23e5ecc9ca7.png)

するとこんな感じのができます。

![スクリーンショット 2016-08-16 18.55.00.png](https://qiita-image-store.s3.amazonaws.com/0/56510/6c6667a3-16dc-0154-f021-edd1b9afb4f8.png)

`SplashActivity`と`MainActivity`で画面が切り替わった時の違いを見るために今回は`SplashActivity`の背景を青にしたいと思います。そのため`activity_splash.xml`を以下のように変更します。

```activity_splash.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:background="#0000FF"
    tools:context="hiroki11x.splashsample.SplashActivity">
</RelativeLayout>
```

`android:background="#0000FF"`を追加しました。

###2. SplashActivityの編集
次に`SplashActivity.java`を変更します。(@kamei-hidetoshi さんから、シンプルにpostDelayedを使う場合はどうでしょうとアドバイス頂きましたので修正いたしました)

```SplashActivity.java
package hiroki11x.splashsample;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);//画面遷移のための    　　　　　　Intentを準備
                startActivity(intent);//実際の画面遷移を開始
                finish();//現在のActivityを削除
            }
        }, 2000);//2秒後にrun()を行う
    }
```


修正前は以下の通りです、少し冗長です
>
>```SplashActivity.java
>package hiroki11x.splashsample;
>
>import android.content.Intent;
>import android.os.Handler;
>import android.support.v7.app.AppCompatActivity;
>import android.os.Bundle;
>
>import java.util.Timer;
>import java.util.TimerTask;
>
>public class SplashActivity extends AppCompatActivity {
>
>    @Override
>    protected void onCreate(Bundle savedInstanceState) {
>        super.onCreate(savedInstanceState);
>        setContentView(R.layout.activity_splash);
>
>        final Handler handler = new Handler();
>        Timer timer = new Timer(false);
>        timer.schedule(new TimerTask() {
>                           @Override
>                           public void run() {
>                               handler.post(new Runnable() {
>                                   @Override
>                                   public void run() {
>                                       // メイン画面に遷移して、現在のSplashActivityを終了
>                                       Intent intent = new Intent(SplashActivity.this, >MainActivity.class);//画面遷移のためのIntentを準備
>                                       startActivity(intent);//実際の画面遷移を開始
>                                       finish();//現在のActivityを削除
>                                   }
>                               });
>                           }
>                       },
>                2000);//2秒後にrun()を行う
>    }
}
```

###3. Androidmanifest.xmlの編集
最後に、このままでは`MainActivity`が一番初めに起動するようになっているので、`SplashActivity`を一番最初に起動するように変更するため`AndroidManifest.xml`を以下のように変更します。

[Before]

```AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="hiroki11x.splashsample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SplashActivity"></activity>
    </application>
</manifest>
```


[After]

```AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="hiroki11x.splashsample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity"></activity>
    </application>
</manifest>
```

##おかしな挙動を防ぐために
@kamei-hidetoshi さんから、アドバイスをいただけましたので加筆修正させていただきます。

>スプラッシュの間にバックボタンまたは、ホームボタンでアプリから離れた時に、勝手にまた起動してしまうのはユーザにとって負担になってしまう場合があります。
対応する場合には、onPauseまたはonStopでタイマーなどを切ってあげないといけないです。

そのため`SplashActivity.java`を以下のように書き直すとこの問題を防ぐことができます。

```SplashActivity.java
package hiroki11x.splashsample;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;

public class SplashActivity extends AppCompatActivity {

    final Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        mHandler.postDelayed(mSplashTask, 2000);
    }

    @Override
    protected void onStop() {
        super.onStop();
        mHandler.removeCallbacks(mSplashTask);
    }

    private Runnable mSplashTask = new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(SplashActivity.this,MainActivity.class);//画面遷移のためのIntentを準備
            startActivity(intent);//実際の画面遷移を開始
            finish();//現在のActivityを削除
        }
    };
}
```

以上となります。