启动白屏

简单原因

app启动时需要创建进程,若初始化任务比较繁重,准备工作太长,造成需要等待,而这个等待时间就会造成白屏;

具体分析

一、app启动执行任务
  • 第一阶段
    1、加载启动app
    2、启动后显示空白启动窗口
    3、创建app进程
  • 第二阶段
    1、创建app对象
    2、启动主线程
    3、创建MainActivity
    4、渲染视图
    5、执行onLayout
    6、执行onDraw
二、应用启动模式

1、冷启动:系统没有当前应用的进程,或进程已被杀死的情况下,启动应用;因需要更多的准备工作,故需要更多的准备时间。 第一阶段、第二阶段皆执行
2、热启动:系统中存在当前应用进程,重新启动应用,不需要重新 初始化对象/渲染布局等准备工作。此模式,只初始化页面值、构造方法、及生命周期
3、温启动:系统中存在当前应用进程,但需重新创建Application对象,渲染界面、布局等工作。此模式执行第二阶段

三、Android系统启动流程

Android 服务启动流程:只运行在Dalvik虚拟机进程中的服务启动,过程如下:

  • init进程
    init进程会执行app_progress程序,创建Zygote进程
  • Zygote进程:Android系统最重要的进程,所有后续的应用程序都是由它fork出来的
    Zygote进程首先fork出"SystemServer"进程
    从zygote进程fork出新进程——创建Application类——Application.attachBaseContext()——Application.onCreate()——创建入口Activity——Activity.onCreate()——Activity生命周期方法
  • SystemServer 进程
    SystemServer 进程的任务是:将所有Android核心服务启动起来
    包括熵服务(Entropy Service)、电源管理器(Power Manager)、Activity管理器(Activity Manager)、通话寄存器(Telephony Registry)、包管理器(Package Manager)、账户管理器(Account Manager)、内容管理器(Content Manager)、内容提供器(System Content Providers)、电池服务(Battery Service)、光线服务(Lights Service)、振动服务(Vibrator Service)、闹钟管理器(Alarm Manager)、看门狗(Init Watchdog)、窗口管理器(Window Manager)、蓝牙服务(Bluetooth Service)等

更加详细流程请自行搜索:Android 系统启动流程简介

解决方案

一:SplashActivity延时

public class SplashActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        //不推荐这种写法,容易内存泄漏
        new Handler().postDelayed(
                new Runnable() {
                    @Override
                    public void run() {
                        startActivity(new Intent(SplashActivity.this
                                ,MainActivity.class));
                        finish();
                    }
                }, 1000
        );
    }
}

二:修改style

修改res - values - styles.xml文件
1、修改系统style

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowFullscreen">true</item> //页面全屏 
		<item name="android:windowBackground">@null</item> //设置app整体背景
		<item name="windowNoTitle">true</item> //设置app去掉默认title
    </style>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowFullscreen">true</item> //页面全屏 
		<item name="android:windowBackground">@drawable/pic_run</item>  //设置app整体背景
		<item name="windowNoTitle">true</item> //设置app去掉默认title
    </style>

2、给Splash设置theme

<style name="start_style" parent="Theme.AppCompat.Light.DarkActionBar">
     <item name="android:windowBackground">@drawable/pic_run</item>
      <item name="android:windowFullscreen">true</item> //页面全屏 
</style>

启动界面设置theme

<activity android:name=".SplashActivity"
    android:theme="@style/start_style"
    >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

建议

1、尽量不要在Application进行耗时操作
2、第三方SDK在使用时初始化
3、某些耗时初始化放在线程中进行