Android開發學習筆記(五):Starting an Activity

Starting an Activity 前端

不像其餘的編程模式中,應用程序是由main()方法發起的,Android系統啓動代碼在一個activity實例經過調用的回調方法,對應於特定階段的生命週期。有一系列回調方法用於啓動一個activity,和一系列回調方法用以拆毀一個activity。 java

這一課將提供一個生命週期方法的總覽,而且告訴你如何處理第一個回調方法,在建立一個新的activity實例時。 android

瞭解生命週期回調(Understand the Lifecycle Callbacks) 編程

在一個activity的生命週期中,系統調用的一組核心的生命週期方法序列相似的一個階梯金字塔。就是說,activity生命週期的每個階段是一個單獨的步驟的金字塔。爲系統建立了一個新的activity實例,每一個回調方法移動activity狀態的一個步驟對頂部。頂部的塔是在該點的,activity在前臺運行,用戶能夠與它交互。 app


當用戶開始離開activity時,系統會調用其餘的(函數)方法,把activity的狀態從金字塔向下轉移,以拆除這個activity。在某些狀況下,活動將只有一部分的方式下錐體等(如當用戶切換到另外一個應用程序),這一點讓activity能夠回到頂部(若是用戶返回到activity),並能恢復到用戶離開時的樣子。 
ide

下面是Activity生命週期的一個簡單圖示,就像一個金字塔同樣。這個圖示反映出了那些使得activity狀態向上的回調方法,也反映了那些使得activity狀態向下的回調方法。activity也能夠從暫停狀態(Paused)或中止狀態(Stopped)返回到Resumed狀態。 函數

根據根據須要建立的activity的複雜程度,你可能不須要實現全部生命週期的方法。然而,重要的是你瞭解每個執行,以確保您的應用程序的行爲方式符合用戶的指望。適當地實現你的activity生命週期中的方法,能夠確保你的應用程序在如下幾個方面表現的好一些: 工具

  • 當用戶正在使用你的程序時,忽然接聽電話或者切換到其它的程序,它不至於會崩潰。
  • 當用戶再也不使用你的程序時,它不會繼續消耗寶貴的系統資源。
  • 當用戶暫時離開你的程序,再返回時不會丟失用戶的進展。
  • 當手機屏幕橫向縱向切換時,它不會崩潰或者丟失用戶的進度。

activity在不一樣的狀態之間進行轉變時,存在幾情況。然而,這些狀態中只有三種是靜態的(activity能夠持續的狀態)。換句話說,activity能夠在這三種狀態之一,存在一段比較長的時間。這三種狀態分別是: 佈局

重返狀態(Resumed
在這個狀態,activity處於屏幕最前端,而且用戶能夠與之進行交互。(有時也被稱爲「運行」狀態。 學習

暫停狀態(Paused)
在這個狀態,activity被其它的activity部分地遮擋住了。這個其它的activity位於屏幕最前端,要麼是半透明的,要麼沒有佔據整個屏幕。被暫停的activity沒法接受用戶的輸入,也不能執行任何代碼。

中止狀態(Stopped)
在這種狀態下,activity是徹底隱藏着的,而且用戶不可見;這被認爲是在背景下。在中止狀態中,該activity的實例和它的全部狀態信息,例如成員變量,都是保留的,但它不能執行任何代碼。

Activity的其餘狀態(建立Created和開始Started)都是短暫的。系統會經過調用下一個生命週期的回調方法,來使得它們快速轉換到下一個狀態。換句話說,系統在調用onCreate()方法以後,立馬就調用onStart()方法,緊接着就是調用onResume()方法。

這就是Activity最基本的生命週期。如今,你能夠開始學習有關的一些具體生命週期行爲了。

指定應用程序的啓動Activity(Specify Your App's Launcher Activity)

當用戶從手機主屏幕上選擇你的應用程序圖標時,Android系統就會調用一個Activity的onCreate()方法。這個Activity就是你爲本身的應用程序指定的那個「launcher」(或「main」)activity。它是你的的應用程序對外用戶界面的主要入口。

你能夠在Android清單文件(AndroidManifest.xml)中指定哪一個activity做爲主要activity。這個文件在你項目的根目錄下

你必須在清單文件中使用<intent-filter>來聲明應用程序的主要activity,同時指定MAIN動做和LAUNCHER類別。例如:

<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

注意,當你使用Android SDK工具建立一個新的Android工程時,默認的工做文件中已經包含了一個Activity類,而且把它聲明在清單文件裏了。

若是你的activity中有一個沒有聲明MAIN行爲或者LAUNCHER類別,那麼你的應用程序圖標將不會出如今主屏幕的應用程序列表中

建立一個新的實例(Create a New Instance)

大多數應用程序包括幾個不一樣的activity,容許用戶執行不一樣的動做。是否有一個活動的主要活動的創造,當用戶點擊您的應用程序圖標或不一樣的活動,您的應用程序啓動響應用戶操做,系統建立新的Activity實例經過調用onCreate()方法。

你必須實現oncreate()方法,它執行基本的應用程序啓動邏輯,而這在activity的整個生命週期中應該只發生一次。例如,你的onCreate()方法實現應該定義用戶界面,並可能實例化一些類範圍的變量。

例如,下面例子中的onCreate()方法顯示出一些執行activity基本安裝的代碼,如宣佈用戶界面(定義在一個佈局文件中),定義成員變量,並配置一些用戶界面。

TextView mTextView; // Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);
    
    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);
    
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}

一旦onCreate()執行完成,系統會接二聯三地調用onStart()和onResume()方法。你的activity不會駐留在建立(Created)或開始(Started)狀態。技術上,當onStart()方法被調用後,activity就對用戶可見了,但緊接着onResume()方法就被調用,activity會保持在恢復(Resumed)狀態,直到某個事件發生才引發狀態改變,例如當接收到一個電話,或用戶導航到其餘的activity,或設備的屏幕關閉。

在接下來的其餘課程中,你將會看到其餘的啓動方法,onStart()和onResume()。它們在你的acvitity的生命週期中,被用來從暫停(Paused)或中止(Stopped)狀態中恢復activity。

注意:onCreate()方法包括一個參數,名爲savedInstanceState。它將在後面有關重建Activity(Recreating an Activity)的課程中討論。

圖2是另外一個示例,它強調了activity生命週期結構中的三個主要的回調。在建立一個activity的新實例時,系統會依次調用這三個回調函數:onCreate(),onStart(),和onResume()。一旦這一系列回調完成,activity就達到了恢復(Resumed)狀態,用戶能夠與它交互,直到他們切換到一個不一樣的activity。

Activity的銷燬(Destroy the Activity)
------------------------------------------------------------------------------------------------------------------------------------------

正如activity生命週期第一個回調是onCreate(),其最後一個回調是onDestroy()。系統調用這個方法做爲最後的信號,你的activity實例將被從系統內存中完成刪除。

大多數應用程序不須要實現這個方法,由於本地類引用已經隨activity一塊兒被銷燬了,你的activity應該在onPause()和onStop()執行期間作一些清理活動。然而,若是你的activity在執行onCreate()方法時建立了後臺運行的線程,或者是其餘長期運行的資源(若是沒有正確關閉則可能引起內存泄漏),那麼你就應該在onDestroy()方法中殺了他們。

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass
    
    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}
 注意:系統調用ondestroy()後它已經稱爲onpause()和onstop()在全部狀況下只有一個:你打電話時finish()在oncreate()方法。在某些狀況下,例如當你的活動可做爲臨時決定推出另外一個活動,你能夠稱finish()內oncreate()破壞活動。在這種狀況下,系統會當即要求ondestroy()沒有要求任何其餘生命週期的方法。 
相關文章
相關標籤/搜索