项目使用的是组件化,需要在初始化时解析各组件对配置文件,然后分发配置文件初始化组件,这些繁杂操作得在application去初始化
public class AppContext extends MultiDexApplication {
private ArrayList<ACComponentBase.ComponentEntity> components = new ArrayList<>();
private static AppContext sAppContext;
@Override
public void onCreate() {
super.onCreate();
sAppContext = this;
registerActivityLifecycleCallbacks(ActivityHelper.getInstance());
//组件初始化
initComponentsFromXml();
invokeOncreate();
invokeOnAllInitialized();
}
@Override
public void onTerminate() {
super.onTerminate();
invokeOnTerminate();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
invokeOnConfigurationChanged(newConfig);
}
@Override
public void onLowMemory() {
super.onLowMemory();
invokeOnLowMemory();
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
invokeOnTrimMemory(level);
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
invokeAttachBaseContext(base);
}
还有一个根本历史原因:
当系统启动一个APP时,zygote进程会首先创建一个新的进程去运行这个APP,但是进程的创建是需要时间的,在创建完成之前,界面是呈现假死状态的,这就很尴尬了,因为用户会以为没有点到APP而再次点击,这极大的降低用户体验,Android需要及时做出反馈去避免这段迷之尴尬。于是系统根据你的manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。而这个黑(白)屏正式的称呼应该是Preview Window,即预览窗口。
好了,现在我们明白了,Preview Window其实是为了提高用户体验而有意设定的。因此,其实如果不是强迫症,它可能并不是一个问题。
目前app的设计思路,都会有一个启动页,来进行一些数据的初始化等一些比较耗时的操作,这就会造成启动页短暂的白屏或者黑屏(黑还是白取决于你的默认主题)。那么,如何解决这种问题的?今天介绍一种比较完美的解决方案:layer_list叠加层。
如果启动页是默认一张静态图,那么可以使用下面的方式:
- 直接定义一个主题在启动的activity
<resources>
<!-- 应用启动页(StartingWindow)的theme -->
<style name="AppTheme.StartingWindowTheme" parent="AppTheme">
<item name="android:windowBackground">@drawable/start_bg_2</item>
</style>
</resources>
- 定义自定义 layer_list叠加层
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 整体的背景颜色 -->
<item android:drawable="@color/white" /> <item>
<!-- 中间的图片 -->
<bitmap
android:gravity="center"
android:src="@drawable/icon_welcome"
android:scaleType="center" />
</item>
</layer-list>
根据上面的layer_list 给启动的activity增加背景
<style name="SplashAppTheme" parent="android:Theme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowBackground">@drawable/layer_splash</item>
</style>
- 给activity设置上面的主题就行;
网友评论