什么叫做冷启动
第一次启动或者被用户主动杀死 app 进程, 或者被系统主动回收掉, 整个 app 的后台任务被清理, 回到桌面再次点击 app 的桌面图标启动 app
* 特点 *
后台任务全部结束, 再次启动
当然还有与之对应的热启动
* 热启动 *
用户点击返回键退推到桌面上, 后台任务没有被杀死再次点击桌面图标启动 app
* 特点 *
未清理后台任务, 再次启动
app 启动时, 每一个 app 都会至少创建一个进程出来, 一些启动多线程任务的会创建出来多个进程
为什么会出现白屏现象
首先我们要知道当打开一个 Activity 的时候发生了什么?
在一个 Activity 打开时, 如果该 Activity 所属的 Application 还没有启动, 那么系统会为这个 Activity 创建一个进程
每创建一个进程都会调用一次 Application, 所以 Application 的 onCreate()方法可能会被调用多次
在进程的创建和初始化中, 势必会消耗一些时间, 在这个时间里, WindowManager 会先加载 APP 里的主题样式里的窗口背景 (windowBackground) 作为预览元素, 然后才去真正的加载布局
如果这个时间过长, 而默认的背景又是黑色或者白色, 这样会给用户造成一种错觉, 这个 APP 很卡, 很不流畅, 自然也影响了用户体验
效果图对比较:
启动过长出现白屏效果:
利用 IntentService 优化后的效果:
在 application 里做一些耗时的一些逻辑:
利用 IntentService 进行帮助 application 逻辑相关的异步处理
MyIntentService:
该项目是一个关于 GreenDao 的一个学习案例
:
相关该用例中的 demo 相关 CSDN 连接:
http://download.csdn.net/detail/androidstarjack/9834686
另外参考了网上的另外 2 种方式这里也进行总结一下.
1 将背景图设置成我们 APP 的 Logo 图, 作为 APP 启动的引导, 现在市面上大部分的 APP 也是这么做的
- <style name="AppWelcome" parent="AppTheme">
- <item name="android:windowBackground">@mipmap/bg_welcome_start</item>
- </style>
2 将背景颜色设置为透明色, 这样当用户点击桌面 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>
IntentService: 异步处理服务, 新开一个线程: handlerThread 在线程中发消息, 然后接受处理完成后, 会清理线程, 并且关掉服务
IntentService 有以下特点:
它创建了一个独立的工作线程来处理所有的通过 onStartCommand()传递给服务的 intents
创建了一个工作队列, 来逐个发送 intent 给 onHandleIntent()
不需要主动调用 stopSelft()来结束服务因为, 在所有的 intent 被处理完后, 系统会自动关闭服务
默认实现的 onBind()返回 null
默认实现的 onStartCommand()的目的是将 intent 插入到工作队列中
这次主要是针对于 APP 第一次启动过长 出现白屏的解决方案.
如何避免 app 启动时间过长呢?
1 不要让 Application 参与业务的操作
2 不要在 APPlication 进行耗时操作, 比如有些开发者会在自己的 APP 里一系列文件夹或文件(比如我自己), 这些 I/O 操作应该放到确实该使用的时候再去创建亦或者是数据库的一些操作
3 不要以静态变量的方式在 Application 中保存数据等
* 另外性能分析工具请参考:*
BlockCannery - 一个强大的 Android 程序调试工具, 轻松帮你找出卡顿
* 性能优化篇:*
Android 性能优化 (1) 内存溢出和内存泄漏的介绍
相信自己, 没有做不到的, 只有想不到的
来源: http://blog.csdn.net/androidstarjack/article/details/71218919