android冷启动中(欢迎页splash页)中的白屏问题

来源:互联网 发布:java培训班排名 编辑:程序博客网 时间:2024/05/07 18:05

1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。

特点:冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

2、热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。

3、在冷启动的时间段内发生了什么?
首先我们要知道当打开一个Activity的时候发生了什么,在一个Activity打开时,如果该Activity所属的Application还没有启动,那么系统会为这个Activity创建一个进程(每创建一个进程都会调用一次Application,所以Application的onCreate()方法可能会被调用多次),在进程的创建和初始化中,势必会消耗一些时间,在这个时间里,WindowManager会先加载APP里的主题样式里的窗口背景(windowBackground)作为预览元素,然后才去真正的加载布局,如果这个时间过长,而默认的背景又是黑色或者白色,这样会给用户造成一种错觉,这个APP很卡,很不流畅,自然也影响了用户体验。

特点:热启动因为会从已有的进程中来启动,所以热启动就不会走application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化application,因为一个应用从新进程的创建到进程的销毁,application只会初始化一次。
既然上述问题不是出在application,那么肯定就是在Activity了,是setContentView导致的
解决方法:
1.我们可以定义一个theme,然后给theme设置背景就好了:

<style name="StartTheme" parent="AppTheme">    <item name="android:windowBackground">@mipmap/icon_splash</item></style>

2.这么做有个问题,图片的内存会释放不掉,所以放在activity的super调用前,用流资源方式加载图片,设置到window的背景中去就好了
3.将背景颜色设置为透明色,这样当用户点击桌面APP图片的时候,并不会”立即”进入APP,而且在桌面上停留一会,其实这时候APP已经是启动的了,只是我们心机的把Theme里的windowBackground的颜色设置成透明的,强行把锅甩给了手机应用厂商(手机反应太慢了啦,哈哈),其实现在微信也是这样做的,不信你可以试试。

 <style name="Appwelcome" parent="android:Theme.Translucent.NoTitleBar.Fullscreen"/>

透明化这种做法需要注意的一点,如果直接把Theme引入Activity,在运行的时候可能会出现如下异常:

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

这个是因为使用了不兼容的Theme,例如我这里的Activity继承了AppCompatActivity,解决方案很简单:
1、让其Activity集成Activity而不要集成兼容性的AppCompatActivity
2、在onCreate()方法里的super.onCreate(savedInstanceState)之前设置我们原来APP的Theme

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {            setTheme(R.style.AppTheme);            super.onCreate(savedInstanceState);    }}

上面的做法,我们也需要将Theme引入对应的Activity

  <activity            android:name=".app.main.MainActivity"            android:theme="@style/AppWelcome"            android:screenOrientation="portrait">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>
0 0
原创粉丝点击