總網頁瀏覽量

2013年2月6日 星期三

android第一篇code review


本android在windows環境開發

adb.exe放在
sdk\platform-tools之下

android模擬器開超慢,看起來沒有好的解決方法
不過比第一台筆電好多了


重要檔案
R.java:類別資源索引檔,位於gen(generated)底下,
activity_main.xml:位於res(resources)/layout底下
MainActivity.java:位於src底下
AndroidManifest.xml:應用程式定義檔,每個APK應用程式的根目錄必須有這個檔案。這個文件定義出應用程式的整體布局,包含該應用程式提供的activity、服務、處理的數據、軟體版本、軟體名稱、UI屬性設定、。
我們點選這檔案可以在exporting這段底下有個連結
"Use the Export Wizard to export and sign an APK"或者"
Export an unsigned APK ",就可以將APK匯出到個人電腦上,不用透過eclipse將APK檔案裝在android模擬器上再用adb pull下載。



android SDK提供的API放在lib資料夾底下jar檔案。

第一行
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns是xml namespace的縮寫,每一個android XML設計檔案UI設定必須以此宣告開始,xml檔案底下所有的android變數將代表http://schemas.android.com/apk/res/android
藉此連結引用android系統提供的使用者介面資源,這個是UI設計的固定用法。




Android程式運作原理:
android編譯java原始碼交給一個名字叫做ANT的工具來做,然後呼叫javac編譯程式,Ant採用XML來撰寫編譯行程。

當 我們編譯程式碼,java不會編譯成ByteCode而是被Ant編譯成Dalvik Bytecode(*.dex),然後再和其他資源檔打包成APK套件,最後在Runtime時候,透過Android Code Libraries這個很大的Java類別總集JAR(Java ARchive)檔案與上層的java程式溝通,而Dalvik虛擬機器則解讀dex檔案,與下層使用C語言寫成的Linux Library函式庫溝通,然後由底層的Linux Kernel產生一個行程(process)執行該程式,這就是完整的Android程式運作原理。


dx 是一套工具,可以將 Java .class 轉換成 .dex 格式. 一個dex檔通常會有多個.class。由於dex有時必須進行最佳化,會使檔案大小增加1-4倍,以ODEX結尾



編譯之後會.apk檔案會出現在
C:\Users\YYP\workspace\guessnumber\bin




TextView皆是個View。是View的類別
  注意大小寫

<RelativeLayout xmlns:yyp="http://schemas.android.com/apk/res/android"
    yyp:layout_width="match_parent"(match_parent表示寬度大小要match父類別)
    yyp:layout_height="match_parent">
  
    <TextView
        yyp:id="@+id/textbox1"//打完這行,gen底下的R.java的id 會自動加上textbox1記憶體相對應的位置。
@的意思是去R.java檔案,+id/textbox1找到id method並加上textbox1項目,R.java裡面紀錄View的記憶體位置。

        yyp:layout_width="wrap_content"//寬度要占據多大 fill parent 與 match parent一樣
        yyp:layout_height="wrap_content"
        yyp:layout_centerHorizontal="true"  水平線至中
        yyp:layout_centerVertical="true"  垂直線至中
        yyp:text="@string/hello_world" (@string表示將字串定義在res\values\strings.xml這個檔案,而hello_world表示儲存字串的變數的名稱。
我們可以在strings.xml裡面看到如下這一行
string name="hello_world">Hello world!</string>
因此在demo程式時,畫面會顯示Hello world而非hello_world
)
/>

</RelativeLayout>


在MainActivity.java檔案裡

import android.app.Activity;
import android.view.Menu;
這兩個類別分別是android系統架構圖片中Application Framwork裡面的Activity Manager以及View System

Activity Manager在模擬器上產生視窗事件
View System在此視窗上顯示TextView的內容

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 

在MainActivity.java檔案裏頭,使用onCreate()來啟動activity事件
並且使用saveInstanceState儲存此activity的目前狀態
透過setContentView呼叫R.java資源索引檔裏頭的layout布局類別裡的activity_main,也就是在螢幕上顯示activity_main.xml布局
(setContentView 也可說是xml與mainactivity的橋樑,先在MainActivity.java裡面指定要針對哪個layout.xml寫程式,先找到 layout在針對layout裡面元件(ex:Button,TextView)寫程式。)



這裡的onCreate方法是override父類別Activity的onCreate方法 ,
在super.onCreate(savedInstanceState);呼叫父類onCreate別方法,
確保父類別所作的初始化,會在MainActivity.java的onCreate方法中執行


其中Bundle savedInstanceState,這個參數是用來保存 Activity之前的狀態






import android.widget.TextView;

    TextView yyptext = (TextView)findViewById(R.id.tv);
//findViewById是View型態。因為R.java裡面紀錄的是View的記憶體位置,findViewById會找到TextView的記憶體位置,回傳View物件,TextView是View的子類別,所以要將xml裡面的TextView給main.java裡面的yyptext使用時,必須作型別轉換,將View轉換為TextView


 guess.setOnClickListener(new OnClickListener() {
        public void onClick(View arg0) {
        doGuessProcess();
        }        }); }

這裡寫法有兩個術語來說:callback與listener

android是屬於互動式應用程式 ,有些method無法讓我們主動呼叫
而是透過使用者的動作(ex:按下按鈕)。才會由系統呼叫這些方法。
這種類型的方法稱之為callback方法。
上面的public void onClick是callback方法。

android要怎樣知道使用者已經有所動作(ex:按下按鈕)?,
android有傾聽者(Listener) 機制,去偵測使用者跟系統互動。
 上面的setOnClickListener就是傾聽者,裡面包了一個callback方法--onClick,
透過new OnClickListener()傾聽者物件操作onClick。


setOnClickListener 是 View 類別所提供的方法,因為 Button 類別是繼承自 View 類別,
guess是Button 類別的物件實體,因此能夠呼叫 setOnClickListener 方法。

doGuessProcess()必須放在 onClick裡面,



 yyptext.setText("I want to play a game");
在View顯示文字I want to play a game.
View的名字. setText(字串或字串變數或空字串); 
例如:msg.setText(++counter+"."+numtextbox.getText().toString()+":"+result+"\n");
也可以用附加方式顯示文字
View的名字.append(字串變數或字串);
例如:msg.append(++counter+"."+numtextbox.getText().toString()+":"+result+"\n");
再一次呼叫append,文字會附加在已顯示文字的後面
已顯示的字串不會被清掉,會在buffer中

判斷字串,相同與否
result.equals(nowdig+"A0B")
若字串變數result與nowdig+A0B相同會回傳true。


從xml的view擷取字串的方法.getText(),不過一律要加上.toString()
String gnumber = numtextbox.getText().toString();


擷取gnumber字串中第i個字元,取出的字是字元型態非字串型態
gnumber.charAt(i)==answer.charAt(i))


搜尋字串
answer.indexOf(gnumber.charAt(i)+"") 
回傳整數,gnumber第i個字元位於answer的第X個字,如果沒有,indexOf會回傳-1。因為回傳0表示gnumber的某個字元與answer的第一個字相同。


整數轉成字串
Integer.toString(數字或整數型態的變數);


判斷字串A是否包含字串B
A.contains(字串序列B或單一字串)
回傳boolean值


安裝下載的app
./adb install XXX.apk(這是linux語法)




沒有留言:

張貼留言