2011年10月24日 星期一

我回來了...

不好意思,很久沒有發表文章了。

Android出的速度也真是快,都到4.0了。不過,我還在研究中。最近,總算是有空閒的時間來發表文章了。請大家多多指教。

2010年7月28日 星期三

從無到有-實戰Android系統開發-程式實戰(8)-生命週期(Life Cycle)

接下來,我們要來討論Android系統中,最重要的部份之一,就是Activity的部份,我們將由ActivityLift Cycle來討論它的運作機制,再來就是要如何建立一個Activity。最後,我們再來討論要如何傳送資料給另一個Activity。一步一步來了解Activity

首先,在Android系統中的Activity(活動),可以將它想成是一個使用者的操作介面或是一個表單程式即可,原則上它會提供使用者一個互動式的介面功能。而一個應用程式是有多個Activity組成的。

Activity的生命週期。如圖42所示。

42

主要的可以分成三個模式來說明:

1. foreground process (前景模式)

此模式就是目前正顯示於手機螢幕上的應用程式畫面,由onCreate()onStart()onResume()函式呼叫的Activity都會變成正在執行的Activity。發生情況為剛執行某一個應用程式時。

後續的處理有二種情況:

  1. 直接被onDestroy()結束,該程式將完全關閉。無法再使用任何返回鍵回到該程式。
  2. 依情況發生visible processbackground process等後續情況。

2. visible process (可見模式)

此模式就是當Activity視窗畫面變成透明時,就會由onPause()函式掌控進入暫停狀態,當被呼叫出來的對話視窗、提示時物件結束時,該Activity就會再度被拉到前景模式,而由onResume()函式喚醒該Activity視窗。發生情況為應用程式跳出對話視窗與使用者互動時,而原來的視窗會變成透明,而對話視窗就變成前景了。

後續的處理有二種情況:

  1. 如果暫停狀態,閒置太久,就會被onDestroy()結束,該程式將完全關閉。無法再使用任何返回鍵回到該程式。
  2. 觸發onResume()函式喚醒該Activity視窗。

3. background process (背景模式)

此模式就是當Activity視窗畫面被另一個Activity完全覆蓋時,就會完全看不見。而觸發onStop()函式,成為停止的狀態。發生情況為在兩個不同的應用程式開啟時,後來開啟的應用程式會覆蓋原來的應用程式。

後續的處理有三種情況:

  1. 直接被onDestroy()結束,該程式將完全關閉。無法再使用任何返回鍵回到該程式。
  2. 當記憶體足夠時,而另一個Activity關閉時,而由onReStart()函式喚醒原來的Activity。回到原來的狀態。
  3. 當其他的Activity需要記憶體時,就會優先被清除。釋放出記憶體供其他應用程式來使用。當使用者又再度瀏覽回剛剛被清除的Activity時,則再執行onCreate()函式重新啟動該Activity

而會用到的程式事件,整理如表12所示:

程式事件

說明

時機

onCreate()

建立

Activity啟動時觸發。可以進行初始化的動作。

onStart()

開始

Activity即將被展示給使用者觀看時觸發。

onResume()

回復

Activity開始跟使用者互動時觸發。

onPause()

暫停

Activity即將進入背景時觸發。

onStop()

停止

Activity不再被使用者看到時觸發。

onRestart()

重置

Activity要從停止狀態重新被展示時觸發。

onDestroy()

銷毀

Activity被銷毀之前時觸發,可以進行釋放資源的動作。

12

2010年5月18日 星期二

從無到有-實戰Android系統開發-程式實戰(7)-快捷選單(Context Menu)

在上一個章節,我們建立好了選單,而在這個章節,我們要在建立一種快捷選單(Context Menu)的方式。而使用快捷選單的原因,是因為有一些可以立即使用的功能,可以立即使用,不用再選取選單,再執行。最常見的例子就是:在資料列表出來後,可以選取某一筆記錄。停留數秒後,就會出現是要編輯或是刪除的快捷選單。

在Android建立快捷選單都包含兩個部份,第一個部份是建立選單列的事件方法,可以顯示出來快捷選單。第二部份就是要建立處理選項動作的事件方法。

在Android主要是用「onCreateContextMenu」事件來建立快捷選單的主體。在某個元件,停留數秒後,就會顯示快捷選單。跟之前不同的地方是,除了要建立出快捷選單外,還要在「onCreate」事件時,先註冊是由那個元件引起的快捷選單。可以參考圖39所示。

當我們在 Activity 中定義出快捷選單的選項後,接下來就是要處理選取某個選項後,要做那方面的處理。處理的方法會在「onContextItemSelected」事件中定義。

而在Eclipse平台,有提供一個方便的功能,可以幫我們建立一些可以覆寫的方法,就在選單「Source」中的「Override/Implement Methods」選項,會列出所以可以覆寫或繼承的方法,如圖38所示。選取「onCreateContextMenu」及「onContextItemSelected」方法,再按下「OK」按鈕。Eclipse就會幫我們建立好可覆寫的程式碼,如圖40所示。

圖38

接下來,就是程式碼方面的撰寫。首先,要先在「onCreate」事件,註冊是由那個元件引起的這個的快捷選單。在下述的範例中,主要是要在TextView元件上出現快捷選單。然後,選取某個選項,就會出現在EditText元件中。

所以,在「onCreate」事件,先用findViewById方法找到TextView元件,再用this.registerForContextMenu()方法來註冊快捷選單要出現在TextView元件中。範例程式碼,請參考圖39及圖40所示。

圖39

下一步,加入下述程式碼,來建立快捷選單列及選取時,要處理的事件,如圖40所示。主要是在「onCreateContextMenu」事件中,用menu.add方法來建立選單。而在「onContextItemSelected」事件中,要EditText的內容設成item.getTitle()取得的選項名稱即可。

圖40

程式執行的畫面,如圖41所示。當滑鼠停留在TextView元件數秒後,就會出現快捷選單,選取某個選項。就會將選項名稱出現在EditText元件中。

圖41

2010年5月17日 星期一

從無到有-實戰Android系統開發-程式實戰(6)-選單(Menu)

當我們了解如何加入一個對話框及提示訊息的方法。之後,接下來,我們要來學習如何加入選單列的功能。為什麼要加入選單呢?

因為Android的選單列就像我們在用Word、Excel等軟體一樣,會將一些常用的功能整理成選單列,方便我們可以直接使用,在Android的選單列也是如此,只是因為手機可以顯示的欄位有限,最好是將常用的功能整理成最少二個,最多六個左右的主選單列,如果有其他功能,可以選取好選單列後,再畫面上顯示出來。以簡單、好用為原則即可。

在這個章節的範例中,我們要增加二個選單列,一個是About,用來顯示出上個章節的對話框,另一個就是Exit功能,就是離開系統的動作。

在Android建立選單列都包含兩個部份,第一個部份是建立選單列的使用者介面,可以顯示出來選單。第二部份就是要建立處理選項動作的事件方法。

在Android主要是用「onCreateOptionsMenu」方法來建立選單列的主體。在 Android機器或模擬器上按下硬體的「Menu」鍵,就會顯示選單列,就是用「onCreateOptionsMenu」方法來定義。

當我們在 Activity 中定義了「onCreateOptionsMenu」方法之後,按下「Menu」鍵時,就會彈出相對應的選單列。而當我們在Android應用程式的選單列上選擇了相應的選項後,則是依賴「onOptionsItemSelected」方法,來負責處理選單列中各選項所個別對應的動作。

而在Eclipse平台,有提供一個方便的功能,可以幫我們建立一些可以覆寫的方法,就在選單「Source」中的「Override/Implement Methods」選項,會列出所以可以覆寫或繼承的方法,如圖34所示。選取「onCreateOptionsMenu」及「onOptionsItemSelected」方法,再按下「OK」按鈕。Eclipse就會幫我們建立好可覆寫的程式碼,如圖35所示。

圖34


圖35

加入下述程式碼,來建立選單列及選取時,要處理的事件,如圖36所示。主要是Menu.FIRST這個函式來了解,在目前的系統中,選單列的編號目前到那個,而再加一就是下一個選單列的編號,依此類推即可。


圖36

程式執行的畫面,如圖37所示。


圖37

2010年4月2日 星期五

從無到有-實戰Android系統開發-程式實戰(5)-對話框(Dialog)

當我們加入程式運算的邏輯判斷程式碼,接下來就是要了解如何加入一個對話框及提示訊息的方法及程式碼,如圖31所示。


圖31

簡單的說明一下,新增加程式有那些作用。首先,是如何顯示對話框及提示訊息的方法及程式碼。顯示出對話框的程式碼是在openShowDialog(){ }程式區塊,而提示訊息的程式碼是在openShowToast(){ }程式區塊。

Tip 4:在使用對話框之前,要先import android.app.AlertDialog類別,而提示訊息要先import android.widget.Toast類別。

撰寫好二個方法後,可以在上一個章節的程式判斷完成後,再呼叫那二個方法,如圖31所示。


圖32

程式執行的畫面,如圖32所示。


圖33

2010年4月1日 星期四

從無到有-實戰Android系統開發-程式實戰(4)-程式邏輯架構(Framework)

接下來,當我們了解如何設計使用者介面後,下一步,就是要進行簡單的撰寫程式的工作了。並且來說明Android基礎程式邏輯架構。
首先,我們先設計一個簡單的功能程式,就是在文字框中輸入文字,再按下按鈕後,會將輸入的文字資料顯示在文字標籤中。設計出來的介面,如圖28所示。

圖28

下一步,在Eclipse的平台上,打開「Memo」專案中的「src/cmd.demo.Memo/」目錄底下的Demo.java檔案,就會先看到Eclipse幫我們預先建立好了基本的程式邏輯。其預設的內容如下,如圖29所示:

圖29

簡單的說明一下,程式邏輯的架構,這個以Java程式語言寫成的檔案。 我們將程式直接拆開,分成二個部份來講解這個「Memo.java」 檔案的內容:

第一部份是在import那些類別,在Java語言中,要使用到任何API之前,都要事先導入相對應的Package。例如:如果要用到那些控制項的類別、控制項的事件類別等資料時,就要先import進來程式碼,才能使用到。

第二部份就是程式的主體,由public class Memo extends Activity { }的程式區塊就是我們要撰寫的主體。在裡面的程式碼就是我們程式開始的內容。而「/**」及「*/」是可以進行程式的文字註解。

在public void onCreate(Bundle savedInstanceState) { }的程式區塊,是預設的啟動方法。

下一步,當我們了解程式的基本架構後,接下來,就是再加入程式運算的邏輯判斷程式碼,在下述的範例中,主要是來了解如何導入其他用到的模組,如何取得、設定使用者介面元件的資料,如何觸發按鈕的事件方法。完整程式碼,如圖30所示。

圖30

簡單的說明一下,新增加程式有那些作用。首先,是如何取得按鈕(Button)的元件,再設定如何設定觸發按鈕的事件方法。

取得按鈕(Button)的元件的程式碼如下:
Button button = (Button)findViewById(R.id.Button01);

就是要宣告一個button的實體,再透過findViewById方法,從資源檔中取得對應的介面按鈕元件。取出的是「R.id. Button01」按鈕元件名稱。當輸入R.id時,再按「.」就會出現目前可以取得元件名稱。

Tip 2:在宣告任何控制項的實體時,要先import android.widget.Button對應的控制項。

接下來,就是要設定觸發按鈕的事件方法,程式碼如下:
button.setOnClickListener(proc_labelChange);

就是要用「Button」類別中的「setOnClickListener」方法。在方法中傳入了一個「proc_labelChange」函式。這就是Android 系統的使用者介面互動方式採用常見的事件驅動方式。

也就是當使用者按下「button」按鈕的時候,Android 系統會去觸發按鈕的「setOnClickListener」方法中所指定的「proc_labelChange」函式。

接下來就是要寫按鈕觸發事件函式,如下述程式碼區塊:
private OnClickListener proc_labelChange = new OnClickListener()
{
public void onClick(View v)
{
}
};

Tip 3:在宣告任何控制項的事件時,要先import android.view.View.OnClickListener;對應的事件。

程式的範例中所有的邏輯與運算內容,都放置在這個事件函式程式區塊中。 就是當使用者按下按鈕時,會觸發「OnClickListener」類型的事件函式。

先宣告EditText及TextView的實體,才可以將輸入的字串,顯示到文字標籤的內容中,程式碼如下:

EditText txtTitle = (EditText)findViewById(R.id.EditText01);
TextView labTitle = (TextView)findViewById(R.id.TextView01);

跟上面 button 的宣告一樣,只是改成宣告EditText及TextView實體,透過 findViewById方法,從資源檔中取得對應的文字欄位元件。要記得,要先import對應的控制項。

接下來的運算邏輯就是將輸入的字串EditText,顯示設定到(setText方法)文字標籤TextView的內容(getText函式)中,程式碼如下:

labTitle.setText(txtTitle.getText().toString());

2010年3月30日 星期二

從無到有-實戰Android系統開發-程式實戰(3)-使用者介面(User Interface)

使用者介面(User Interface)不好意思,最近公司比較忙。所以,在更新文章上,比較慢一些。預計,四月份會正常更新,請大家多多指教。

接下來,當我們順利的開啟一個新的專案後,接著就是要設計使用者介面了。首先,在Eclipse的平台上,打開「Memo」專案中的「res/layout/main.xml」檔案,就會先看到目前檔案的預覽畫面(就是在Layout預設的頁標籤),如圖26所示。
接著我們來切換到另一個main.xml的頁標籤來看XML格式的文件,如圖27所示。

圖26

在Android平台上,使用者介面都是透過「View Group」或「View」類別來顯示。有關「View Group」或「View」類別,可以參考http://developer.android.com/guide/tutorials/views/index.html 的範例及說明。
Android提供非常豐富而多樣的介面元件,主要可以分成二種類型:
l 版面配置類型(例如:各種不同的Layout、Tab、List等):如圖26上面的Layouts當中的元件。也可以參考表10,對於比較常用到的版面配置,進行說明的動作。在後續的章節中,會陸續應用到。

l 顯示介面類型(例如:文字框、按鈕、輸入欄位等):如圖26上面的Views當中的元件。也可以參考表11,對於比較常用到的元件,一個一個的說明。在後續的章節中,會陸續應用到。






在Eclipse上,如圖26的畫面,目前,可以從Views或Layouts的視窗中,拖曳元件,拉到預覽畫面。而可以直接來設計介面。切換到「main.xml」的頁標籤來看XML格式的文件內容,如圖27所示。

基本上,就跟XML元素一樣,有開始的「<」符號就有結束的「>」符號。例如:一個文字顯示的元件在XML標籤表示方式為,包含在裡面的資料就是它的屬性設定,例如:
在設定寬度時,用到的屬性是:android:layout_width="fill_parent"
設定高度時,用到的屬性是:android:layout_height="wrap_content"
設定文字內容時,用到的屬性是:android:text="@string/hello"
等屬性的設定。


圖27

Tip 1:在Eclipse平台,選取選單「Source」中的「Format」選項,可以整理main.xml檔案裡面的XML資料。

Tips 1