前面兩期咱們學習了Activity的建立和註冊、以及啓動和關閉,也學會了重寫onCraete方法,這些知識在實際開發中遠遠不夠,還須要學習瞭解更多。前端
生命週期就是一個對象從建立到銷燬的過程,每個對象都有本身的生命週期。一樣, Activity也具備相應的生命週期。java
一個Android應用程序每每包含多個Activity,當Activity處於Android應用中運行時,每一個Activity的狀態都不同。Activity的活動狀態由Android以Activity棧的形式管理,當前活動的Activity位於棧頂。隨着不一樣應用的運行,每一個Activity都有可能從活動狀態轉入非活動狀態,也可能從非活動狀態轉入活動狀態。android
Activity的生命週期中一共有4種狀態,分別以下:微信
當Activity在屏幕的最前端時,它處於Activity棧頂,是可見的、有焦點的,能夠用來處理用戶的常見操做,如點擊、雙擊、長按事件等,這種狀態稱爲運行狀態,也叫活動狀態。架構
在某些狀況下,Activity對用戶來講仍然是可見的,但它再也不擁有焦點,即用戶對它的操做是沒有實際意義的。例如,當最上面的Activity沒有徹底覆蓋屏幕或者是透明的,被覆蓋的Activity仍然對用戶可見,而且存活(它保留着全部的狀態和成員信息並保持與Activity管理器的鏈接)。但當內存不足時,這個暫停狀態的Activity可能會被殺死。app
當Activity徹底不可見時,它就處於中止狀態,但仍然保留着當前狀態和成員信息。然而這些對用戶來講都是不可見的,若是當系統內存不足時,這個Activity很容易被殺死。ide
當Activity運行結束,或Activity所在的進程結束時,這種狀態稱爲銷燬狀態,也叫非活動狀態。這時Activity已從Activity棧中移除,須要從新啓動才能夠顯示和使用。當系統內存須要被用在其餘地方的時候,一箇中止狀態的Activity被殺掉。佈局
另外當Activity處於運行狀態時,Android會盡量地保持它的運行,即便出現內存不足的狀況,Android也會先殺死棧底部的Activity,來確保可見的Activity正常運行。 學習
關於Activity的這四種狀態,是能夠相互轉化的,以下圖所示。優化
值得注意的時這四種狀態中,運行狀態和暫停狀態是可見的,中止狀態和銷燬狀態是不可見的。
Activity從一種狀態轉變到另外一種狀態時會觸發一些事件,執行一些回調方法來通知狀態的變化,這就是Activity的生命週期。
Activity的生命週期及其相關方法的回調,以下圖所示。
從上圖能夠看到在Activity的生命週期中,有以下幾個方法被系統回調。
onCreate(Bundle savedStatus):建立Activity時被回調。該方法只會被調用一次。
onStart():啓動 Activity 時被回調。
onRestart():從新啓動 Activity 時被回調。
onResume():恢復 Activity 時被回調。在onStart()方法後必定會回調 onResume()方法。
onPause():暫停 Activity 時被回調。
onStop():中止 Activity 時被回調。
onDestroy():銷燬 Activity 時被回調。該方法只會被調用一次。
爲了更好的掌握Activity生命週期及其方法,接下來經過一個實例來學習,主要實現兩個Activity之間跳轉時生命週期方法變化的過程。
仍然使用上期建立的ActivitySample工程,爲了便於代碼管理,這裏新建一個activitylifecycle的Module。該Module一共包含了2個Activity,並在AndroidManifest清單文件中配置兩個Activity。
其中第一個Activity的界面佈局很是簡單,只包含2個按鈕,其中第一個按鈕的做用主要是啓動第二個Activity,第二個按鈕的做用是退出當前Activity。第一個Activity對應的佈局文件activity_main.xml的代碼以下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/start_normal_activity_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="啓動Activity"/> <Button android:id="@+id/quit_activity_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="退出Activity"/> </LinearLayout>
第二個Activity對應的佈局文件activity_second.xml的代碼以下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="這是第二個Activity"/> </LinearLayout>
第一個MainActivity類主要用於重寫Activity的生命週期方法,並在每一個方法中打印出Log以便觀察,具體代碼以下所示:
package com.jinyu.cqkxzsxy.android.activitylifecycle; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = "MainActivity"; private Button mStartActivityBtn = null; private Button mQutiActivityBtn = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "onCreate()"); mStartActivityBtn = (Button) findViewById(R.id.start_normal_activity_btn); mQutiActivityBtn = (Button) findViewById(R.id.quit_activity_btn); mStartActivityBtn.setOnClickListener(this); mQutiActivityBtn.setOnClickListener(this); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart()"); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "onRestart()"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume()"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause()"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop()"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy()"); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.start_normal_activity_btn: // 啓動普通的Activity Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); break; case R.id.quit_activity_btn: // 結束該Activity MainActivity.this.finish(); break; default: break; } } }
爲了觀察MainActivity中止狀態時的生命週期,須要在當前項目中建立第二個SecondActivity,因爲不須要對第二個Activity進行界面操做,所以添加activity_second.xml文件便可不須要其餘操做。在第二個Activity中一樣實現Activity生命週期中的方法,在每一個方法中打印Log信息。
package com.jinyu.cqkxzsxy.android.activitylifecycle; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; public class SecondActivity extends AppCompatActivity { private static final String TAG = "SecondActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Log.d(TAG, "onCreate()"); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart()"); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "onRestart()"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume()"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause()"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop()"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy()"); } }
在AndroidManifest.xml文件中註冊已經建立好的Activity,即在清單文件中添加一個<activity>結點,指定Activity徑名。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jinyu.cqkxzsxy.android.activitylifecycle"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".SecondActivity" /> </application> </manifest>
上述操做完成後運行程序,首先會顯示第一個Activity界面,以下圖所示。
這時在Android Studio的LogCat窗口會打印MainActivity生命週期中的執行方法,以下圖所示:
從上圖能夠看到,應用程序啓動 MainActivity依次調用了 onCreate()、onStart()、onResume(),這個順序是第一個Activity從建立到顯示在前臺到用戶可點擊的過程。
接下來單擊第一個按鈕啓動第二個Activity。當第一個界面跳轉到第二個界面時,LogCat 窗口會打印MainActivity和SecondActivity生命週期中的執行方法,以下圖所示:
從上圖能夠看到,當跳轉到第二個界面時,MainActivity首先失去焦點執行了onPause()方法,而後SecondActivity依次執行了onCreate()、onStart()、onResume()方法從建立到前臺可見, 這時 MainActivity執行了onStop()方法。
如今再觀察一下從第二個Activity按返回鍵回到第一個Activity生命週期的LogCat 信息,以下圖所示:
從上圖能夠看到,單擊返回鍵以後,SecondActivity一樣先執行了onPause()方法,而後 MainActivity執行了 onRestart()、onStart()、onResume()方法,隨後SecondActivity才完全關閉,執行 了 onStop()、onDestory()。在 MainActivity打開 SecondActivity時,MainActivity並無執 onDestory()方法而是執行了 onStop()方法。所以,從 SecondActivity返回到 MainActivity時,MainActivity執行了 onRestart() 方法。
單擊退出Activity按鈕,MainActivity將會結束本身,而且能夠在LogCat 窗口看到以下圖所示的輸出:
從該示例能夠看到,各生命週期方法的調用徹底符合前面所講。
將Activity的生命週期方法和Activity的四種狀態結合起來,用另外一種方式表現出來,能夠獲得下面的示意圖。
關於Activity的生命週期方法就先學到這裏,下期再繼續學習其餘有關Activity的內容。
今天就先到這裏,若是有問題歡迎留言一塊兒探討,也歡迎加入Android零基礎入門技術討論微信羣,共同成長!
若是該系列分享對你有幫助,就動動手指關注、點贊、留言吧,你的互動就是對我最大的鼓勵!
此文章版權爲微信公衆號分享達人秀(ShareExpert)——鑫鱻全部,若需轉載請聯繫做者受權,特此聲明!
往期總結回顧:
Android零基礎入門第1節:Android的前世此生
Android零基礎入門第2節:Android 系統架構和應用組件那些事
Android零基礎入門第3節:帶你一塊兒來聊一聊Android開發環境
Android零基礎入門第4節:正確安裝和配置JDK, 高富帥養成第一招
Android零基礎入門第5節:善用ADT Bundle, 輕鬆邂逅女神
Android零基礎入門第6節:配置優化SDK Manager, 正式約會女神
Android零基礎入門第7節:搞定Android模擬器,開啓甜蜜之旅
Android零基礎入門第8節:HelloWorld,個人第一趟旅程出發點
Android零基礎入門第9節:Android應用實戰,不懂代碼也能夠開發
Android零基礎入門第10節:開發IDE大升級,終於迎來了Android Studio
Android零基礎入門第11節:簡單幾步帶你飛,運行Android Studio工程
Android零基礎入門第12節:熟悉Android Studio界面,開始裝逼賣萌
Android零基礎入門第13節:Android Studio個性化配置,打造開發利器
Android零基礎入門第14節:使用高速Genymotion,跨入火箭時代
Android零基礎入門第15節:掌握Android Studio項目結構,揚帆起航
Android零基礎入門第16節:Android用戶界面開發概述
Android零基礎入門第17節:文本框TextView
Android零基礎入門第18節:輸入框EditText
Android零基礎入門第19節:按鈕Button
Android零基礎入門第20節:複選框CheckBox和單選按鈕RadioButton
Android零基礎入門第21節:開關組件ToggleButton和Switch
Android零基礎入門第22節:圖像視圖ImageView
Android零基礎入門第23節:圖像按鈕ImageButton和縮放按鈕ZoomButton
Android零基礎入門第24節:自定義View簡單使用,打造屬於你的控件
Android零基礎入門第25節:簡單且最經常使用的LinearLayout線性佈局
Android零基礎入門第26節:兩種對齊方式,layout_gravity和gravity大不一樣
Android零基礎入門第27節:正確使用padding和margin
Android零基礎入門第28節:輕鬆掌握RelativeLayout相對佈局
Android零基礎入門第29節:善用TableLayout表格佈局
Android零基礎入門第30節:兩分鐘掌握FrameLayout幀佈局
Android零基礎入門第31節:少用的AbsoluteLayout絕對佈局
Android零基礎入門第32節:新推出的GridLayout網格佈局
Android零基礎入門第33節:Android事件處理概述
Android零基礎入門第34節:Android中基於監聽的事件處理
Android零基礎入門第35節:Android中基於回調的事件處理
Android零基礎入門第36節:Android系統事件的處理
Android零基礎入門第37節:初識ListView
Android零基礎入門第38節:初識Adapter
Android零基礎入門第39節:ListActivity和自定義列表項
Android零基礎入門第40節:自定義ArrayAdapter
Android零基礎入門第41節:使用SimpleAdapter
Android零基礎入門第42節:自定義BaseAdapter
Android零基礎入門第43節:ListView優化和列表首尾使用
Android零基礎入門第44節:ListView數據動態更新
Android零基礎入門第45節:網格視圖GridView
Android零基礎入門第46節:列表選項框Spinner
Android零基礎入門第47節:自動完成文本框AutoCompleteTextView
Android零基礎入門第48節:可摺疊列表ExpandableListView
Android零基礎入門第49節:AdapterViewFlipper圖片輪播
Android零基礎入門第50節:StackView卡片堆疊
Android零基礎入門第51節:進度條ProgressBar
Android零基礎入門第52節:自定義ProgressBar炫酷進度條
Android零基礎入門第53節:拖動條SeekBar和星級評分條RatingBar
Android零基礎入門第54節:視圖切換組件ViewSwitcher
Android零基礎入門第55節:ImageSwitcher和TextSwitcher
Android零基礎入門第56節:翻轉視圖ViewFlipper
Android零基礎入門第57節:DatePicker和TimePicker選擇器
Android零基礎入門第58節:數值選擇器NumberPicker
Android零基礎入門第59節:經常使用三大Clock時鐘組件
Android零基礎入門第60節:日曆視圖CalendarView和定時器Chronometer
Android零基礎入門第61節:滾動視圖ScrollView
Android零基礎入門第62節:搜索框組件SearchView
Android零基礎入門第63節:值得借鑑學習的選項卡TabHost
Android零基礎入門第64節:揭開RecyclerView廬山真面目
Android零基礎入門第65節:RecyclerView分割線開發技巧
Android零基礎入門第66節:RecyclerView點擊事件處理
Android零基礎入門第67節:RecyclerView數據動態更新
Android零基礎入門第68節:RecyclerView添加首尾視圖
Android零基礎入門第69節:ViewPager快速實現引導頁
Android零基礎入門第70節:ViewPager打造TabHost效果
Android零基礎入門第71節:CardView簡單實現卡片式佈局
Android零基礎入門第72節:SwipeRefreshLayout下拉刷新
Android零基礎入門第73節:Activity建立和配置
Android零基礎入門第74節:Activity啓動和關閉