当前位置:   article > 正文

Android启动页解决攻略最终版

android启动页设置singletask,点击桌面图标回到前台

相信很多人都在网上查过关于启动白屏或者黑屏的问题。

一般的App应该是分为两种:

  • 有闪屏页或者启动页(SplashActivity),页面大概会持续2到3秒
  • 没有闪屏页和启动页,打开应用后会直接跳转到应用主界面

不管有没有启动页,如果你不处理,你会发现当你点击桌面上那个icon图标的时候会先闪白屏或者黑屏一下,然后才会进入我们设定的页面。

但是我们手机上的常用应用,比如美团,今日头条,微信等,点击app icon的时候,其实感觉是一瞬间秒开的,没有白屏的过程,那么这是如何处理的呢?

先说一说为什么会出现白屏或者黑屏吧!

当打开一个Activity时,如果这个Activity所属的应用还没有在运行,系统会为这个Activity所属的应用创建一个进程,但进程的创建与初始化都需要时间,如果没有任何反应的话,如果程序初始化的时间很长,用户可能还以为没有点到相应的位置。但此时所启动的程序还没初始化完,既无法显示程序,又不能停在原处不做任何动作,这就有了Starting Window的概念,也可以称之为Preview Window。

Starting Window就是一个用于在应用程序进程创建并初始化成功前显示的临时窗口,拥有的Window Type是TYPE_APPLICATION_STARTING。在程序初始化完成前显示这个窗口,以告知用户系统已经知道了他要打开这个应用并做出了响应,当程序初始化完成后显示用户UI并移除这个窗口。

显示白屏或者黑屏,是由你的启动Activity或者Application来决定的。如果你使用的是Light主题,那么就可能出现白屏;如果你使用的是Black主题,那么就可能出现黑屏。当你设置Light或者Black主题时,Starting Window显示的就是你启动Activity的android:windowBackground属性,所以才会出现白屏或者黑屏的情况。

网上有很多教程,说是把主题的背景设为透明,这样子的确实没有白屏了,但是你会发现点击完app的icon之后,会有一小会的停顿,给用户一种卡顿的感觉,体验非常不好,不能为了实现功能而实现功能,软件开发用户体验至上!


那么好的体验该如何开发呢?我们以实现一个今日头条app的启动页作为案例。

我们先来看一看常规情况下app启动的黑白屏。

为了让白屏或者黑屏明显的显示,在SplashActivity的onCreate方法中setContentView之前加入一个休眠1秒的操作。

  1. /*还没有加载布局是睡眠1秒,确保黑屏或白屏效果明显*/
  2. try {
  3. Thread.sleep(1000);
  4. } catch (InterruptedException e) {
  5. e.printStackTrace();
  6. }
  1. /**闪屏页持续1s然后进入主页*/
  2. mHandler.postDelayed(new Runnable() {
  3. @Override
  4. public void run() {
  5. Intent intent = new Intent(activity,AdsActivity.class);
  6. startActivity(intent);
  7. finish();
  8. overridePendingTransition(R.anim.fade,R.anim.hold);
  9. }
  10. }, 1000);

效果是:

img_b565edb6fd452875dc5e23d2c9d5cbe0.gif
没做任何处理的启动页

接下来我们来消灭白屏。

第一步 消灭白屏

1.我们需要删除原来的闪屏页的布局activity_splash.xml,同时删除SplashActivity中setContentView(R.layout.activity_splash)方法。

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. /*还没有加载布局是睡眠1秒,确保黑屏或白屏效果明显*/
  5. try {
  6. Thread.sleep(1000);
  7. } catch (InterruptedException e) {
  8. e.printStackTrace();
  9. }
  10. // setContentView(R.layout.activity_splash);
  11. }

2.为了让闪屏页持续时间长一点,我们用handler模拟耗时操作,1秒后进行跳转。

  1. mHandler.postDelayed(new Runnable() {
  2. @Override
  3. public void run() {
  4. //这块耗时操作可以进行初始化,或者网络请求等,1秒结束后跳转到广告页面
  5. Intent intent = new Intent(activity,AdsActivity.class);
  6. startActivity(intent);
  7. finish();
  8. }
  9. }, 1000);

3.我们删除了闪屏页的布局文件,想法是将闪屏的背景作为Activity的主题背景,要做到这一点,首先要在 res/drawable创建一个XML drawable文件。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:drawable="@color/white" />
  4. <item android:bottom="20dp">
  5. <bitmap
  6. android:gravity="bottom"
  7. android:src="@mipmap/icon_logo" />
  8. </item>
  9. </layer-list>

4.接下来在style.xml中创建一个闪屏页的主题,将创建的xml设置为window的背景。并且在AndroidManifest.xml中给SplashActivity配置style。

  1. <style name="AppTheme.Splash" parent ="android:Theme.Holo.Light.NoActionBar">
  2. <item name="android:windowBackground">@drawable/drawable_splash</item>
  3. </style>
  1. <activity android:name=".SplahActivity"
  2. android:theme="@style/AppTheme.Splash">
  3. <intent-filter>
  4. <action android:name="android.intent.action.MAIN" />
  5. <category android:name="android.intent.category.LAUNCHER" />
  6. </intent-filter>
  7. </activity>

这个时候运行程序,我们发现其实已经没有白屏了。

第二步,我们实现广告加载页面

** 1.广告页是一个倒计时的显示,布局中放入一个TextView来显示倒计时信息,放入一个ImageView来显示加载动画。点击跳过广告的时候显示加载动画。**

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <ImageView
  6. android:id="@+id/iv_logo"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:src="@mipmap/icon_logo"
  10. android:layout_marginBottom="20dp"
  11. android:layout_alignParentBottom="true"
  12. android:layout_centerHorizontal="true"/>
  13. <RelativeLayout
  14. android:layout_marginBottom="20dp"
  15. android:layout_above="@+id/iv_logo"
  16. android:layout_width="match_parent"
  17. android:layout_height="match_parent"
  18. android:background="@color/colorAccent">
  19. <TextView
  20. android:id="@+id/tv_ads"
  21. android:layout_alignParentRight="true"
  22. android:layout_marginTop="20dp"
  23. android:layout_marginRight="20dp"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:text="跳过广告"
  27. android:textColor="@color/white"
  28. android:textSize="12sp"
  29. android:background="@drawable/bg_ad_text"
  30. android:padding="5dp"/>
  31. </RelativeLayout>
  32. </RelativeLayout>

2.页面实现中,我们定义一个CountDownTimer,这个类是Android SDK提供用来进行倒计时的。CountDownTimer(long millisInFuture, long countDownInterval)有两个参数,第一个是计时的总时长,第二个是间隔。

  1. public class AdsActivity extends Activity {
  2. private Activity activity;
  3. private TextView tvAds;
  4. private CountDownTimer countDownTimer;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_ads);
  9. activity =this;
  10. tvAds = (TextView) findViewById(R.id.tv_ads);
  11. countDownTimer = new CountDownTimer(4000,1000) {
  12. @Override
  13. public void onTick(long millisUntilFinished) {
  14. tvAds.setText("跳过广告"+(millisUntilFinished/1000)+"秒");
  15. }
  16. @Override
  17. public void onFinish() {
  18. Intent intent = new Intent(activity,MainActivity.class);
  19. startActivity(intent);
  20. finish();
  21. }
  22. }.start();
  23. /**
  24. * 跳过广告
  25. */
  26. tvAds.setOnClickListener(new View.OnClickListener() {
  27. @Override
  28. public void onClick(View v) {
  29. countDownTimer.cancel();
  30. Intent intent = new Intent(activity,MainActivity.class);
  31. startActivity(intent);
  32. finish();
  33. }
  34. });
  35. }
  36. }

第三步,优化

1.我们运行起来,发现页面之间的跳转有些不美观,从右向左进入的动画感觉有些生硬。因此我们给页面之间加入转场动画。

  1. #fade.xml 页面退出动画
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <alpha xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:interpolator="@android:anim/accelerate_interpolator"
  5. android:fromAlpha="0.0" android:toAlpha="0.0"
  6. android:duration="400" />
  1. #hold.xml 页面进入动画
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <translate xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:interpolator="@android:anim/accelerate_interpolator"
  5. android:fromXDelta="0" android:toXDelta="0"
  6. android:duration="400" />

在每个Intent跳转的地方加入转场效果

  1. Intent intent = new Intent(activity,AdsActivity.class);
  2. startActivity(intent);
  3. finish();
  4. overridePendingTransition(R.anim.fade,R.anim.hold);

最终的效果是:

img_364b6d49dc2ece8801098fc980edf0dd.gif
消除黑白屏的启动页

有两点注意:

  • overridePendingTransition方法要写在finish后面
  • overridePendingTransition方法一定要写在主线程中,在子线程是没有作用的。

源码地址:http://download.csdn.net/download/u012771445/9971093

本文作者: shijiacheng
本文链接:http://shijiacheng.studio/2017/09/09/android-splash-demo/
版权声明:本博客所有文章除特别声明外,均为原创文章。请尊重劳动成果,转载注明出处!
转载请注明:转自http://shijiacheng.studio

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/144735
推荐阅读