Android開發學習之activity

Android開發學習之activity

瞭解activity

     activity(活動)是Android組件中最基本也是最爲常見用的四大組件之一。它是Android最容易吸引用戶的地方,是一種可以包含用戶界面的的組件,主要用於和用戶進行交互。
    在一個android應用中,一個activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽並處理用戶的事件做出響應。activity之間通過Intent進行通信。

activity的基本狀態

    在android 中,Activity 擁有四種基本狀態:

  • Active/Running
        一個新 Activity 啓動入棧後,它顯示在屏幕最前端,處理是處於棧的最頂端(Activity棧頂),此時它處於可見並可和用戶交互的激活狀態,叫做活動狀態或者運行狀態(active or running)。
  • Paused
        當 Activity失去焦點, 被一個新的非全屏的Activity 或者一個透明的Activity 被放置在棧頂,此時的狀態叫做暫停狀態(Paused)。此時它依然與窗口管理器保持連接,Activity依然保持活力(保持所有的狀態,成員信息,和窗口管理器保持連接),但是在系統內存極端低下的時候將被強行終止掉。所以它仍然可見,但已經失去了焦點故不可與用戶進行交互。
  • Stopped
        如果一個Activity被另外的Activity完全覆蓋掉,叫做停止狀態(Stopped)。它依然保持所有狀態和成員信息,但是它不再可見,所以它的窗口被隱藏,當系統內存需要被用在其他地方的時候,Stopped的Activity將被強行終止掉。
  • Killed
        如果一個Activity是Paused或者Stopped狀態,系統可以將該Activity從內存中刪除,Android系統採用兩種方式進行刪除,要麼要求該Activity結束,要麼直接終止它的進程。當該Activity再次顯示給用戶時,它必須重新開始和重置前面的狀態。

activity的生命週期

    在詳談activity的生命週期之前,我們先來看一張有關activity的生命週期的經典的圖:
Alt text
    讀懂這張圖,相信你對activity的生命週期有了個大概的瞭解了,下面來逐個瞭解一下。

  • onCreate (): 該方法是在Activity被創建時回調,它是生命週期第一個調用的方法,我們在創建Activity時一般都需要重寫該方法,然後在該方法中做一些初始化的操作,如加載佈局,通過setContentView設置界面佈局的資源,初始化所需要的組件信息等。

  • onStart() : 此方法被回調時表示Activity正在啓動,此時Activity已處於可見狀態,只是還沒有在前臺顯示,因此無法與用戶進行交互。可以簡單理解爲Activity已顯示而我們無法看見擺了。

  • onResume() : 當此方法回調時,則說明Activity已在前臺可見,可與用戶交互了(處於前面所說的Active/Running形態),onResume方法與onStart的相同點是兩者都表示Activity可見,只不過onStart回調時Activity還是後臺無法與用戶交互,而onResume則已顯示在前臺,可與用戶交互。當然從流程圖,我們也可以看出當Activity停止後(onPause方法和onStop方法被調用),重新回到前臺時也會調用onResume方法,因此我們也可以在onResume方法中初始化一些資源,比如重新初始化在onPause或者onStop方法中釋放的資源。

  • onPause() : 此方法被回調時則表示Activity正在停止(Paused形態),一般情況下onStop方法會緊接着被回調。但通過流程圖我們還可以看到一種情況是onPause方法執行後直接執行了onResume方法,這屬於比較極端的現象了,這可能是用戶操作使當前Activity退居後臺後又迅速地再回到到當前的Activity,此時onResume方法就會被回調。當然,在onPause方法中我們可以做一些數據存儲或者動畫停止或者資源回收的操作,但是不能太耗時,因爲這可能會影響到新的Activity的顯示——onPause方法執行完成後,新Activity的onResume方法纔會被執行。

  • onStop(): 一般在onPause方法執行完成直接執行,表示Activity即將停止或者完全被覆蓋(Stopped形態),此時Activity不可見,僅在後臺運行。同樣地,在onStop方法可以做一些資源釋放的操作(不能太耗時)。

  • onRestart() :表示Activity正在重新啓動,當Activity由不可見變爲可見狀態時,該方法被回調。這種情況一般是用戶打開了一個新的Activity時,當前的Activity就會被暫停(onPause和onStop被執行了),接着又回到當前Activity頁面時,onRestart方法就會被回調。

  • onDestroy() :此時Activity正在被銷燬,也是生命週期最後一個執行的方法,一般我們可以在此方法中做一些回收工作和最終的資源釋放。

    以上的7個方法中除了onRestart()方法,其他都是兩兩相對的,所以又可以將活動分成以下三種生存期:
* 完整生存期:activity在onCreate()方法和onDestroy()方法之間所經歷的,就是一個完整的生存期。一般情況下,一個activity會在onCreate方法中完成各種初始化操作,而在onDestroy()方法中完成釋放內存的操作。
* 可見生存期:activity在onCreate()方法和onStop()方法之間所經歷的,就是可見生存期。我們可以通過這兩個方法,合理地管理對那些用戶可見的資源,比如,在onStart()方法中對資源進行加載,而在onStop()方法中對資源進行釋放,從而保證處於停用狀態下的活動不會佔用過多的內存。
* 前臺生存期:activity在onResume()方法和onPause()方法之間所經歷的,就是前臺生存期。在前臺生存期內,activity總是處於運行狀態,此時的activity是可以和用戶進行交互的,我們用戶平時看到和接觸最多的也就是這個狀態下的activity。

    說了那麼多,下面就讓我們通過實踐來體驗一下activity的生命週期。

體驗activity的生命週期

    下面我們通過編寫一個Android項目來對activity的週期進行更深入的瞭解。
* MainActivity


package com.example.administrator.activitylifecycletest;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    public static final String TAG = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    Log.d(TAG,"onCreate");
    setContentView(R.layout.activity_main);
    Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity);
    Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity);
    startNormalActivity.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this,NormalActivity.class);
            startActivity(intent);
        }
    });
    startDialogActivity.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            Intent intent = new Intent(MainActivity.this,DialogActivity.class);
            startActivity(intent);
        }
    });
}
@Override
protected void onStart(){
    super.onStart();
    Log.d(TAG,"onStart");
}
@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
protected void onRestart(){
    super.onRestart();
    Log.d(TAG, "onRestart");
}

}


* NormalActivity

package com.example.administrator.activitylifecycletest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class NormalActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_normal_acyivity);
}

}

  • DialogActivity
     
    package com.example.administrator.activitylifecycletest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class DialogActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dialog);
}

}

這裏寫圖片描述

這裏寫圖片描述
    由於在進行真機測試是無法及時打印全部各個不同週期的測試信息,只能是顯示一下個別狀態的了。另外,關於對Android開發日誌log的使用我也在個人的另一份博客文章中進行了闡述,有興趣的可以去了解一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章