了解了兩個activity的溝通方式後,今天要讓大家認識紀錄貓與流程,強化我們在面臨更強大的對手時,能夠盡快找到對方的弱點!
紀錄貓…介面上好像沒看到這麼可愛的東西啊
我想,就直接請各位看下面這張圖就一目瞭然了吧!
紀錄貓,原文名為 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 取得哦!
由於我以前只用過 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類似
有時我實在不懂
這到底是程式設計的進步
是物件導向繼承精神的發揮
還是
不斷重新發明自己專屬的輪子
新瓶裝舊酒
應該這麼說吧,ANDROID的運作,其實要仰賴的並非 JVM,而是 Dalvik VM
Android APP 只是一套以 JAVA 為主要開發語言,他還可以用C/C++來開發
他並不完全只是依賴原本的JVM,所以這時要思考一個問題,JVM能觀察得到 ANDROID 在執行的歷程嗎?
另外,LogCat 用了表格呈列的方式給我們開發者一個比 console 還要方便的檢視環境
與其說他重新發明輪子,倒不如說,LogCat 這個機制除了補足原本 JAVA 無法觀測 ANDROID 的部份,另外還提供了較佳的開發者環境。並不只是單純的"新瓶裝舊酒",是有加料的XD
了解了