本周(也是上班第二周)的主要任務是開發一個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就有很多很多種。這時候,有效的學習方式應該是明確學習目的,不要把自己當成新華字典要記住每一個,因為最后很有可能什么都記不住還會讓自己覺得很煩壓力很大沒成就感。
另外一個體會是,記錄自己的問題和解法真的很難,因為用文字把問題描述清楚就很痛苦,我又不會做動畫圖。但是不記錄我可能就忘了。不能浪費任何一次學習的經驗啊。
最后,還是不要在上班時間寫文章比較好,不然我一直很急躁。
希望以后可以多一點耐心和細心,好好記錄自己遇到的問題和解決的方法。