最近项目中遇到一个问题,从启动页进入到首页时,会有一小段的黑屏时间,导致用户体验很差,我的解决办法如下:
1.延迟启动页的销毁
2.设置首页的Theme为透明样式 代码如下:
MainActivity的Theme:
<style name="MainStyle" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
</style>
销毁启动页的操作放在了MainActivity的onResume方法中:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
AppManager.getAppManager().finishLastActivity();
if (isTransucent){
isTransucent = false;
SystemUtils.convertActivityFromTranslucent(MainActivity.this);
}
}
},1000);
由于我们的首页加载的东西太多了,回调走到onResume都没有展示出视图,所以我还做了一些延迟,除此之外,还有几句代码稍后做解释,
这样处理后,黑屏是消失了,但是windowIsTranslucent这个theme在项目中造成了诸多问题,比如跳转activity会回到桌面,影响生命周期等等,为了解决这些问题,我决定在首页展示正常后 ,再把它还原成非透明状态 避免出现很多问题,也就是这句代码
if (isTransucent){
isTransucent = false;
cn.wlantv.kznk.utils.SystemUtils.convertActivityFromTranslucent(MainActivity.this);
}
如何还原成非透明状态,在Activity中有这两个方法convertToTranslucent和convertFromTranslucent,直接使用反射调用这两个方法
/**
* Convert a translucent themed Activity
* 将Activity 改为透明
*/
public static void convertActivityToTranslucent(Activity activity) {
long timeMillis = SystemClock.currentThreadTimeMillis();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
convertActivityToTranslucentAfterL(activity);
} else {
convertActivityToTranslucentBeforeL(activity);
}
}
/**
* Calling the convertToTranslucent method on platforms before Android 5.0
*/
public static void convertActivityToTranslucentBeforeL(Activity activity) {
try {
Class<?>[] classes = Activity.class.getDeclaredClasses();
Class<?> translucentConversionListenerClazz = null;
for (Class clazz : classes) {
if (clazz.getSimpleName().contains("TranslucentConversionListener")) {
translucentConversionListenerClazz = clazz;
}
}
Method method = Activity.class.getDeclaredMethod("convertToTranslucent",
translucentConversionListenerClazz);
method.setAccessible(true);
method.invoke(activity, new Object[] {
null
});
} catch (Throwable t) {
}
}
/**
* Calling the convertToTranslucent method on platforms after Android 5.0
*/
private static void convertActivityToTranslucentAfterL(Activity activity) {
try {
Method getActivityOptions = Activity.class.getDeclaredMethod("getActivityOptions");
getActivityOptions.setAccessible(true);
Object options = getActivityOptions.invoke(activity);
Class<?>[] classes = Activity.class.getDeclaredClasses();
Class<?> translucentConversionListenerClazz = null;
for (Class clazz : classes) {
if (clazz.getSimpleName().contains("TranslucentConversionListener")) {
translucentConversionListenerClazz = clazz;
}
}
Method convertToTranslucent = Activity.class.getDeclaredMethod("convertToTranslucent",
translucentConversionListenerClazz, ActivityOptions.class);
convertToTranslucent.setAccessible(true);
convertToTranslucent.invoke(activity, null, options);
} catch (Throwable t) {
}
}
//设置Activity的windowIsTranslucent为false
public static void convertActivityFromTranslucent(Activity activity) {
try {
Method method = Activity.class.getDeclaredMethod("convertFromTranslucent");
method.setAccessible(true);
method.invoke(activity);
} catch (Throwable t) {
}
}
这样首页的问题就可以完美解决了
网友评论