生活随笔
收集整理的這篇文章主要介紹了
Android 基础 —— 活动的生存周期
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、返回棧
????????Android?中的活動是可以層疊的。我們每啟動一個新的活動,就會覆蓋在原活動之上,然后點擊Back 鍵會銷毀最上面的活動,下面的一個活動就會重新顯示出來。
?????? 其實Android 是使用任務(Task)來管理活動的,一個任務就是一組存放在棧里的活動的集合,這個棧也被稱作返回棧(Back Stack)。棧是一種后進先出的數據結構,在默認情況下,每當我們啟動了一個新的活動,它會在返回棧中入棧,并處于棧頂的位置。而每當我們按下Back 鍵或調用finish()方法去銷毀一個活動時,處于棧頂的活動會出棧,這時前一個入棧的活動就會重新處于棧頂的位置。系統總是會顯示處于棧頂的活動給用戶。
????? 下圖展示了返回棧是如何管理活動入棧出棧操作的。
?
二、返回狀態
??????? 每個活動在其生命周期中最多可能會有四種狀態。
1. 運行狀態
???? 當一個活動位于返回棧的棧頂時,這時活動就處于運行狀態。系統最不愿意回收的就是處于運行狀態的活動,因為這會帶來非常差的用戶體驗。
2. 暫停狀態
???? 當一個活動不再處于棧頂位置,但仍然可見時,這時活動就進入了暫停狀態。你可能會覺得既然活動已經不在棧頂了,還怎么會可見呢?這是因為并不是每一個活動都會占滿整個屏幕的,比如對話框形式的活動只會占用屏幕中間的部分區域,你很快就會在后面看到這種活動。處于暫停狀態的活動仍然是完全存活著的,系統也不愿意去回收這種活動(因為它還是可見的,回收可見的東西都會在用戶體驗方面有不好的影響),只有在內存極低的情況下,系統才會去考慮回收這種活動。
3. 停止狀態
???? 當一個活動不再處于棧頂位置,并且完全不可見的時候,就進入了停止狀態。系統仍然會為這種活動保存相應的狀態和成員變量,但是這并不是完全可靠的,當其他地方需要內存時,處于停止狀態的活動有可能會被系統回收。
4. 銷毀狀態
???? 當一個活動從返回棧中移除后就變成了銷毀狀態。系統會最傾向于回收處于這種狀態的活動,從而保證手機的內存充足。
?
三、活動的生存期
??????? Activity 類中定義了七個回調方法,覆蓋了活動生命周期的每一個環節,下面我來一一介紹下這七個方法。
1. onCreate()
???? 這個方法你已經看到過很多次了,每個活動中我們都重寫了這個方法,它會在活動第一次被創建的時候調用。你應該在這個方法中完成活動的初始化操作,比如說加載布局、綁定事件等。
2. onStart()
???? 這個方法在活動由不可見變為可見的時候調用。
3. onResume()
???? 這個方法在活動準備好和用戶進行交互的時候調用。此時的活動一定位于返回棧的棧頂,并且處于運行狀態。
4. onPause()
???? 這個方法在系統準備去啟動或者恢復另一個活動的時候調用。我們通常會在這個方法中將一些消耗CPU 的資源釋放掉,以及保存一些關鍵數據,但這個方法的執行速度一定要快,不然會影響到新的棧頂活動的使用。
5. onStop()
???? 這個方法在活動完全不可見的時候調用。它和onPause()方法的主要區別在于,如果啟動的新活動是一個對話框式的活動,那么onPause()方法會得到執行,而onStop()方法并不會執行。
6. onDestroy()
這個方法在活動被銷毀之前調用,之后活動的狀態將變為銷毀狀態。
7. onRestart()
這個方法在活動由停止狀態變為運行狀態之前調用,也就是活動被重新啟動了。
?
以上七個方法中除了onRestart()方法,其他都是兩兩相對的,從而又可以將活動分為三種生存期。
1. 完整生存期
活動在onCreate()方法和onDestroy()方法之間所經歷的,就是完整生存期。一般情況下,一個活動會在onCreate()方法中完成各種初始化操作,而在onDestroy()方法中完成釋放內存的操作。
2. 可見生存期
活動在onStart()方法和onStop()方法之間所經歷的,就是可見生存期。在可見生存期內,活動對于用戶總是可見的,即便有可能無法和用戶進行交互。我們可以通過這兩個方法,合理地管理那些對用戶可見的資源。比如在onStart()方法中對資源進行加載,而在onStop()方法中對資源進行釋放,從而保證處于停止狀態的活動不會占用過多內存。
3. 前臺生存期
活動在onResume()方法和onPause()方法之間所經歷的,就是前臺生存期。在前臺生存期內,活動總是處于運行狀態的,此時的活動是可以和用戶進行相互的,我們平時看到和接觸最多的也這個狀態下的活動。為了幫助你能夠更好的理解,Android 官方提供了一張活動生命周期的示意圖,如下圖
?
下面是一個實例:
MainActivity 端:
[java]?view plaincopy
package?cn.com.qiang.activityalive;?? ?? import?android.os.Bundle;?? import?android.app.Activity;?? import?android.content.Intent;?? import?android.util.Log;?? import?android.view.View;?? import?android.view.View.OnClickListener;?? import?android.widget.Button;?? ?? public?class?MainActivity?extends?Activity?{?? ?? ????@Override?? ????protected?void?onCreate(Bundle?savedInstanceState)?{?? ????????super.onCreate(savedInstanceState);?? ????????setContentView(R.layout.activity_main);?? ????????Log.v("MainActivity","onCreate");?? ?????????? ????????Button?button1?=?(Button)findViewById(R.id.button1);?? ????????button1.setOnClickListener(new?OnClickListener()?{?? ?????????????? ????????????@Override?? ????????????public?void?onClick(View?v)?{?? ?????????????????? ????????????????finish();?? ????????????}?? ????????});?? ?????????? ????????Button?button2?=?(Button)findViewById(R.id.button2);?? ????????button2.setOnClickListener(new?OnClickListener()?{?? ?????????????? ????????????@Override?? ????????????public?void?onClick(View?v)?{?? ?????????????????? ?????????????? ????????????????Intent?intent?=?new?Intent(MainActivity.this,SecondActivity.class);?? ????????????????startActivity(intent);?? ????????????}?? ????????});?? ????}?? ?? ????@Override?? ????protected?void?onStart()?{?? ?????????? ????????super.onStart();?? ?????????? ????????Log.d("MainActivity","onStart");?? ????}?? ?????? ????@Override?? ????protected?void?onResume()?{?? ?????????? ????????super.onResume();?? ????????Log.i("MainActivity","onResume");?? ????}?? ?????? ????@Override?? ????protected?void?onPause()?{?? ?????????? ????????super.onPause();?? ????????Log.i("MainActivity","onPause");?? ????????}?? ?????? ????@Override?? ????protected?void?onStop()?{?? ?????????? ????????super.onStop();?? ????????Log.w("MainActivity","onStop");?? ????????}?? ?????? ????@Override?? ????protected?void?onDestroy()?{?? ?????????? ????????super.onDestroy();?? ????????Log.e("MainActivity","onDestory");?? ????????}?? ?????? ????@Override?? ????protected?void?onRestart()?{?? ?????????? ????????super.onRestart();?? ????????Log.v("MainActivity","onRestart");?? ????????}?? }??
SecondActivity 端,用于顯示一個對話框
[java]?view plaincopy
package?cn.com.qiang.activityalive;?? ?? import?android.app.Activity;?? import?android.os.Bundle;?? ?? public?class?SecondActivity?extends?Activity?{?? ?? ????@Override?? ????protected?void?onCreate(Bundle?savedInstanceState)?{?? ?????????? ????????super.onCreate(savedInstanceState);?? ????????setContentView(R.layout.activity_second);?? ????}?? }??
在AndroidManifest.xml中,secondactivity 要這樣注冊
[java]?view plaincopy
<activity??? ????android:name="cn.com.qiang.activityalive.SecondActivity"?? ????android:theme="@android:style/Theme.Dialog">?? </activity> ?
總結
以上是生活随笔為你收集整理的Android 基础 —— 活动的生存周期的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。