2015年12月19日 星期六

Android - Ch5 Android 最基本的元件:Activity、Intent、Fragment

 

寫完第一個App之後,繼續打底的工作,Activity、intent、fragment 都是極其重要的概念,學完寫一些簡單App應該是小菜一疊了 : )

本篇範例程式偏少,程式太多文章顯得臃腫,請自行查閱References網站的範例,這部分的資料網路上資源還算豐富。




一、Activity 簡介


Android系統使用Activity元件,負責提供應用程式一個畫面的所有相關工作。

也就是說,之前的第一個婚姻建議程式,其實是只有一個Activity的App,而往後可以創造其他 Activity 來進行畫面的切換或資料的傳遞,做出更豐富的App。

Activity元件幾乎是Android應用程式中最常使用的,應用程式的功能如果比較複雜,需要提供比較多的操作和瀏覽資料的畫面,就會包含很多Activity元件。

每一個Activity元件除了撰寫需要的Java原始程式碼,也需要在應用程式設定檔加入相關的設定,在application的開始和結束標籤裡面,使用activity標籤為每一個Activity元件加入設定,所以從應用程式設定檔的內容,也可以知道一個應用程式有幾個Activity元件。

相關的程式碼可以到這裡查看:Android Tutorial 第二堂(4)建立與使用 Activity 元件





二、Activity 基本狀態:Active、Paused、Stopped、Dead


所有的 Activity 在系統裏由 Activity stack 所管理,當一個新的Activity被執行後,它將會被放置到stack的最頂端,並且變成 running activity,而之前的 Activity 原則上還是存在 stack 中,但不會是在 foreground。


1. Active


Activity 在運行中,一個時刻只會有一個 Activity 處於 Active。其他Activity 都處於Dead、Stopped 或是 Paused 狀態。


2. Paused


退到背景畫面的狀態,Activity 處在Paused狀態時使用者無法與原來的 Activity 互動。


3. Stopped


Activity 已經離開螢幕,不再動作的狀態。在Stopped狀態的 Activity,還可以透過 Notification 來喚醒。


4. Dead/Inactive


Dead狀態是 Activity 尚未被啟動、已經被手動終止、或已經被系統回收的狀態。
要手動終止 Activity 可以在程式中呼叫 finish 函式。如果是被系統回收則可能是因為記憶體不足,將處於 Stopped 狀態的 Activity 所佔用的記憶體回收。




三、Activity 生命週期管理


下面的流程圖說明一個Activity運行的情況, 長方形代表callback函式,可做想要處理的事情,有顏色的部份則是實際Activity會處於的狀態。下面是三個主要的生命週期:


1. Entire 生命週期


一個Activity的Entire 生命週期是由onCreate()開始直到onDestroy()結束。
一個Activity可以把所有的資源設定寫在onCreate中, 一直到onDestroy()時再釋放出來.


2. Visible 生命週期


一個Activity的Visible 生命週期是指在onStart()到onStop()之間,在這段時間內,使用者可以在螢幕上看見Activity,但不見得一定在前景跟使用者直接互動。


3. Foreground 生命週期


一個Foreground 生命週期指 onResume() 到 onPause() 之間。這個時期的Activity是在其他的Activity的前面,且可以直接跟使用者進行互動. 所以這段時期指的就是圖中的Activity is running。


[用心去感覺] 簡單的總結幾個動作


  • onCreate()用來做程式的初使化動作
  • onDestory()通常都拿來把onCreate()時的資料做釋放的動作
  • onPause()時把需要保存的資料保存
  • onResume()把保存的資料拿回來使用




四、Intent:Activity間的呼叫


Android 中的事件處理:意圖 (Intent) 非常好用,每個意圖都帶有一個動作,並根據不同的動作去行動。整個 Android 的架構最大的特色可以說就建構在 Intent 上,您可以利用類似 URL 的 Intent 啟動任何一個程式的任何一個畫面。


除了Activity之間的切換之外,常常需要在呼叫另一個Activity的同時傳遞資料,所以就必須要利用android.os.Bundle物件封裝資料的能力,將需傳遞的資料或參數,藉由Bundle來傳遞於不同Intent之間。


/** Activty_A intent切到 Activity_B 並用 Bundle 傳遞資料 **/

// Activty_A.java
private View.OnClickListener btnOKonClick = new View.OnClickListener(){
    @Override
    public void onClick(View v) {

  Intent it = new Intent();
  it.setClass(ViewList.this,MapsActivity.class);

  Bundle bundle = new Bundle();
  bundle.putString("SELECT_LOC",ms_loc);

  it.putExtras(bundle);
  startActivity(it);
    }
};

// Activty_B.java
public void getData() {
    Bundle bundle = getIntent().getExtras();
    String iSelectLoc = bundle.getString("SELECT_LOC");
}




五、Fragment:Activity上更彈性的UI設計


Android在3.0版本引入了Fragment功能,它非常類似於Activity,可以像Activity一樣包含布局。Fragment通常是嵌套在Activity中使用,Fragment寄生在Activity身上,當Activity死去時Fragment也會跟著死去。

Fragment最方便的地方就是不用讓整個畫面重新切換,只需要針對局部地方就可以迅速更換你的畫面。



Fragment的特點整理如下:

  • App的執行畫面可以由多個Fragment組成;
  • 每一個Fragment都有各自獨立的執行狀態,並且接收各自的處理事件(這個特點和Activity類似);
  • 在App執行的過程中,Fragment可以動態加入和移除。

相關的程式碼可以到這裡查看:GiveMePasS's Android惡補筆記 - 如何使用Fragment
http://givemepass.blogspot.tw/2013/09/fragment.html





References


初學 Android - Android Activity生命週期簡介

Android Tutorial 第二堂(4)建立與使用 Activity 元件

陳鍾誠的網站 - Android 當中的 AndroidManifest.xml 檔案

[Android] Activity元件

Jollen 的 Android 教學,#26: 強大的Intent機制
http://www.jollen.org/blog/2009/07/jollen-android-programming-26.html

安卓亭 Android Station - Fragment基本入門教學
http://androidstation.pixnet.net/blog/post/227190520-fragment%E5%9F%BA%E6%9C%AC%E5%85%A5%E9%96%80%E6%95%99%E5%AD%B8

Android Fragment完全解析,关于碎片你所需知道的一切
http://blog.csdn.net/guolin_blog/article/details/8881711

GiveMePasS's Android惡補筆記 - 如何使用Fragment
http://givemepass.blogspot.tw/2013/09/fragment.html




技術提供:Blogger.