【凱子哥帶你夯實應用層】讀 Develop API Guides 有感(一)

轉載請註明出處:http://blog.csdn.net/zhaokaiqiang1992

動態檢測設備屬性

我們可以使用下面的代碼動態檢測當前設備是否具備某一個特性,如是否有方向傳感器

PackageManager pm = getPackageManager();
if(!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
    // This device does not have a compass, turn off the compass feature
    disableCompassFeature();
}

關於targetSdkVersion的含義

我們經常在清單文件裏面這樣設置

<manifest ... >
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
    ...
</manifest>

android:minSdkVersion是指我們的App兼容的最低版本,也就是我們的App在這個版本之下就不能正常運行了,可能是因爲使用了更高版本的API或者是Theme,反正就是不能正常運行。

而android:targetSdkVersion屬性所指定的則是經過我們優化的最高版本。這個屬性並不能保證我們我們的App不能運行在更高的版本上,而是用來說明我們的App是否應該繼承在更高版本上發生的行爲改變。如果我們沒有更新:targetSdkVersion到最新的版本,那麼在最新的版本上運行的時候,那麼系統就假設我們的App是需要向後兼容的。

舉個例子,在4.4版本中,AlarmManager的行爲發生了改變,爲了節省電量,系統會將時間相差不多的Alarm放在一起執行,這樣就不能保證你的Alarm準時運行。所以說,如果你的targetSdkVersion大於等於19,那麼運行時間就是不確定的,但是如果是小於19,那麼就會使用之前老的API,保證Alarm能夠準時運行。

關於onSaveInstanceState()的高級知識

我們都知道如果實現onSaveInstanceState(),可以在裏面保存一些界面的狀態,這樣在UI恢復的時候,可能會使用保存的值恢復UI現場。

其實,默認的onSaveInstanceState()實現會保存當前界面所有具有id屬性的View的狀態,用於現場恢復。Android的framework框架中的幾乎所有的控件都恰當的實現了onSaveInstanceState()方法,比如EditText會保存文本,CheckBox會保存選中狀態等。所以,如果你想恢復現場,給佈局中的控件都設置一個id屬性就ok啦~

當然,我們也可以自己控制讓View不自己保存狀態,只要設置 android:saveEnabled爲false或者是調用setSaveEnabled()就可以了

另外,如果你想測試你的Activity能不能正常的保存用戶數據,你只需要改變你的屏幕方向就可以測試啦,在屏幕方向發生改變的時候,你的Activity會被Destory然後Create,Activity上的信息都不應該丟失,否則,去改改你的代碼吧!

其實啊,之所以屏幕方向改變,Activity會重新生成,是因爲在運行時,設備的configurations發生了改變,爲了讓我們App能夠感應這種變化並作出正確的反應,系統會重新加載當前的Activity,這種變化包括屏幕方向變化,語言環境變化,鍵盤狀態變化等等,和我們在Activity的標籤下設置的 android:configChanges是完全一樣的

關於startActivity和Intent

我們使用Intent來啓動一個Activity是再簡單不過的事情了,但是,如果你想要發送一個隱式意圖開啓Activity的話,你需要考慮沒有Activity與你的Intent的Action匹配的情況,因爲這樣會造成程序crash。所以,以後在發送隱式意圖的時候,用下面的這種形式吧

Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER)
                .putExtra(AlarmClock.EXTRA_MESSAGE, "Timer'")
                .putExtra(AlarmClock.EXTRA_LENGTH, 60)
                .putExtra(AlarmClock.EXTRA_SKIP_UI, true);
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivity(intent);
        } else {
            Toast.makeText(this, "No Activity", Toast.LENGTH_SHORT).show();
        }
發佈了130 篇原創文章 · 獲贊 129 · 訪問量 148萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章