App 启动页 (Splash),最经典的莫过于微信的启动页了。不过启动页是个好的设计还是不好的设计呢?本文不讨论这个问题,仅从一个开发者的角度来讲解下Android应用启动页的实现,以及一些需要注意的地方。

基本实现

先显示一个界面,停留1~2s,然后跳转到另一个界面。 这里有个延时跳转,可以用 Timer、Handler 实现,我这里用 Handler 来实现。

1. 添加 SplashActivity

首先假设 App 打开的第一个界面为 MainActivity,新建一个 SplashActivity,在 AndroidManifest 中将 SplashActivity 设置为启动后第一个打开的页面:

<activity
      	android:name=".activity.SplashActivity"
      	android:label="@string/app_name"
      	android:theme="@style/AppTheme.NoActionBar.FullScreen">
      	<intent-filter>
            	 	<action android:name="android.intent.action.MAIN" />
            	 	<category android:name="android.intent.category.LAUNCHER" />
      	</intent-filter>
</activity>

这里只是将 MainActivityintent-filter 参数剪切给 SplashActivity,此时你打开 App 第一个显示的就是 SplashActivity 了。

2. 添加跳转

跳转是用 Handler 的 postDelayed() 方法来设置延时来实现的,在 SplashActivityonCreate() 方法中添加一下的代码,就可以实现在1500毫秒后跳转到 MainActivity 了。 这里需要注意的是 Handler 是引用自 android.os.Handler,import 的时候不要搞错了。

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
       @Override
       public void run() {
            Intent intent = new Intent(SplashActivity.this, MainActivity.class);
            startActivity(intent);
            finish();
        }
}, 1500);

postDelayed(Runnable r, long delayMillis) 方法就是设置在设定的时间后执行 Runnable 中的 run()delayMillis 单位是毫秒。

注意的问题

以上两步操作基本实现了启动页的基本功能,不过还是有一些小的问题需要注意的。

1. 只显示一次启动页( App 没被 kill 的情况下)

微信打开之后,按下返回键回到桌面,再打开微信,并不会再看到启动页(除非你手动清了微信的后台或者被系统 kill 了),这个是怎么实现的呢?

其实很简单,只需要重写一下 MainActivityonBackPressed() 方法就行。

@Override
public void onBackPressed() {
    // super.onBackPressed(); 	不要调用父类的方法
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}

以上就实现了和微信一样的效果。

2. 全屏页面切换到非全屏页面的问题

由于启动页一般是全屏显示的,而主页则不是,因此从全屏切换到非全屏就存在一个卡顿的问题,这个问题我之前在 CSDN 上写过一篇解决办法,这里就直接贴地址了: Android 全屏界面切换到非全屏界面的问题

暂时就写这么多,需要 demo 的话可以看我最新开源的项目听雨

如果觉得本文对你有帮助,不妨请猴子吃个桃子