一、优化启动白屏
其实对于优化启动白屏有三种:
主题里设置
1、
<item name="android:windowIsTranslucent">true</item>
2、
<item name="android:windowBackground">xxxx</item>
3、
<item name="android:windowDisablePreview">true</item>
通过对某些常用app反编译来看,很多使用的是设置
<item name="android:windowBackground">@null</item>
<item name="android:windowDisablePreview">true</item>
这样设置点击应用图标的时候会有短暂的停顿,然后再启动app。
或者把
<item name="android:windowBackground">xxxx</item>
设置成图片,主要需要和启动页的图片一致,这样可以马上看起应用启动。但是为了不影响后面的activity,最好启动的activity设置成单独的主题。
这里还有一个问题就是现在全面屏手机都有导航栏,需要注意启动的时候导航栏显示问题。大部分的做法是,将启动页设置成全屏的,然后将导航栏设置成全透明来适配。导航栏和状态栏设置成全透明的代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
window.setNavigationBarColor(Color.TRANSPARENT);
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
项目中需要用到沉浸式设计最好还是在代码里设置,主题里设置有坑,也可以用别人写好的工具类来实现。
二、优化启动速度
当然这个主要就是是在application和activity的onCreate不要做太多初始化的工作。这里可以使用IntentService来进行初始化
public class InitializeService extends IntentService {
private static final String ACTION_INIT = "initApplication";
public InitializeService() {
super(ACTION_INIT);
}
public static void start(Context context) {
Intent intent = new Intent(context, InitializeService.class);
intent.setAction(ACTION_INIT);
context.startService(intent);
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
final String action = intent.getAction();
if (ACTION_INIT.equals(action)) {
initApplication();
}
}
}
private void initApplication() {
//在这里作初始化工作
}
}
使用的时候注意一点某些第三方sdk可能会使用handler,这样可能会报错,所以有这样的第三方sdk只能放到主线程里去进行初始化了,或者懒加载,需要使用的时候进行初始化。