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
  • 什麼是工廠模式 工廠模式是最常用的設計模式之一,屬於創建型模式。 有點: 解耦,可以把對象的創建和過程分開 減少代碼量,易於維護 什麼時候用? 當一個抽象類有多個實現的時候,需要多次實例化的時候,就要考慮使用工廠模式。 比如:登錄的抽象類ILoginBusiness,它有2個實現,一個用用戶名密碼登 ...
  • 這次iNeuOS升級主要升級圖形渲染引擎和增加豐富的圖元信息,可以很快的方案應用。總共增加41個通用和行業領域的圖元應用,增加2154個圖元信息,現在iNeuOS視圖建模功能模塊總共包括5894個行業圖元信息。現在完全支持製作高保真的工藝流程和大屏展示效果。 ...
  • 效果圖先附上: 首先 這是我是參考 教程:使用 SignalR 2 和 MVC 5 實時聊天 | Microsoft Docs 先附上教程: 在“添加新項 - SignalRChat”中,選擇 InstalledVisual> C#>WebSignalR>,然後選擇 SignalR Hub 類 (v ...
  • 一、前言 項目中之前涉及到胎兒心率圖曲線的繪製,最近項目中還需要添加心電曲線和血樣曲線的繪製功能。今天就來分享一下心電曲線的繪製方式; 二、正文 1、胎兒心率曲線的繪製是通過DrawingVisual來實現的,這裡的心電曲線我也是採用差不多相同的方式來實現的,只是兩者曲線的數據有所區別。心電圖的數據 ...
  • 安裝 Redis # 首先安裝依賴gcc, 後面需要使用make編譯redis yum install gcc -y # 進入 /usr/local/src 目錄, 把源碼下載到這裡 cd /usr/local/src # 下載 redis 7.0.2 的源碼,github被牆,可以使用國內的地址 ...
  • Redis 的定義? 百度百科: Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。 中文官網: Redis是一個開源(BSD許可),記憶體存 ...
  • 事情的起因是收到了一位網友的請求,他的java課設需要設計實現迷宮相關的程式——如標題概括。 我這邊不方便透露相關信息,就只把任務要求寫出來。 演示視頻指路👉: 基於JavaFX圖形界面的迷宮程式演示_嗶哩嗶哩_bilibili 完整代碼鏈接🔎: 網盤:https://pan.baidu.com ...
  • Python中的字典 Python中的字典是另一種可變容器模型,且可存儲任意類型對象。鍵值使用冒號分割,你可以看成是一串json。 常用方法 獲取字典中的值 dict[key] 如果key不存在會報錯,建議使用dict.get(key),不存在返回None 修改和新建字典值 dict[key]=va ...
  • 迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“加班使我快樂”。 面試官: 看你簡歷上用過MySQL,問你幾個簡單的問題吧。什麼是聚簇索引和非聚簇索引? 這個問題難不住我啊。來之前我看一下一燈M ...
  • tunm二進位協議在python上的實現 tunm是一種對標JSON的二進位協議, 支持JSON的所有類型的動態組合 支持的數據類型 基本支持的類型 "u8", "i8", "u16", "i16", "u32", "i32", "u64", "i64", "varint", "float", "s ...