2021年8月9日 星期一

不定時開發日記:為什麼我找不到問題的解答?

網路上程式設計教學或解疑文章成千上萬,但為什麼很少有可以解決自己問題的?

假設這裡有篇解釋「如何使用某某元件」的文章,簡單看一下會發現作者對元件的認知很正確、很充分,行文也很流暢又詳盡、不會「貼個程式碼就了事」,——這樣的文章難道也沒用嗎?

「對!這種文章往往更危險!」

為什麼?怎麼可能?

一般性的原因就不重新贅述,這裡主要是要提出一個可能沒人提過的主張:因為這些文章作者使用的模組/框架有問題。


怎麼會提到模組/框架呢?


以Android來說,Activity基本的生命週期就是種模組/框架,要示範或說明如何使用元件(或任何技術)都必須要以Activity為範例的基礎。

所以模組/框架是存在的。

假定「只要順著基本的生命週期去使用元件必然不會出錯」這是個很嚴重的錯誤假設,因為想要學習怎麼使用元件(或技術)的人很多其實都有個很複雜的商業需求擺在那邊等著他們學習後去滿足,而他們的商業需求讓他們經常要忽略生命週期這類的框架。

聽起來好像沒什麼,就好像「在主線程外更新畫面就使用Handler就好了」,偏偏Android領域中有個「HandlerLeaking」的議題,而且發送Handler還有「Looper權限」.......

以上所說還在於「如果沒正確操作,Error訊息會留下足夠的指引讓人去尋找失敗的原因與解答,」但有些東西(例如MediaPlayer的IllegalState)是根本沒有解答的!(如果有IllegalState,那LegalState的標準何在......找不到啊!找不到啊!真的找不到啊!)


這時候就會發生美妙的悲劇了!

「我按照別人的教學與範本操作,最後專案碰到了一個怎樣都解不開的問題。要整個打掉重做?來不及了!但尋找解答又永遠找不到。」

2021年4月5日 星期一

【Android】onConfigurationChanged的觸發(和Configuration)

有些情況下-主要是指「配置」發生改變-,Activity會被重啟...

這些重啟發生時,經常伴隨「onConfigurationChanged的觸發」。(但官方文件說法是「不會觸發」。)

但如果只希望「onConfigurationChanged的觸發」發生、但不要有Activity重啟時,可以在AndroidManifest中,找到會被重啟的Activity下增加一個屬性「android:configChanges」,並在後面增加對應的參數來決定哪些情況要觸發、哪些情況就任由Activity重啟吧!


Configuration在官方的定義是指「決定系統要取用哪些Resource檔的方式」,像「螢幕是橫式或直式時會取用不同的Layout檔(如果有設定)」。

所以偵測螢幕橫式直式最正確的方式(除了等待onConfigurationChanged觸發)是從Activity下呼叫「getResource().getConfiguration()」去取得Configuration,然後判斷orientation的參數。


這個屬性後面可以接收的參數有:(官方網頁將它列在「activity」的Manifest說明中。)

android:configChanges=["mcc", "mnc", "locale",
                                 
"touchscreen", "keyboard", "keyboardHidden",
                                 
"navigation", "screenLayout", "fontScale",
                                 
"uiMode", "orientation", "density",
                                 
"screenSize", "smallestScreenSize"]

(官網這裡的說明有點奇妙,XML檔無法用這種方式輸入tag的參數,必須要用類似「"mcc|mnc"」這樣的格式才可以。其他欄位的說明有遵照這個模式,唯獨「configChanges」卻是錯誤的。)

比較奇妙的是:如果要針對螢幕轉向做偵測,需要使用多個參數會比較保險。

一般來說,是使用「orientation」和「screenSize」,(甚至再加上「uiMode」。)