iT邦幫忙

DAY 9
5

Android 學習手札系列 第 9

Day 9 - Android - 流程與紀錄貓

了解了兩個activity的溝通方式後,今天要讓大家認識紀錄貓與流程,強化我們在面臨更強大的對手時,能夠盡快找到對方的弱點!
紀錄貓…介面上好像沒看到這麼可愛的東西啊XD
我想,就直接請各位看下面這張圖就一目瞭然了吧!

紀錄貓,原文名為 LogCat,他就是位在我們 IDE 下面的其中一個分頁(圖中的1)~他為我們記錄著在模擬器或是連線裝置的重要過程,至於平常在開發時,最常看到的欄位就是圖中的2,所框起來的三個欄位,依序為
**Application:**哪個應用程式(package name)
**Tag:**重要紀錄的標籤,畫面上看到的幾乎都是系統設定,當然也可以自己去設定之,如圖中3所框起來的地方
**Text:**就是這筆紀錄的描述文字啦~

至於我們要如何"自己"加入一筆紀錄讓紀錄貓為我們寫下段段血淚…不是!是段段重要的過程呢~最基本的程式語法是這樣:

Log.[type](Tag, Text)

當中的[type]所指的是紀錄貓可以為我們將紀錄分為六種類型:

Log.v(Tag, Text)
Log.d(Tag, Text)
Log.i(Tag, Text)
Log.w(Tag, Text)
Log.e(Tag, Text)

這可是我們在未來面臨很多蟲時,或是要找不知道從哪蹦出來的蟲時的最佳夥伴呢!再配上溫開水,效果加倍呢!啊!不是,再配上try...catch...可是相當好用的哦!

認識了紀錄貓,今天要請他來陪我們跑"流程",相信已經有人可以猜到了!沒錯,這個"流程"指得就是一個 activity 的生命週期。借用官網上的圖片:

來源:Android Developers

在方型圖裡有沒有看到兩個很眼熟的狀態-"onCreate()"以及"onStart()",嗯!是的,我們前幾天讓各位著墨的就是在這兩個區間,與其我平鋪直述的說明下來,不如咱們就直接動手征服…認識他吧。請各位開好一個新專案,專案名稱為"Day9_LifeCycle",這個專案請建立兩個 activity - MainActivity以及SecondActivity

兩個畫面就如下兩個圖一樣,改掉中間的文字後,再各別加上一個按鈕

activity_main.xml的按鈕命名為"btn_main"、activity_second.xml的按鈕命名為"btn_second",兩個按鈕的動作也很簡單,就是從切換到另一個actvity去,如下

//這段寫在 MainActivity.java 的 onCreate()
Button btnMain = (Button)findViewById(R.id.btn_main);
btnMain.setOnClickListener(new Button.OnClickListener(){
    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        startActivity(intent);
    }
});





//這段寫在 SecondActivity.java 的 onCreate()
Button btnMain = (Button)findViewById(R.id.btn_main);
btnMain.setOnClickListener(new Button.OnClickListener(){
    public void onClick(View v) {
        Intent intent = new Intent(SecondActivity.this, MainActivity.class);
        startActivity(intent);
    }
});

這樣就完成兩個 activity 切換的動作啦,再來請根據生命週期中的幾個方框內的函式區塊加入,嗯!格式…就如同前幾天加入的onStart()一樣呀…驚別打我,我知道很多,所以再來要教大家怎麼"自動"讓 SDK 幫我們加上去。
請在程式碼視窗上點滑鼠右鍵,

依序打開"Source > Over...."可以看到下面這個畫面

往下拉就可以找到以"on"開頭的函式,然後就仔細點,勾選"onStart()"、"onResume()"、"onPause()"、"onStop()"、"onDestroy()"、"onRestart()",這幾個函式區段。確定後,SDK就會為我們將函式加上去啦~哈哈

再來,請在每個函式裡面加入這段程式

//在MainActivity的onStart
Log.d("Main", "onStart");
//在MainActivity的onResume
Log.d("Main", "onResume");
...
...
//在SecondActivity的onCreate
Log.d("Second", "onCreate");
//在SecondActivity的onStart
Log.d("Second", "onStart");
...
...

各別加入後,我們就可以執行之啦!讓他執行完停在第一個畫面時,我們同時來看到兩個東西,一個是官網的週期圖,一個就是一開始介紹到的紀錄貓啦!因為我們用的是"Log.d"所以在看的時候,請將一開始那張圖中的下拉選單,選成"debug",是的!那個"d"指的就是debug,看到下面這個畫面

已經有三筆我們指定的紀錄了,搭配週期圖看一下,我們現在停在第一個畫面上,這時的狀態是『Activity running』,也就是當下這個activity正在執行中!跑出來的三個狀態,就是從一開始到這時的三個區段!接下來,按下按鈕,移動到第二個畫面去吧!
當停在第二個畫面,也就是第二個畫面的『Activity running』狀態時,

第一個畫面是先走到"onPause"後,然後逐步的啟動畫面二到執行中的階段,才讓第一個activity走到"onStop"去。再來按下"返回鍵"(請注意,不是畫面二的按鈕哦!)回到畫面一吧!

有發現嗎,畫面二一樣是先走到"onPause"後,再讓畫面一從"onRestart"開始走到running時,他才逐步的往下走,而且是直接走到結束,因為再來除了按下按鈕啟動他外,不會再有機會"返回"到他身上去,所以他就自己默默的走到最後嘍!如此一來,主要的週期流程算是走完一遍了,不知道各位有基本的概念了嗎^_^

今天的程式碼一樣可以在 Mosil's GitHub 取得哦!

《 吐司不夠吃啦~ 旅程中》


上一篇
Day 8 - Android - 吐司不夠吃啦~
下一篇
Day 10 - Android - 旅程中
系列文
Android 學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
海綿寶寶
iT邦大神 1 級 ‧ 2012-10-04 07:57:39

由於我以前只用過 log4j

想請教一下
android.util.Log跟org.apach.log4j的差別

以下是否正確?

1.log4j可自訂輸出(console, file, database, socket..)
Logcat主要輸出於IDE(因為其為IDE開發工具)
2.log4j輸出於console時,與其他System.out.println混在一起
而Logcat預設「分開」輸出於Logcat視窗中

其實
之前介紹的Bundle已經讓我想起HashTable
而這個Logcat又和log4j類似
有時我實在不懂
這到底是程式設計的進步
是物件導向繼承精神的發揮
還是
不斷重新發明自己專屬的輪子
新瓶裝舊酒
嘆氣

mosil iT邦新手 4 級 ‧ 2012-10-04 14:12:44 檢舉

應該這麼說吧,ANDROID的運作,其實要仰賴的並非 JVM,而是 Dalvik VM
Android APP 只是一套以 JAVA 為主要開發語言,他還可以用C/C++來開發
他並不完全只是依賴原本的JVM,所以這時要思考一個問題,JVM能觀察得到 ANDROID 在執行的歷程嗎?
另外,LogCat 用了表格呈列的方式給我們開發者一個比 console 還要方便的檢視環境

與其說他重新發明輪子,倒不如說,LogCat 這個機制除了補足原本 JAVA 無法觀測 ANDROID 的部份,另外還提供了較佳的開發者環境。並不只是單純的"新瓶裝舊酒",是有加料的XD

了解了
謝謝

我要留言

立即登入留言