轉載請註明出處: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();
}