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>
- android冷启动中(欢迎页splash页)中的白屏问题
- android网络图片Splash欢迎页
- Android 处理启动页(Splash)白屏问题
- Android 冷启动解决白屏问题
- Android冷启动白屏
- Splash Screen开场屏在Android中的实现(缓冲页)
- Android 冷启动白屏解析
- android启动时splash页出现白屏/黑屏
- Android 冷启动(所谓白屏)优化方案
- Android Splash界面解决白屏、黑屏等问题
- [Android]Splash界面解决启动白屏/黑屏问题
- 推荐系统中的冷启动问题
- 推荐系统中的冷启动问题
- Android引导页Splash设计
- Android冷启动白屏黑屏处理
- Android冷启动白屏黑屏处理
- android冷启动显示品牌主题页
- 推荐系统中冷启动问题
- cocos2dx Sprite使用同一张纹理会只调用一次渲染
- 学习 Linux,101: LPIC-1 学习路线图
- JavaScript实现二分查找
- linux安装nginx并且配置负载均衡
- Codeforces Round #276 (Div. 1) D. Kindergarten dp
- android冷启动中(欢迎页splash页)中的白屏问题
- Linux centos 下 eclipse 打开文件时关闭
- 【错误】添加重复列名后的报错(Error 1060(42S21))
- 微信小程序tips
- 可交替的最小二乘法(ALS-WR)
- 安卓小技巧专栏(一)@TargetAPI 版本判断实现高低API版本兼容
- Find kth number in a BST
- 关于使用mybatis的几点总结
- android实现简单音频播放器