前言
在很多APP启动时,都会先启动一个启动页,在这里我们会做一些逻辑处理,譬如说判断登录状态,再或者说我想做个延时加载,看到这里,可能有人就要问了,启动页还有延时加载这一说?我们先呆着问题先去简单实现一个启动页。
一般我们都会这么做
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
但是实际上我们只需要展示一张图片就够了,然后跳转到主界面,无需这个XML文件其实。
一般做法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
runOnUiThread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(3000);
//之前登录过,直接进入主界面
if ((Boolean) AppSharePreferenceMgr.get(getApplicationContext(), Constans.LOGIN_SUCCESS, false)){
startActivity(new Intent(getApplicationContext(), MainActivity.class));
}else {
startActivity(new Intent(getApplicationContext(),LoginActivity.class));
}
}
});
可以看到没有调用setContentView()了,这样做会节约很多加载视图的时间。再让线程休眠几秒钟,来做一个类似启动准备的效果。但是这里的背景图片去哪里了呢?我们接着往下看。
第二步:AndroidManifast文件设置主题
<activity android:name=".activity.LunchActivity"
android:launchMode="singleTop"
android:theme="@style/LunchTheme"
>
然后在这个自定义主题主题里面把启动页图片放进去
style name="LunchTheme" parent="Theme.AppCompat">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowBackground">@drawable/ic_logo</item>
</style>
划重点
思考一下,为什么要线程休眠3秒,我休眠1秒不行吗? 这个启动页效果 ,到底该休眠几秒。
请看下面的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ((Boolean) AppSharePreferenceMgr.get(getApplicationContext(), Constans.LOGIN_SUCCESS, false)){
startActivity(new Intent(getApplicationContext(), MainActivity.class));
}else {
startActivity(new Intent(getApplicationContext(),LoginActivity.class));
}
}
@Override
protected void onPause() {
super.onPause();
finish();
}
为什么要这么写,这跟activity的生命周期有关。请看从A启动B 的生命周期如何走。
![](https://img.haomeiwen.com/i23081280/bf9f2c87856c9db6.png)
看这张图,似乎应该在onStop()里去做finish(),其实不然,在系统内存不足的时候可能不会执行onStop()方法。但是onPause一定会走到,且在B 初始化工作准备好后,才会走onPause(),这样就避免了白屏的发生。
网友评论