Android開發--Activity生命週期回顧理解

來源:互聯網
上載者:User

標籤:android   des   cWeb   style   blog   http   color   java   

Activity和Servlet一樣,都用了回調機制。我們通過類比servlet來學習Activity。當一個servlet開發出來之後,該servlet運行於Web伺服器中。伺服器何時建立servlet的執行個體,何時調用servlet的方法向使用者產生響應,程式員無法控制,這種回調由伺服器自行決定。Activity也一樣,被開發出來,開發人員只要在AndroidManifest.xml檔案配置該Activity即可。至於該Activity何時被執行個體化,它的方法何時被調用,對開發人員來說完全是透明的。

當開發人員開發一個Servlet時,根據不同的需求情境,可能需要選擇性的的實現如下方法:

  • init(servletConfig config)
  • destroy()
  • doGet(HttpServletRequest req,HttpServletResponse resp)
  • doPost(HttpServletRequest req,HttpServletResponse resp)
  • sevice(HttpServletRequest req,HttpServletResponse resp
  • 當把Servlet部署到Web應用中之後,Web伺服器將會在特定的時刻,調用該Servlet上面的各種方法---這種調用就被稱為回調。

Activity的回到機制與此類似,當Activity被部署到Android應用之後,隨著應用程式的運行,Activity會不斷的在不同的狀態進行切換,該activity中特定的方法就會被回調-----開發人員就可以選擇性的重寫這些方法來加入業務相關的處理。Android運行過程的不同狀態被稱為生命週期。

Android的生命週期:當activity處於Android的應用中的運行時,它的活動狀態由Android運行時以Activity棧的形式管理。當前活動的Activity位於棧頂。

Android的生命週期示範:android大致經過如下四個狀態:

  • 活動狀態:當前Activity位於前台,使用者可見,可以獲得焦點。
  • 暫停狀態:其他Activity位於前台,該Activity依然可見,只是不能獲得焦點。
  • 停止狀態:該Activity不可見,失去焦點
  • 銷毀裝填:該activity結束,或者activity所在的Dalvik進程被結束。

下面是官方API所提供的生命週期圖:

下面使用代碼親自測下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視窗可以看到:

Back鍵:當我們按返回鍵的時候這個應用程式或者Activity將結束,依次回調了OnPause()-->onStop()-->Ondestroy()方法:在LogCat視窗可以看到:

HOME鍵:當我們正在打遊戲的時候,突然來了條簡訊,我們想看短息,按HOME鍵,然後開啟簡訊的應用,當我們按HOME鍵的時候Activity先後執行了OnPause()-->OnStop方法,在LogCat視窗可以看到:

而我們看完短息在啟動應用的時候:會執行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了,看下面的圖:

總結:理解生命週期的關鍵是,我們可以在開發過程選擇性的重寫生命週期中的方法,解決一些實際問題,這才是關鍵,學以致用!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.