本周(也是上班第二周)的主要任务是开发一个app的启动画面(splash screen),记录一下遇到的问题和解法。
问题一:标题栏除不掉
解法:在style里面设置theme为NoActionBar,我的代码如下:
1 <style name="Splash" parent="Theme.AppCompat.NoActionBar"> 2 <item name="android:windowBackground">@drawable/splash</item> 3 </style>
对比图如下,左边有标题栏,右边就没有啦。
问题二:屏幕顶部的通知栏颜色跟我的splash screen图片颜色不一致。
解法一:设置style的颜色,让其主色调跟splash screen图片颜色一样。
解法二:换一张跟app主色调一致的图片。
这个比较简单,所以没什么代码可以贴,直接上对比图说明问题。
说明:上面这两张对比图是为了发这篇文章故意弄出来的,我是用了两个不同的theme。左边是Theme.AppCompat.Light.NoActionBar,右边是Theme.AppCompat.NoActionBar。但是我主要是想说明最顶上那个状态栏的颜色是通过theme来设置的。这样做的好处是当你app的颜色风格确定了,就不用担心不同UI的颜色变化,因为系统会自己变。
问题三:因为android自身的原因,在splash screen前面还会闪过一个纯色画面。这是个非常有趣的问题,在下面这篇文章的帮助下,我理解并顺利解决了(解法就是问题一的代码)
http://cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous/
他讲得很清楚,我就不赘述了(实际上也是我打字好难讲清楚,感觉需要配上很多动画说明哈哈)
问题四:在用户登录成功后,按后退键,画面没有任何反应(理论上应该要回到home screen)。
问题四分析:在Android里,一系列的activity会存在stack里面,这样当用户返回时,系统可以知道要显示哪一个画面。但是有一个前提条件是,这个stack里面的activity必须都是用户通过UI操作得到的连贯的activity。而我们的app在点击登录以后,是通过broadcastReceiver的方式去传播和接受信号的,所以登录成功后启动新activity也是在broadcastReceiver里进行的(不是UI操作的),所以会破坏掉原来的stack。(我知道我讲的特别不清楚QAQ)
登录过程和登录成功后启动主画面的过程应该是两个不同的task。也就是说登录成功后,本来就不应该返回到登录画面。
因为task的定义就是一系列为了同一个job服务的activity的集合,它存在的意义是为了确保UI体验的连贯性。
解法:在登录成功后,跳转activity是设置flag为FLAG_ACTIVITY_CLEAR_TASK
我试过FLAG_ACTIVITY_NEW_TASK,但是没用。查了才发现如果已经存在task,那new task是不会生效的。有趣吧?~
总的体会是了解背后的机制是一个非常有趣的学习过程。另外就是你学到的永远都只是皮毛,因为你不知道的实在是太多太多了!就像上面的FLAG就有很多很多种。这时候,有效的学习方式应该是明确学习目的,不要把自己当成新华字典要记住每一个,因为最后很有可能什么都记不住还会让自己觉得很烦压力很大没成就感。
另外一个体会是,记录自己的问题和解法真的很难,因为用文字把问题描述清楚就很痛苦,我又不会做动画图。但是不记录我可能就忘了。不能浪费任何一次学习的经验啊。
最后,还是不要在上班时间写文章比较好,不然我一直很急躁。
希望以后可以多一点耐心和细心,好好记录自己遇到的问题和解决的方法。