編輯:關於Android編程
Activity
:作為四大組件之一,也是與用戶交互最多的組件,因此為了更好的交互效果,了解Activity的生命周期,正確分配每個階段該完成的工作就顯得十分必要,例如:我們不能在onPause
中做耗時的操作,因為新的Activity必須在前一個Activity
執行了onPause
才能執行onResume
顯示。
Activity
的生命周期分為兩部分,一部分是典型情況
下的生命周期,另一部分是異常情況
的生命周期。
典型情況
:正常的生命周期,用戶參與的情況。
異常情況
:Activity被收回或者設備的Configuration發生變化導致Activity被銷毀並重建。
onCreate和onStart:這兩個階段Activity正在創建,可以進行初始化動作,比如setContentView,初始化資源。
onResume:這時Activity已經前台可見,具備交互功能
onPause:表示Activity正在停止,這是可以做一些存儲數據,停止動畫的工作,不能太耗時,不然會影響新的Activity的顯示。
onStop:表示Activity即將停止,這裡可以做一些重量級的操作,也不能太耗時
onDestroy:表示Activity即將銷毀,這裡可以做一些回收動作和資源釋放。
我的操作及日志情況
1.完整的生命周期
2.Activity間跳轉的生命周期
通過上述分析,我們可以清晰的看到生命周期的調用順序,注意,
1.MainActivity跳到SecondActivity的時候,先是回調MainActivity的onPause,然後才回調SecondActivity的直到onResume的操作,為了SecondActivity盡快切換到前台,不應該在onPause中做太耗時的操作。
2.MainActivity跳到SecondActivity的時候,SecondActivity回調onResume後,調用了MainActivity的onStop,這個方法也不應該有太耗時的操作,不然SecondActivity會有卡頓的情況
當系統配置變化時,Activity會被銷毀,但系統會調用onSaveInstanceState
來保存當前的Activity的狀態,這個方法在onStop
之前調用,然後調用onRestoreInstateState
來恢復數據,這個方法在onStart
之後調用
我的操作及日志情況
MainActivity.java
/**
* 注意到onCreate中也有`Bundle savedInstanceState`,也可以在回調onCreate的時候恢復數據,注意先判斷savedInstanceState非空
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG,"MainActivity-->onCreate");
setContentView(R.layout.activity_main);
Log.i("savedInstanceState-->","is null? "+(savedInstanceState==null)+"");
editText = (EditText) findViewById(R.id.edit_text);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG,"MainActivity-->onSaveInstanceState");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG,"MainActivity-->onRestoreInstanceState");
}
通過上述分析,我們可以清晰的看到在切換橫豎屏時數據的保存及恢復情況,自己如果有想保存的數據也可以在saveInstanceState中實現,恢復時既可以在onCreate中,也可以在onRestoreInstanceState中,注意,
1.在按下home鍵,或是切換到另外的Activity時,也會回調onSaveInstanceState保存數據,因為系統也怕在你長時間不操作或內存不足時,Activity被回收,但如果沒有發生系統回收,則不會回調onRestoreInstanceState進行數據恢復
2.即便是我們按下home鍵或者是跳轉到另一個Activity在跳轉回來之前的Activity仍舊保存著之前的EditText中的狀態信息。(Stopped狀態下的Activity仍然保存著所有的狀態信息和成員變量)
Activity按優先級分三種:
(1)前台Activity:正在和用戶交互的Activity,優先級高
(2)可見但非前台Activity:比如有一個AlertDialog彈出時
(3)後台Activity:執行了onStop的Activity
內存不足時,系統就會按照優先級由低到高回收Activity
由上述栗子我們知道資源相關系統配置改變會導致Activity被殺死並重建,不過我們也可以阻止Activity重建,只需給Activity指定configChanges
屬性即可。
例如我們上述的旋轉屏幕的栗子,可以給Activity指定orientation和screenSize屬性,Activity就不會重建。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i(TAG,"MainActivity-->onConfigurationChanged newConfigOrientation"+newConfig.orientation);
}
日志信息
由上述日志可以看出,當我們配置了configChanges後,不會回調onSaveInstanceState和onRestoreInstanceState,也沒有onCreate,取而代之的是onConfigurationChanged,因此我們可以在其中實現自己的邏輯,下面一個小demo在onConfigurationChanged根據橫豎屏更改EditText中的內容
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
editText.setText("ORIENTATION_LANDSCAPE");
}else if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT){
editText.setText("ORIENTATION_PORTRAIT");
}
}
實現效果如下
下面為常用的配置引起Activity重建的屬性
我們在應用中經常看到一些選擇開關狀態的配置文件,做項目的時候用的是android的Switch控件,但是感覺好丑的樣子子個人認為還是自定義的比較好,先上個效果圖:實現過程
一個仿微信朋友圈和QQ空間的九宮格圖片展示自定義控件。GitHub:https://github.com/HMY314/NineGridLayout  
Android Service服務一直運行: &nb
最近公司要把百度地圖集成的項目中,於是我就研究了一天百度地圖的SDK,當前的版本:Android SDK v3.0.0 。 雖然百度地圖網上相關代碼比較多,