安卓启动页的最佳实践

作者: remax1 | 来源:发表于2020-06-08 09:47 被阅读0次

    前言

    在很多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(),这样就避免了白屏的发生。

    相关文章

      网友评论

        本文标题:安卓启动页的最佳实践

        本文链接:https://www.haomeiwen.com/subject/azzgzhtx.html