Android Splash闪屏

Why

Getting users to the content they care about should be your #1 priority

Android APP 启动,替代白屏、黑屏、闪屏

当我们的 APP 已经启动但尚未在内存中时,用户点击 app 图标启动应用程序与实际调用启动程序 Activity 的 onCreate()之间可能会有一些延迟。在“冷启动”期间,WindowManager 尝试使用应用程序主题中的元素(如 windowBackground)绘制占位符 UI。 因此,我们可以将其更改为显示启动画面的自定义drawable,而不是显示默认的 windowBackground(通常为白色或黑色,也就是我们常说的黑屏、白屏)。这样,启动画面仅在需要时显示,而且不会减慢用户启动 APP 的速度。

How

最佳方式,通过设置 Theme

1、设计一个 splash screen layout(splash.xml)

了解一下 Android 图层列表:LayerList
https://blog.csdn.net/u011489043/article/details/84958186

<?xml version="1.0" encoding="utf-8"?>
<!-- The android:opacity=”opaque” line — this is critical in preventing a flash of black as your theme transitions. -->

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"

  android:opacity="opaque">
  <!-- 背景颜色 -->
  <item android:drawable="@color/white" />

  <item>
    <!-- splash screen 展示的图片 居中 不缩放 -->
    <bitmap
      android:gravity="center"
      android:src="@drawable/headset" />
  </item>
</layer-list>

2、定义一个 theme,使用以上的 drawable 作为 theme 属性 windowBackground 的值

<style name="SplashTheme" parent="AppTheme">
    <item name="android:windowBackground">@drawable/splash</item>
  </style>

3、之后,我们把以上 theme 作为应用主界面 MainActivity 的 theme:

<activity android:name=".MainActivity"
      android:theme="@style/SplashTheme">

      <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>/>
    </activity>

4、最后,我们在 MainActivity 的 onCreate 方法中使用真实的 theme:

public class MainActivity extends BaseActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // Make sure this is before calling super.onCreate
    setTheme(R.style.AppTheme);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
  }
}

Conclusion

使用以上的方式,splash screen 将在 App 初始化过程中展示,而且不用为 splash 创建额外的 activity。Splash screen 的展示时间与 activity 的创建时间相关。

优点:

  1. 不需要单独声明诸如 LaunchActivity/SplashActivity 类的额外的 Activity;
  2. Splash screen 的展示时间与 activity 的创建时间相关。因此不会影响 app 的启动时间;

缺点:

  1. 如果主 Activity 再次被创建,Splash screen 还是会显示(可以用下面的方法解决);
  2. 无法实现按需定制,比如期望该启动画面持续时长等;
  3. 无法加载较大的资源(可以使用懒加载、缓存的方式解决)

注意的问题

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

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

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

// 避免多次启动 启动界面
  @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);
  }

参考文章

带你重新认识:Android Splash页秒开 Activity白屏 Activity黑屏

Splash Screens the Right Way

强推:The (Complete) Android Splash Screen Guide

——乐于分享,共同进步,欢迎补充
——Any comments greatly appreciated
——诚心欢迎各位交流讨论!QQ:1138517609
——CSDN:https://blog.csdn.net/u011489043
——简书:https://www.jianshu.com/u/4968682d58d1
——GitHub:https://github.com/selfconzrr

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android 应用程序中,闪屏页是一个启动页,通常用于展示应用程序的 Logo 或者欢迎语,同时在后台加载应用程序的内容。实现一个简单的闪屏页,可以按照以下步骤进行操作: 1. 在项目的 res/layout 目录下创建一个布局文件,例如 splash_screen.xml,该布局文件包含一个 ImageView 控件,用于展示应用程序 Logo。 2. 在项目的 res/drawable 目录下添加应用程序的 Logo 图片,例如 logo.png。 3. 在 AndroidManifest.xml 文件中指定应用程序的启动页为 splash_screen.xml 文件。 4. 在应用程序启动时,将闪屏页展示出来,并在后台加载应用程序的内容。可以使用 Handler 或者 CountDownTimer 实现延时操作,并在延时结束后跳转到应用程序的主界面。 以下是一个简单的闪屏页的实现示例代码: splash_screen.xml ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/splash_screen_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/logo_image_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:src="@drawable/logo" /> </RelativeLayout> ``` MainActivity.java ```java public class MainActivity extends AppCompatActivity { // 延时时间,单位为毫秒 private static final long SPLASH_DELAY_TIME = 2000; private Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 显示闪屏页 setContentView(R.layout.splash_screen); // 延时跳转到主界面 mHandler.postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(MainActivity.this, HomeActivity.class); startActivity(intent); finish(); } }, SPLASH_DELAY_TIME); } } ``` 需要注意的是,闪屏页只是应用程序的一个启动页,不应该过于复杂,以免影响应用程序的启动速度。闪屏页的展示时间应该尽量短,一般不超过 3 秒。同时,闪屏页也不应该包含应用程序的主要功能,以免用户误解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BugFree_张瑞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值