Activity和Servlet同樣,都用了回調機制。咱們經過類比servlet來學習Activity。當一個servlet開發出來以後,該servlet運行於Web服務器中。服務器什麼時候建立servlet的實例,什麼時候調用servlet的方法向用戶生成響應,程序員沒法控制,這種回調由服務器自行決定。Activity也同樣,被開發出來,開發者只要在AndroidManifest.xml文件配置該Activity便可。至於該Activity什麼時候被實例化,它的方法什麼時候被調用,對開發者來講徹底是透明的。java
當開發者開發一個Servlet時,根據不一樣的需求場景,可能須要選擇性的的實現以下方法:android
Activity的回到機制與此相似,當Activity被部署到Android應用以後,隨着應用程序的運行,Activity會不斷的在不一樣的狀態進行切換,該activity中特定的方法就會被回調-----開發者就能夠選擇性的重寫這些方法來加入業務相關的處理。Android運行過程的不一樣狀態被稱爲生命週期。程序員
Android的生命週期:當activity處於Android的應用中的運行時,它的活動狀態由Android運行時以Activity棧的形式管理。當前活動的Activity位於棧頂。服務器
Android的生命週期演示:android大體通過以下四個狀態:app
下面是官方API所提供的生命週期圖:ide
下面使用代碼親自測下Android的生命週期,測完就明白了:學習
package com.lp.ecjtu.activitydemo1; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.widget.EditText; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private EditText editText; //建立Activity被回調 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText); Log.e(TAG, "Start onCreate ========="); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } //啓動Activity被回調 @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.e(TAG, "Start onStart ========="); } //從新啓動Activity被回調 @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); Log.e(TAG, "Start onRestart ========="); } //恢復Activty被回調 @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.e(TAG, "Start onResume ========="); } //暫停Activity被回調 @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Log.e(TAG, "start onPause============="); } //中止Activity被回調 @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.e(TAG, "start onStop============="); } //銷燬Activity被回調 @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.e(TAG, "start onDestroy============="); } }
運行上面的代碼:咱們打開應用程序時回調了OnCreate()-->onStart()-->onResume()方法。在LogCat窗口能夠看到:this
Back鍵:當咱們按返回鍵的時候這個應用程序或者Activity將結束,依次回調了OnPause()-->onStop()-->Ondestroy()方法:在LogCat窗口能夠看到:spa
HOME鍵:當咱們正在打遊戲的時候,忽然來了條短信,咱們想看短息,按HOME鍵,而後打開短信的應用,當咱們按HOME鍵的時候Activity前後執行了OnPause()-->OnStop方法,在LogCat窗口能夠看到:.net
而咱們看完短息在啓動應用的時候:會執行OnRestart()-->onStart-->OnResume方法。在LogCat窗口能夠看到:
經過上面的操做,想必咱們都對Android Activity生命週期有了深入的瞭解,咱們就能夠在開發Activity的時候,選擇性的重寫生命週期的方法來解決業務上的一些需求。
例如:下面的這個例子,當咱們在看視屏的時候,或者在註冊的時候,恰好填完用戶的註冊信息,不當心按到了Home鍵,當咱們在進入應用程序的時候,發現以前填的註冊信息全沒了,這時候咱們就要哭了,說明這個應用程序作的比較垃圾。正常狀況下,咱們以前填寫的註冊信息還在,也就是說和咱們按Home鍵以前的狀態是一致的。
爲了理解,咱們用一個小例子說明問題:
在XML代碼代碼中增長EditText:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello_Activity" /> <EditText android:id="@+id/editText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:ems="10" /> </LinearLayout>
java代碼不變,運行程序,在EditText中輸入peter,
而後按HOME鍵,在次啓動MainActivity,發現以前輸入的內容沒了。
這顯然不是正常的應用程序,咱們都會哭的。那麼就須要咱們隊生命週期很是瞭解了,當咱們按Home鍵的時候,Activity回調了onPause-->OnStop()方法,再次進入應用程序的時候回調了OnRestart-->OnStart-->onResume()方法,說明咱們只要在onPause()和OnRestart方法裏面作處理既能夠保存以前的狀態:下面看代碼
package com.lp.ecjtu.activitydemo1; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.widget.EditText; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private EditText editText; //定義一個String字符串用於存放用戶輸入的字符串 private String userString; //建立Activity被回調 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText); Log.e(TAG, "Start onCreate ========="); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } //啓動Activity被回調 @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.e(TAG, "Start onStart ========="); } //從新啓動Activity被回調 @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); //再次啓動應用時,把先前用戶輸入的值從新設置EditText editText.setText(userString); Log.e(TAG, "Start onRestart ========="); } //恢復Activty被回調 @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.e(TAG, "Start onResume ========="); } //暫停Activity被回調 @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); //按home鍵的時候,保存用戶輸入的字符串信息。 userString = editText.getText().toString(); Log.e(TAG, "start onPause============="); } //中止Activity被回調 @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.e(TAG, "start onStop============="); } //銷燬Activity被回調 @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.e(TAG, "start onDestroy============="); } }
從新啓動app,按home鍵,在進入應用程序OK了,看下面的圖:
總結:理解生命週期的關鍵是,咱們能夠在開發過程選擇性的重寫生命週期中的方法,解決一些實際問題,這纔是關鍵,學以至用!