Android零基礎入門第75節:Activity狀態和生命週期方法

   前面兩期咱們學習了Activity的建立和註冊、以及啓動和關閉,也學會了重寫onCraete方法,這些知識在實際開發中遠遠不夠,還須要學習瞭解更多。前端

    生命週期就是一個對象從建立到銷燬的過程,每個對象都有本身的生命週期。一樣, Activity也具備相應的生命週期。java

 

 

1、Activity狀態

 

    一個Android應用程序每每包含多個Activity,當Activity處於Android應用中運行時,每一個Activity的狀態都不同。Activity的活動狀態由Android以Activity棧的形式管理,當前活動的Activity位於棧頂。隨着不一樣應用的運行,每一個Activity都有可能從活動狀態轉入非活動狀態,也可能從非活動狀態轉入活動狀態。android

    Activity的生命週期中一共有4種狀態,分別以下:微信

一、運行狀態(Active or Running) 

    當Activity在屏幕的最前端時,它處於Activity棧頂,是可見的、有焦點的,能夠用來處理用戶的常見操做,如點擊、雙擊、長按事件等,這種狀態稱爲運行狀態,也叫活動狀態。架構

二、暫停狀態(Paused) 

    在某些狀況下,Activity對用戶來講仍然是可見的,但它再也不擁有焦點,即用戶對它的操做是沒有實際意義的。例如,當最上面的Activity沒有徹底覆蓋屏幕或者是透明的,被覆蓋的Activity仍然對用戶可見,而且存活(它保留着全部的狀態和成員信息並保持與Activity管理器的鏈接)。但當內存不足時,這個暫停狀態的Activity可能會被殺死。app

三、中止狀態(Stopped) 

    當Activity徹底不可見時,它就處於中止狀態,但仍然保留着當前狀態和成員信息。然而這些對用戶來講都是不可見的,若是當系統內存不足時,這個Activity很容易被殺死。ide

四、銷燬狀態(Killed) 

    當Activity運行結束,或Activity所在的進程結束時,這種狀態稱爲銷燬狀態,也叫非活動狀態。這時Activity已從Activity棧中移除,須要從新啓動才能夠顯示和使用。當系統內存須要被用在其餘地方的時候,一箇中止狀態的Activity被殺掉。佈局

    另外當Activity處於運行狀態時,Android會盡量地保持它的運行,即便出現內存不足的狀況,Android也會先殺死棧底部的Activity,來確保可見的Activity正常運行。 學習

    關於Activity的這四種狀態,是能夠相互轉化的,以下圖所示。優化

    值得注意的時這四種狀態中,運行狀態和暫停狀態是可見的,中止狀態和銷燬狀態是不可見的。

 

 

2、 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啓動和關閉

相關文章
相關標籤/搜索