編輯:關於android開發
本篇博客就來好好的搞一下Activity的生命周期,如果搞過iOS的小伙伴的話,Activity的生命周期和iOS中ViewController的生命周期非常類似。生命周期,並不難理解。一個人的生命周期莫過於生老病死,花兒的生命周期就是花開花謝了。在Android中Activity的生命周期莫過於Activity的創建到消亡的過程了。本篇博客就會介紹Activity生命周期中的不同階段,通過實例的形式來窺探一下Activity的生命周期。搞明白Activity的生命周期是至關重要的,因為只有搞明白每個生命周期的每個階段,你才能在不同段做不同的事情。
接下來我們將通過一個實例來介紹Activity的生命周期,在這個Demo中會有一個MainActivity, MainActivity就是App啟動後第一個顯示的Activity。在MainActivity上有一個按鈕,點擊這個按鈕就會跳轉到SecondActivity,點擊返回鍵就會從SecondActivity中返回到MainActivity中,再點擊返回鍵就會退出App。通過這一些列的Activity的切換,我們將通過打印Log的方式來進行觀察Activity的生命周期。
一.代碼編寫
其實這篇博客的代碼是非常簡單的,就是重寫Activity生命周期不同階段的方法,然後在方法中進行Log的打印,從而來標記這個生命周期的階段。而Demo的UI也是灰常的簡單的,所以Activity的layout文件就不做過多的贅述了。接下來看一下兩個Activity中的關鍵代碼。
1.下方的代碼是MainActivity中的關鍵代碼,對Activity生命周期的不同階段進行重寫,然後打印日志,標記出是哪個Activity中的哪個方法。在onCreate()方法中通過id獲取Button, 然後給按鈕綁定上單擊事件,點擊button時跳轉到SecondActivity中。具體代碼如下。
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_main); 5 Log.d("lifeCycle", "MainActivity: 我是onCreate方法,我會在Activity第一次被創建是調用"); 6 7 Button jumpButton = (Button) findViewById(R.id.jump_second_button); 8 9 jumpButton.setOnClickListener(new View.OnClickListener() { 10 @Override 11 public void onClick(View v) { 12 //跳轉到SecondActivity 13 Intent intent = new Intent(MainActivity.this, SecondActivity.class); 14 startActivity(intent); 15 } 16 }); 17 } 18 19 20 //Ctrl + O 選擇父類中的方法進行重寫 21 @Override 22 protected void onStart() { 23 super.onStart(); 24 Log.d("lifeCycle", "MainActivity: 我是onStart方法,我會在Activity由不可見變為可見時調用"); 25 } 26 27 28 @Override 29 protected void onResume() { 30 super.onResume(); 31 Log.d("lifeCycle", "MainActivity: 我是onResume方法,我在Activity處於運行狀態時調用"); 32 } 33 34 @Override 35 protected void onPause() { 36 super.onPause(); 37 Log.d("lifeCycle", "MainActivity: 我是onPause方法,我會在Activity暫停時調用"); 38 } 39 40 @Override 41 protected void onStop() { 42 super.onStop(); 43 Log.d("lifeCycle", "MainActivity: 我是onStop方法,我會在Activity停止時調用"); 44 } 45 46 @Override 47 protected void onRestart() { 48 super.onRestart(); 49 Log.d("lifeCycle", "MainActivity: 我是onRestart方法,我會在Activty從停止狀態變為運行狀態時調用"); 50 } 51 52 @Override 53 protected void onDestroy() { 54 super.onDestroy(); 55 Log.d("lifeCycle", "MainActivity: 我是onDestroy方法,我會在Activty銷毀之前調用"); 56 }
2.在SecondActivity中的也是重寫上述方法,唯一的區別就是把上面日志中的MainActivity改成SecondActivity,代碼類似就不往上粘貼了。
二、運行觀察打印的log
運行我們的app,然後觀察打印的日志,通過實例來分析Activity的生命周期。具體步驟如下:
1.創建並激活Activity
首次打開App所打印的Log如下圖所示。打開App首先看到的時MainActivity, 通過Log我們不難看出在MainActiviy首次出現時要調用如下三個方法,經過下方的三個方法,MainActivty就會被創建,然後變為可見,最後處於運行狀態。
(1).onCreate()方法:Activity首次出現創建時會調用該方法,在之前的Demo中我們在此方法中加載Activity的布局和或控件並關聯事件。
(2).onStar()t方法:接著就會執行onStart()方法,Activity由不可見狀態變為可見狀態會調用該方法。
(3).onResume方法:Activity變為可見後接著要調用onResume方法來變為運行狀態。
2.Activity間切換
為了更清楚,在點擊按鈕跳轉到SecondActivity之前,我們可以清除一下Log, 下方左邊有一個垃圾桶的標志,就是用來清除之前打印的日志的。下方所打印的日志就是點擊跳轉按鈕時所打印的日志。在這個切換過程中,MianActivty會停止運行變為不可見,而SecondActivy就會被創建並且處於運行狀態。具體步驟如下。
(1).onPause()方法:當點擊跳轉按鈕時,運行中MainActivity就會調用onPause()變為停止狀態,但仍然可見。
(2).接著就是SecondActivity調用onCreate()方法進行創建,調用onStart()方法進行顯示,調用onResume()方法進行運行的過程。
(3).onStop()方法:當SecondActivity處於運行狀態時,MainActivity就完全不可見了,所以就會調用onStop()方法,進入完全不可見停止狀態。
3.從另一個Activity返回
從SecondActivity中點擊返回鍵,從SecondActivity中返回到MainActivity中。下方的Log是點擊返回按鈕時所打印的Log.
(1)onPause()方法:點擊返回按鈕後,SecondActivity會調用onPause()方法,進入暫停運行狀態。
(2)onRestart()方法:接著MainActivity就會調用onRestart()方法,由停止狀態變為運行狀態。然後MainActivity又會調用onStart方法從不可見變為可見,接著會調用onResume()方法最終進入運行狀態。
(3)當返回到MainActivity中並且MainActivity處於運行狀態後,SecondActivity會調用onStop方法,停止運行並不可見。因為SecondActivty做的事出棧操作,停止運行後,就會調用onDestory方法進行銷毀。下此在進入SecondActivity中時,還是從onCreate方法進行執行。
4.Activity退出並銷毀
接著在MainActivity中點擊返回按鈕就會退出App了,下方是退出App時打印的Log信息。MainActivty先調用onPause()方法變為暫停運行狀態,然後再調用onStop()方法停止運行,最後調用onDestroy()方法進行銷毀。
三.生命周期流程圖
1.上面是用語言通過實例打印出的Log來描述兩個Activity切換的生命周期,接下來將用一個流程圖來描述這一過程,具體流程圖如下。
2.通過上面的實例不難分析出一個Activity的生命周期分為哪些階段,並且很容易的看出哪些階段在什麼時候執行,所以我們很容易的畫出一個Activity的生命周期,下方的流程圖是一個Activity的生命周期。
四.Activity的加載模式
Activity的啟用模式也較為簡單,它會在活動切換時用到。Activity的啟動模式分為四種,standard、singleTop、singleTask、singleInstance模式。接下來將為大家詳細的介紹一下這幾種加載模式。
Activity的加載模式可以在配置文件AndroidManifest.xml中進行配置,配置項為android:launchMode具體如下圖所示:
1.standard模式
在Activity的棧中無論該活動有沒有加入棧,活動就會被創建。測試方式是把MainActivity的launchMode設置成standard, 在MainActivity中添加一個按鈕,點擊按鈕使用Intent跳轉到當前Activity,看onCreate方法中打印的Log。點擊按鈕的方法如下:
1 Button launchModelButton = (Button) findViewById(R.id.launch_model_button); 2 launchModelButton.setOnClickListener(new View.OnClickListener() { 3 @Override 4 public void onClick(View v) { 5 Intent intent = new Intent(MainActivity.this, MainActivity.class); 6 startActivity(intent); 7 } 8 });
standard加載模式的棧如下所示,無論棧中有沒有該對象的實例,都會被創建。
2.singleTop模式
只要被創建的活動不位於棧的頂部,該活動就會被創建入棧。如果將要被創建的活動位於棧的頂部,該活動的實例就不會被創建。測試方法,把上面的模式直接改成singleTop模式,MainActivty往自己身上跳轉就不會從新創建一個新的實例,會重用之前在棧頂中的實例。如果是MainActivty跳轉到SecondActivty, 然後SecondActivity再次跳轉到MainActivty, 那麼此時的MainActivity將會被創建,因為棧頂是SecondActivity。如下所示:
3.singleTask模式
單任務模式,這個也不難理解,如果從MainActivty跳轉到SecondActivity, 如果再從SecondActivty跳轉到MainActivity, 在單任務模式下MainActivity已經在棧中,就會把它之前的Activity出棧,使其處於在棧頂活躍的位置。原理如下圖所示:
4.singleInstance
可以看成單例模式,這個比較特殊,被設置成singleInstance的Activity將會放入另一個棧中,因為這樣為了便於共用。上面3中模式位於同一個棧中。下方ThirdActivity跳轉到一個加載模式為singleInstance的Activity中。
今天的Activity生命周期就先到這兒,相關內容會在下篇博客中進行更新。
Android Material Design之 NavigationView側滑界面自定義 隨筆,android側滑菜單一、側滑界面Menu自定義: 在menu文件夾下
Android 5.0 Settings源碼簡要分析 概述: 先聲明:本人工作快兩年了,仍是菜鳥級別的,慚愧啊!以前遇到好多知識點都沒有記錄下來,感覺挺可惜的,現在有機會
安卓第五天筆記-對話框,安卓第五天筆記安卓第五天筆記--對話框 1.對話框 AlerDialog :功能最豐富 PorgressDialog:進度對話框 DatePick
Android中使用ViewPager實現屏幕頁面切換和頁面輪播效果,androidviewpager之前關於如何實現屏幕頁面切換,寫過一篇博文《Android中使用Vi