Android应用开发那些事android开发技巧android UI系列专题

安卓启动页的最佳实践

2020-06-08  本文已影响0人  remax1

前言

在很多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 的生命周期如何走。


图片.png

看这张图,似乎应该在onStop()里去做finish(),其实不然,在系统内存不足的时候可能不会执行onStop()方法。但是onPause一定会走到,且在B 初始化工作准备好后,才会走onPause(),这样就避免了白屏的发生。

上一篇下一篇

猜你喜欢

热点阅读