启动白屏
简单原因
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、某些耗时初始化放在线程中进行