##概要
Androidアプリを作る際に、一番最初のアニメーションみたいなのをSplashと言います。
このスプラッシュを取り入れるための方法をAndroidアプリ開発初心者向けに書きたいと思います。以下のようなものを今回はSampleとして作りました。
###1.Activityの新規追加
java > .....みたいなところを右クリック
New > Activity > EmptyActivity を選択
名前を好きなように変更(今回はSplashActivity
に変更)
するとこんな感じのができます。
SplashActivity
とMainActivity
で画面が切り替わった時の違いを見るために今回はSplashActivity
の背景を青にしたいと思います。そのため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を使う場合はどうでしょうとアドバイス頂きましたので修正いたしました)
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.javapackage 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]
<?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
を以下のように書き直すとこの問題を防ぐことができます。
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を削除
}
};
}
以上となります。