前言
闪屏页作为app启动的过渡页面,可以更快的呈现页面给用户,解决app首次启动时加载慢,而出现的黑屏等问题。但随着app运营的需要,闪屏页被更多的赋予了广告的功能。本文主要记录在一次app开发过程中闪屏页的实现方式。
在开发前,想到了几种方式,考虑后期扩展性、容维护,最后选择了闪屏页使用单独Activity,且作为APP 的首页来实现的。
一、闪屏页的实现方式的思考
第一种方式:使用dialog 实现闪屏页,进入到app首页Activity 的oncreate 中弹出一个全屏的dialog。
第二种方式:在app首页Activity 新加一个match_parent 的 view,来实现闪屏页,启动闪屏显示此 view,闪屏结束隐藏。
第三种方式:使用一个新的闪屏 Activity,在app首页Activity 的oncreate中start 闪屏的Activity、
第四种方式:使用一个新的闪屏 Activity,作为 app 的首页Activity,闪屏结束跳转到功能页面。
考虑后期维护,可移植等问题,最后选择了第四种方式实现
二、闪屏实现
1.设置闪屏Activity为app首页
AndroidManifest.xml 中设置闪屏Activity(SplashActivity)为app首页:
<activity
android:name=".SplashActivity"
android:excludeFromRecents="true"
android:noHistory="true"
android:theme="@style/SplashActivityTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
注意其中的各项设置:
android:excludeFromRecents=“true” : Activity 不出现在 “Recent screens” 中,同时会影响后续同一Task的其他activity,所有后续activity需要使用 new task。
android:noHistory=“true” :Activity 不保留在栈中,这样后续 back 按键也不会返回到这个Activity,避免了 back 键闪屏页再次出现的问题。
同时需要注意这里的 android:theme,对应的theme 最好跟闪屏过后跳转的 Activity 使用同样主题和背景,这样跳转的时候页面切换看起来更流畅
2.闪屏Activity的theme
styles.xml代码如下(示例):
<style name="SplashActivityTheme" parent="android:Theme.Black.NoTitleBar.Fullscreen">
<item name="android:windowBackground">@drawable/splash_background</item>
</style>
3.闪屏Activity的内部实现
SplashActivity.java代码如下(示例):
public class SplashActivity extends Activity {
private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
SplashActivity.this.finish();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
mHandler.postDelayed(mRunnable, 2000);
}
@Override
protected void onPause() {
super.onPause();
mHandler.removeCallbacks(mRunnable);
}
}
闪屏页设置的 2s 后自动消失的,消失后跳转到 MainActivity 。
这里需要注意的是,如果用户在闪屏页没有结束的时候,按 home 退出,这个 Handler 并没有停止,还是会在2s 后跳转到 MainActivity。
所以我们需要在 Activity 的 onPause 方法中需要 removeCallbacks 对应的 Runnable。
总结
至此这个闪屏页的实现就完成了,后面也方便扩展可移植。