天天看點

Android鬧鐘界面屬性小結

前些日子回顧到自己以前實作的一款鬧鐘APP,發現其中的提醒界面(即一個時間到了的鬧鐘界面)有許多以前沒有注意到的細節,是以在此寫下一篇小結。

鬧鐘界面的xml代碼如下:

<activity
            android:name=".AlarmActivity"
            android:configChanges="orientation|keyboardHidden|keyboard|navigation"
            android:excludeFromRecents="true"
            android:label="@string/app_name"
            android:launchMode="singleInstance"
            android:theme="@android:style/Theme.Wallpaper.NoTitleBar" >
        </activity>
           

以下針對關鍵屬性進行解釋:

configChanges

一般而言,當一個Activity界面橫豎屏切換了以後,整個Activity會重新加載來重新開機一次Activity以适應變化。但對于我們的鬧鐘界面而言,我們當然不希望當使用者切橫豎屏時,整個界面就被重新加載了。是以我們在configChanges屬性上表示出這些改變的事件,在configChanges上辨別的事件發生時不會導緻Activity重新加載,而是調用onConfigurationChanged這個回調方法來處理。 值的注意的是,網上有資料說明:自從Android 3.2(API 13),在設定Activity的android:configChanges="orientation|keyboardHidden"後,還是一樣 會重新調用各個生命周期的。因為screen size也開始跟着裝置的橫豎切換而改變。是以,在AndroidManifest.xml裡設定的MiniSdkVersion和 TargetSdkVersion屬性大于等于13的情況下,如果我們想阻止程式在運作時重新加載Activity,除了設定"orientation", 我們還必須設定"ScreenSize"

excludeFromRecents

這個屬性設定為true之後,該Activity的運作将不會使應用出現在最近運作的清單上。設定該屬性的理由很簡單,如果使用者很久以前設定了一個鬧鐘,剛剛突然響了,我們總不能就認為使用者剛剛才使用了我們的應用吧。

launchMode

這是屬性是控制Activity的啟動模式的屬性,有四種屬性可選。此處我們選擇的啟動模式為singleInstance,即把這個Activity配置設定到一個獨立的任務棧中去。為什麼要這麼做呢?我也是一次偶然的機會發現了這麼一個情景:假設使用者設定了一個鬧鐘後,并沒有關閉應用,而是回到桌面轉到别的應用中去了。那麼如果在鬧鐘應用程序沒有被回收之前,鬧鐘響了,觸發了鬧鐘界面,此時關閉鬧鐘界面後就有可能出現問題。如果鬧鐘界面的啟動模式不是singleInstance,那麼關閉鬧鐘界面後留下的極有可能是使用者之前沒有關閉的設定鬧鐘的界面,而不是使用者在鬧鐘響起之前所浏覽的界面了。

從上面的總結可以看出,一個小小的鬧鐘界面也是有很大的講究的。對于應用的設計我們需要關注很多細節的東西,最後才能創造出一款精緻的作品。