001 Android開發初體驗

来源:https://www.cnblogs.com/xlfcjx/archive/2022/06/12/16367204.html
-Advertisement-
Play Games

1、簡介 註:本文代碼參考 我們將開發本系列第一個應用,並藉此學習一些Android基本概念以及構成應用的UI組件。 初學習,如果沒能全部理解,也不必擔心,後續還會涉及這些內容並有更加詳細的講解。 馬上要開發的應用名叫GeoQuiz,它能給出一道道地理知識問題。用戶點擊TRUE或FALSE 按鈕來回 ...


1、簡介

註:本文代碼參考
我們將開發本系列第一個應用,並藉此學習一些Android基本概念以及構成應用的UI組件。
初學習,如果沒能全部理解,也不必擔心,後續還會涉及這些內容並有更加詳細的講解。

馬上要開發的應用名叫GeoQuiz,它能給出一道道地理知識問題。用戶點擊TRUE或FALSE
按鈕來回答屏幕上的問題,GeoQuiz即時作出反饋。

下圖顯示了用戶點擊TRUE按鈕的結果:
用戶點擊TRUE按鈕圖,圖1

1.1、Activity和佈局文件

GeoQuiz應用由一個activity和一個佈局(layout)組成。

  • activity是Android SDK中 Activity類的一個實例,負責管理用戶與應用界面的交互。
  • 應用的功能是通過編寫 Activity 子類來實現的。對於簡單的應用來說,一個 Activity 子
    類可能就夠了,而複雜的應用則會有多個。 GeoQuiz是個簡單應用,因此它只有一個名叫 QuizActivity 的 Activity
    子類。 QuizActivity它所對應的 用戶界面。
  • 佈局定義了一系列用戶界面對象以及它們顯示在屏幕上的位置。組成佈局的定義保存在
    XML文件中。每個定義用來創建屏幕上的一個對象,如按鈕或文本信息。

GeoQuiz應用包含一個名叫activity_quiz.xml的佈局文件。該佈局文件中的XML標簽定義了
具體的用戶界面。

QuizActivity 與activity_quiz.xml文件的關係如下圖2所示:
Activity java文件與佈局xml文件對應關係圖:

1.2、用戶界面設計

Android Studio如何創建項目以及Android Studio的界面介紹這裡不贅述,我們通過Android Studio(以後簡稱“AS”)創建好GeoQuiz應用後,首先打開app/res/layout/activity_quiz.xml文件。如果看到的是佈局預覽界面,請點擊底部的
Text頁切換顯示XML代碼。

當前,activity_quiz.xml文件定義了預設的activity佈局。

應用activity的預設佈局定義了兩個組件(widget)RelativeLayout 和 TextView
組件是用戶界面的構造模塊。組件可以顯示文字或圖像,與用戶交互,甚至佈置屏幕上的其
他組件。按鈕、文本輸入控制項和選擇框等都是組件。
Android SDK內置了多種組件,通過配置各種組件可獲得所需的用戶界面及行為。每一個組
件都是 View 類或其子類(如 TextView 或 Button )的一個具體實例

RelativeLayout 和 TextView 是在屏幕上的顯示圖 圖3:
mark

QuizActivity 的用戶界面需要下列組件:

  • 一個垂直 LinearLayout 組件;
  • 一個 TextView 組件;
  • 一個水平 LinearLayout 組件;
  • 兩個 Button組件。

組件是如何構成 QuizActivity 用戶界面圖 圖4:
mark

下麵我們在activity_quiz.xml文件中定義這些組件。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="24dp"
        android:text="@string/question_text" />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/true_button" />
        <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/false_button" />
    </LinearLayout>
</LinearLayout>

上述代碼暫時不理解也沒關係,後續學習中逐漸弄明白的。
註意,開發工具無法校驗佈局XML內容,拼寫錯誤早晚會出問題,應儘量避免。

可以看到,有三行以 android:text 開頭的代碼出現了錯誤信息。暫時忽略它們,稍後會
處理。
對照上圖用戶界面查看XML文件,可以看出組件與XML元素一一對應。元素的名
稱就是組件的類型

各元素均有一組XML屬性。屬性可以看作如何配置組件的指令。
為方便理解元素與屬性的工作原理,接下來我們將以層級視角來研究佈局。

1.2.1、視圖層級結構

組件包含在視圖(View)對象的層級結構中,這種結構又稱作視圖層級結構(view hierarchy)

上述代碼所示的XML佈局對應的視圖層級結構圖 圖5:

從佈局的視圖層級結構可以看到,其根元素是一個 LinearLayout 組件。作為根元素,
LinearLayout 組件必須指定Android XML資源文件的命名空間屬性,這裡是http://schemas.
android.com/apk/res/android。

LinearLayout 組件繼承自 ViewGroup 組件(也是個 View 子類)。 ViewGroup 組件是包含並配
置其他組件的特殊組件
。想要以一列或一排的樣式佈置組件,就可以使用 LinearLayout 組件。
其他 ViewGroup 子類還有 FrameLayout 、 TableLayout 和 RelativeLayout 。

若某個組件包含在一個 ViewGroup 中,該組件與 ViewGroup 即構成父子關係。根 Linear-
Layout 有兩個子組件: TextView 和另一個 LinearLayout 。作為子組件的 LinearLayout 自己還
有兩個 Button 子組件。

1.2.2、組件屬性

看看配置組件時常用的一些屬性。

  1. android:layout_width 和 android:layout_height 屬性
    幾乎每類組件都需要 android:layout_width 和 android:layout_height 屬性。以下是它
    們的兩個常見屬性值(二選一)。
    match_parent :視圖與其父視圖大小相同。
    wrap_content :視圖將根據其顯示內容自動調整大小。
    (以前還有個 fill_parent 屬性值,等同於 match_parent ,現已廢棄不用。)
    根 LinearLayout 組件的高度與寬度屬性值均為 match_parent 。 LinearLayout 雖然是根元
    素,但它也有父視圖——Android提供該父視圖來容納應用的整個視圖層級結構。
    其他包含在界面佈局中的組件,其高度與寬度屬性值均被設置為 wrap_content 。

TextView 組件比其包含的文字內容區域稍大一些,這主要是 android:padding="24dp" 屬性
的作用。該屬性告訴組件在決定大小時,除內容本身外,還需增加額外指定量的空間。這樣屏幕
上顯示的問題與按鈕之間便會留有一定的空間,使整體顯得更為美觀。(不理解dp的意思?dp即
density-independent pixel,指與密度無關的像素。)
2. android:orientation 屬性
android:orientation 屬性是兩個 LinearLayout 組件都具有的屬性,它決定兩者的子組件
是水平放置還是垂直放置。根 LinearLayout 是垂直的,子 LinearLayout 是水平的。

子組件的定義順序決定其在屏幕上顯示的順序。在垂直的 LinearLayout 中,第一個定義的
子組件出現在屏幕的最上端;而在水平的 LinearLayout 中,第一個定義的子組件出現在屏幕的
最左端。(如果設備文字從右至左顯示,如阿拉伯語或者希伯來語,第一個定義的子組件則出現
在屏幕的最右端。)
3. android:text 屬性
TextView 與 Button 組件具有 android:text 屬性。該屬性指定組件要顯示的文字內容。
請註意, android:text 屬性值不是字元串值,而是對字元串資源(string resource)的引用。

字元串資源包含在一個獨立的名叫strings的XML文件中(strings.xml),雖然可以硬編碼設置
組件的文本屬性值,如 android:text="True" ,但這通常不是個好主意。

比較好的做法是:將文
字內容放置在獨立的字元串資源XML文件中,然後引用它們。這樣會方便應用的本地化(支持
多國語言)。
需要在activity_quiz.xml文件中引用的字元串資源還沒添加。現在就來處理。

1.2.3、創建字元串資源

每個項目都包含一個預設字元串資源文件strings.xml。

在項目工具視窗中,找到app/res/values目錄,展開目錄,打開strings.xml文件。
可以看到,項目模板已經添加了一些字元串資源。如下代碼所示,添加應用佈局需要
的三個新的字元串。

<resources>
    <string name="app_name">GeoQuiz</string>
    <string name="question_text">Canberra is the capital of Australia.</string>
    <string name="true_button">True</string>
    <string name="false_button">False</string>
</resources>

(某些版本的Android Studio的strings.xml預設帶有其他字元串,請勿刪除它們,否則會引發與
其他文件的聯動錯誤。)

現在,在GeoQuiz項目的任何XML文件中,只要引用到 @string/false_button ,應用運行
時,就會得到文本“False”。

保存strings.xml文件。這時,activity_quiz.xml佈局缺少字元串資源的提示信息應該就消失了。
(如仍有錯誤提示,請檢查一下這兩個文件,確認沒有拼寫錯誤。)

預設的字元串文件雖然已命名為strings.xml,仍可以按個人喜好重命名。一個項目也可以
有多個字元串文件。只要這些文件都放在res/values/目錄下,含有一個 resources 根元素,以及多
個 string 子元素,應用就能找到並正確使用它們。

1.3、從佈局 XML 到視圖對象

知道activity_quiz.xml中的XML元素是如何轉換為視圖對象的嗎?答案就在於 QuizActivity
類。

在創建GeoQuiz項目的同時,嚮導也創建了一個名叫 QuizActivity 的 Activity 子類。
QuizActivity 類文件存放在項目的app/java目錄下。java目錄是項目全部Java源代碼的存放處。

在項目工具視窗中,依次展開app/java目錄與com.bignerdranch.android.geoquiz包。找到並打
開QuizActivity.java文件,查看其中的代碼,如下所示:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class QuizActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);
    }
}

是不是不明白 AppCompatActivity 的作用?它實際就是一個 Activity 子類,能為Android
舊版本系統提供相容支持。

如果無法看到全部類包導入語句,請單擊第一行導入語句左邊的⊕符號來顯示它們。

該Java類文件有一個 Activity 方法: onCreate(Bundle) 。
(如果你的文件還包含 onCreateOptionsMenu(Menu) 和 onOptionsItemSelected(MenuItem)
方法,暫時不用理會)
activity子類的實例創建後, onCreate(Bundle) 方法會被調用。activity創建後,它需要獲取
並管理用戶界面。要獲取activity的用戶界面,可調用以下 Activity 方法:

public void setContentView(int layoutResID)

根據傳入的佈局資源ID參數,該方法生成指定佈局的視圖並將其放置在屏幕上。佈局視圖生
成後,佈局文件包含的組件也隨之以各自的屬性定義完成實例化。

1.3.1、資源與資源 ID

佈局是一種資源。資源是應用非代碼形式的內容,如圖像文件、音頻文件以及XML文件等。

項目的所有資源文件都存放在目錄app/res的子目錄下。在項目工具視窗中可以看到,
activity_quiz.xml佈局資源文件存放在res/layout/目錄下。strings.xml字元串資源文件存放在
res/values/目錄下。

可以使用資源ID在代碼中獲取相應的資源。activity_quiz.xml佈局的資源ID為R.layout.
activity_quiz。

查看GeoQuiz應用的資源ID需要切換項目視圖。Android Studio預設使用Android項目視圖,
圖6所示。為讓開發者專註於最常用的文件和目錄,預設視圖隱藏了Android項目的真實文件
目錄結構。

圖6:

在項目工具視窗的最上部找到下拉菜單,從Android項目視圖切換至Project視圖。Project視圖
會顯示出當前項目的所有文件和目錄。

展開目錄app/build/generated/source/r/debug,找到項目包名稱並打開其中的R.java文件,即可
看到GeoQuiz應用當前所有的資源。R.java文件在Android項目編譯過程中自動生成,如該文件頭
部的警示所述,請不要修改該文件的內容。

修改佈局或字元串等資源後,R.java文件不會實時刷新。Android Studio另外還存有一份代碼
編譯用的R.java隱藏文件。當前代碼編輯區打開的R.java文件僅在應用安裝至設備或模擬器前產
生,因此只有在Android Studio中點擊運行應用時,它才會得到更新。
R.java文件通常比較大,如下所示:

/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/

public final class R {
public static final class anim {
...
}
...
public static final class id {
...
}
public static final class layout {
    ...
    public static final int activity_quiz=0x7f030017;
    }
    public static final class mipmap {
    public static final int ic_launcher=0x7f030000;
}
public static final class string {
...
    public static final int app_name=0x7f0a0010;
        public static final int false_button=0x7f0a0012;
        public static final int question_text=0x7f0a0014;
        public static final int true_button=0x7f0a0015;
    }
}

可以看到R.layout.activity_quiz即來自該文件。 activity_quiz 是 R 的內部類 layout 里的一個
整型常量名。

GeoQuiz應用需要的字元串同樣具有資源ID。目前為止,我們還未在代碼中引用過字元串,
如果需要,可以使用以下方法:
setTitle(R.string.app_name);

Android為整個佈局文件以及各個字元串生成資源ID,但activity_quiz.xml佈局文件中的組件
除外,因為不是所有組件都需要資源ID。在本章中,我們要在代碼里與兩個按鈕交互,因此只需
為它們生成資源ID即可。

這裡主要使用Android項目視圖,生成資源ID之前,記得切回。當然,如果你就喜歡使用Project
視圖,也沒啥問題。

要為組件生成資源ID,請在定義組件時為其添加 android:id 屬性。在activity_quiz.xml文件
中,分別為兩個按鈕添加上 android:id 屬性,如下代碼所示:

<LinearLayout ... >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="24dp"
        android:text="@string/question_text" />
        
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        
        <Button
            android:id="@+id/true_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/true_button" />
        
        <Button
            android:id="@+id/false_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/false_button" />
            
    </LinearLayout>
    
</LinearLayout>

註意, android:id 屬性值前面有一個+標誌,而 android:text 屬性值則沒有。這是因為我
們在創建資源ID,而對字元串資源只是做引用

1.4、組件的實際應用

按鈕有了資源ID,就可以在 QuizActivity 中直接獲取它們。首先,在QuizActivity.java文件
中增加兩個成員變數。

在QuizActivity.java文件中輸入代碼:

public class QuizActivity extends AppCompatActivity {
    private Button mTrueButton;
    private Button mFalseButton;
    @Override
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);
    }
}

文件保存後,會看到兩個錯誤提示。沒關係,稍後會處理。請註意新增的兩個成員(實例)
變數名稱的 m 首碼。該首碼是Android編程應遵循的命名約定

現在,將滑鼠移至代碼左邊的錯誤提示處時,會看到兩條同樣的錯誤信息:Cannot resolve
symbol 'Button'。

這告訴我們,需要在QuizActivity.java文件中導入 android.widget.Button 類包。可在文件
頭部手動輸入以下代碼:
import android.widget.Button;

或者使用Option+Return(Alt+Enter)組合鍵,讓Android Studio自動為你導入。代碼有誤時,
也可以使用該組合鍵來修正。記得要常用。

類包導入後,剛纔的錯誤提示應該就消失了。(如果仍然存在,請檢查Java代碼以及XML文
件,確認是否存在輸入或拼寫錯誤。)
接下來,我們來編碼使用按鈕組件,這需要以下兩個步驟:

  • 引用生成的視圖對象;
  • 為對象設置監聽器,以響應用戶操作。

1.4.1 引用組件

在activity中,可調用以下 Activity 方法引用已生成的組件:
public View findViewById(int id)

該方法以組件的資源ID作為參數,返回一個視圖對象。
在QuizActivity.java文件中,使用按鈕的資源ID獲取視圖對象,賦值給對應的成員變數。註意,賦值前,必須先將返回的 View 類型轉換為 Button 。

public class QuizActivity extends AppCompatActivity {
    private Button mTrueButton;
    private Button mFalseButton;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);
        mTrueButton = (Button) findViewById(R.id.true_button);
        mFalseButton = (Button) findViewById(R.id.false_button);
    }
}

1.4.2 設置監聽器

Android應用屬於典型的事件驅動類型。不像命令行或腳本程式,事件驅動型應用啟動後,
即開始等待行為事件的發生,如用戶點擊某個按鈕。(事件也可以由操作系統或其他應用觸發,
但用戶觸發的事件更直觀,如點擊按鈕。)

應用等待某個特定事件的發生,也可以說應用正在“監聽”特定事件。為響應某個事件而創
建的對象叫作監聽器(listener)。監聽器會實現特定事件的監聽器介面(listener interface)。

無需自己動手,Android SDK已經為各種事件內置了很多監聽器介面。當前應用需要監聽用
戶的按鈕“點擊”事件,因此監聽器需實現 View.OnClickListener 介面。

首先處理TRUE按鈕。在QuizActivity.java文件中,在 onCreate(Bundle) 方法的變數賦值語
句後輸入下列代碼

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_quiz);
    mTrueButton = (Button) findViewById(R.id.true_button);
    mTrueButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Does nothing yet, but soon!
        }
    });
    mFalseButton = (Button) findViewById(R.id.false_button);
}

(如果遇到View cannot be resolved to a type的錯誤提示,請使用Option+Return(Alt+Enter)快
捷鍵導入 View 類。)

在上面代碼中,我們設置了一個監聽器。按鈕 mTrueButton 被點擊後,監聽器會立即通
知我們。傳入 setOnClickListener(OnClickListener) 方法的參數是一個監聽器。它是一個實
現了 OnClickListener 介面的對象。

使用匿名內部類
這裡,一個匿名內部類(anonymous inner class)實現了 OnClickListener 介面。語法看上去
稍顯複雜,不過有個助記小技巧最外層一對括弧內的全部代碼就是傳入 setOnClickListener
(OnClickListener) 方法的參數

mTrueButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Does nothing yet, but soon!
    }
});

後續所有的監聽器都以匿名內部類來實現。這樣做有兩大好處:

  • 第一,使用匿名內部類,可 以相對集中地實現監聽器方法,一眼可見;
  • 第二,事件監聽器一般只在一個地方使用,使用匿名
    內部類,就不用去創建繁瑣的命名類了。

匿名內部類實現了 OnClickListener 介面,因此它也必須實現該介面唯一的 onClick(View)
方法。 onClick(View) 現在是個空方法。雖然必須實現 onClick(View) 方法,但具體如何實現取
決於使用者,因此即使是個空方法,編譯器也可以編譯通過。
(如果匿名內部類、監聽器、介面等概念已忘得差不多了,現在就該去複習一下,或找本參
考手冊備查。)

1.5、創建提示消息

接下來要實現的是,分別點擊兩個按鈕,彈出我們稱之為toast的提示消息。Android的toast
是用來通知用戶的簡短彈出消息,用戶無需輸入什麼,也不用做任何干預操作。這裡,我們要用
toast來反饋答案,如圖7所示:
mark

首先回到strings.xml文件,如下代碼所示,為toast添加消息顯示用的字元串資源。

<resources>
    <string name="app_name">GeoQuiz</string>
    <string name="question_text">Canberra is the capital of Australia.</string>
    <string name="true_button">True</string>
    <string name="false_button">False</string>
    <string name="correct_toast">Correct!</string>
    <string name="incorrect_toast">Incorrect!</string>
</resources>

調用 Toast 類的以下方法,可創建toast:
public static Toast makeText(Context context, int resId, int duration)

該方法的 Context 參數通常是 Activity 的一個實例( Activity 本身就是 Context 的子類)。
第二個參數是toast要顯示字元串消息的資源ID。 Toast 類必須藉助 Context 才能找到並使用字元
串資源ID。第三個參數通常是兩個 Toast 常量中的一個,用來指定toast消息的停留時間。

創建toast後,可調用 Toast.show() 方法在屏幕上顯示toast消息。
在 QuizActivity 代碼里,分別調用 makeText(...) 方法。在添加
makeText(...) 時,可利用Android Studio的代碼自動補全功能,讓代碼輸入更輕鬆。

使用代碼自動補全
代碼自動補全功能可以節約大量開發時間,越早掌握受益越多。

依次輸入下麵代碼。當輸入到 Toast 類後的點號時,Android Studio會彈出一
個視窗,視窗內顯示了建議使用的 Toast 類的常量與方法。

要選擇需要的建議方法,使用上下鍵。(如果不想使用代碼自動補全功能,請不要按Tab鍵、
Return/Enter鍵,或使用滑鼠點擊彈出視窗,只管繼續輸入代碼直至完成。)

在建議列表裡,選擇 makeText(Context context, int resID, int duration) 方法,代
碼自動補全功能會自動添加完整的方法調用。
完成 makeText 方法的全部參數設置,完成後的代碼如下代碼所示:

mTrueButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(QuizActivity.this,
        R.string.correct_toast,
        Toast.LENGTH_SHORT).show();
        // Does nothing yet, but soon!
    }
});
mFalseButton = (Button) find ViewById(R.id.false_button);
mFalseButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(QuizActivity.this,
        R.string.incorrect_toast,Toast.LENGTH_SHORT).show();
    }
});

在 makeText(...) 里,傳入 QuizActivity 實例作為 Context 的參數值。註意此處應輸入的
參數是 QuizActivity.this ,不要想當然地直接輸入 this 。因為匿名類的使用,這裡的 this 指
的是監聽器 View.OnClickListener 。

使用代碼自動補全功能,自己也就不用導入 Toast 類了,因為Android Studio會自動導入相
關類。

好了,現在可以運行應用了。

1.6、 使用模擬器運行應用

運行Android應用需使用硬體設備或虛擬設備(virtual device)。包含在開發工具中的Android
設備模擬器可提供多種虛擬設備。

要創建Android虛擬設備(AVD),在Android Studio中,選擇Tools → Android → AVD Manager
菜單項。AVD管理器視窗彈出時,點擊視窗左下角的+Create Virtual Device…按鈕。一路next,詳細的創建不贅述了。

創建完成後即可啟動運行。

AVD創建成功後,我們用它運行GeoQuiz應用。點擊Android Studio工具欄上的Run按鈕,或
者使用Control+R快捷鍵。Android Studio會自動找到新建的虛擬設備,安裝應用包(APK),然後
啟動並運行應用。
模擬器的啟動過程比較耗時,請耐心等待。等設備啟動完成,應用運行後,就可以在應用界
面點擊按鈕,讓toast告訴你答案了。
假如啟動時或在點擊按鈕時,GeoQuiz應用崩潰,可以在Android DDMS工具視窗的LogCat
視圖中看到有用的診斷信息。(如果LogCat沒有自動打開,可點擊Android Studio視窗底部的
Android Monitor按鈕打開它。),查看日誌。

最好不要關掉模擬器,這樣就不必在反覆運行調試應用時,浪費時間等待AVD啟動了。
單擊AVD模擬器上的後退按鈕可以停止應用。這個後退按鈕的形狀像一個指向左側的三角形
(在較早版本的Android中,它像一個U型箭頭)。需要調試變更時,再通過Android Studio重新運
行應用。

模擬器雖然好用,但在實體設備上測試應用能獲得更準確的結果。

1.7、深入學習:Android 編譯過程

學習到這裡,你可能迫切想知道Android是如何編譯的。
你已經知道在項目文件發生變化時,
Android Studio無需指示便會自動進行編譯。

在整個編譯過程中,Android開發工具將資源文件、
代碼以及AndroidManifest.xml文件(包含應用的元數據)編譯生成.apk文件。.apk文件要在模擬器上
運行,還需以debug key簽名。(分發.apk應用給用戶時,應用必須以release key簽名。更多有關編譯
過程的信息,可參考Android開發文檔網頁developer.android.com/tools/publishing/preparing.html。)

那麼,應用的activity_quiz.xml佈局文件的內容該如何轉變為 View 對象呢?作為編譯過程的
一部分,aapt(Android Asset Packaging Tool)將佈局文件資源編譯壓縮緊湊後,打包到.apk文件
中。

然後,在 QuizActivity 類的 onCreate(Bundle) 方法調用 setContentView(...) 方法時,
QuizActivity 使用 LayoutInflater 類實例化佈局文件中定義的每一個 View 對象,如圖8所示:
mark

1.7.1、Android 編譯工具

當前,我們看到的項目編譯都是在Android Studio里執行的。編譯功能已整合到IDE中,IDE
負責調用aapt等Android標準編譯工具,但編譯過程本身仍由Android Studio管理。

有時,出於某種原因,可能需要脫離Android Studio編譯代碼。最簡單的方法是使用命令行
編譯
工具。現代Android編譯系統使用Gradle編譯工具

要從命令行使用Gradle,請切換到項目目錄並執行以下命令:
$ ./gradlew tasks

如果是Windows系統,執行以下命令:

gradlew.bat tasks

執行以上命令會顯示一系列可用任務。你需要的任務是installDebug,因此,再執行以下命令:
$ ./gradlew installDebug
如果是Windows系統,執行以下命令:

gradlew.bat installDebug

以上命令將把應用安裝到當前連接的設備上,但不會運行它。要運行應用,需要在設備上手
動啟動。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.前言 hi,大家好,我是三合。作為一名程式猿,日常開發中,我們在接到需求以後,一般都會先構思一個模型,然後根據模型寫實體類,寫完實體類後在資料庫里建表,接著進行增刪改查, 也有第二種情況,就是有些人喜歡先在資料庫里建表,然後再添加實體類。前者是code First,後者是db First,如果數 ...
  • DS18B20 是一個常見的數字溫度計晶元, 因為測溫準確, 廉價且接線簡單, 實際應用廣泛, 在各種教學實驗套裝中出鏡率也很高. 在寫STC8H GPIO示例的時候寫了一下 DS18B20, 這個型號雖然簡單古老, 但是內容比較有意思, 一個篇幅寫不下, 所以把內容抽出來單獨介紹. ...
  • 在日常開發中,郵件發送是個比較常見的場景。因此出現了很多相關的軟體和服務,各大雲廠商也推出自己的郵件服務。今天筆者就像大家介紹一種常見的組合,AWS的郵件服務 SES 與郵件伺服器 postfix 的配置和使用方法。 概述 什麼是 AWS-SES Amazon Simple Email Servic ...
  • 寫在前面 令人愉快又頹廢的周日馬上就要到了,正在計劃這周博客寫什麼的我,突然收到導師發給我的消息,What?要給我發補助? 這樣中午不得去食堂加一個餐,很快啊,我就說了聲:謝謝。 但後續證明我還是太嫩了些,天上是沒有免費午餐的。 不過對於這種專業相關,而且能從中學到不少東西的任務,我還是十分樂意去乾 ...
  • 1.下載安裝包 1.1 下載elasticsearch 7.13.3 curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.3-linux-x86_64.tar.gz 1.2 解壓文件 t ...
  • SQL的語法 SQL通用語法 SQL語句可以單行或多行書寫,以分號(“;”)結尾。 SQL語句可以使用空格或縮進增強可讀性。 MySQL資料庫的SQL語句不區分大小寫(建議關鍵字大寫)。 註釋 單行註釋: -- 內容 # 內容(MySQL特有) 多行註釋: /* 內容 */ SQL語句分類 分類 全 ...
  • MyBatisPlus(簡稱MP)是基於MyBatis框架基礎上開發的增強型工具,旨在簡化開發、提高效率 - 無侵入:只做增強不做改變,不會對現有工程產生影響 - 強大的 CRUD 操作:內置通用 Mapper,少量配置即可實現單表CRUD 操作 - 支持 Lambda:編寫查詢條件無需擔心欄位寫錯... ...
  • 分享嘉賓:羅景 58同城 高級架構師 編輯整理:洪鵬飛 內容來源:DataFun AI Talk《連接效率優化實踐》 出品社區:DataFun **導讀:**本次分享由以下幾個部分構成—— 58的業務背景 綜合排序框架 效率優化框架 基礎數據流程(數據) 策略優化路徑(演算法) 效率優化平臺(工程) ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...