安卓入門-熟悉Android Studio以及創建第一個安卓模塊

一、創建項目相關:

Start a new Android Studio project:
在這裏插入圖片描述
Name:表示應用名稱,此應用安裝到手機之後會在手機上顯示該名稱

Package name:表示項目的包名,Android系統就是通過包名來區分不同應用程序的,因此包名一定要具有唯一性。

 下面是安卓的創建活動界面,可以看到,Android Studio提供了很多種內置模板,不過由於我們纔剛剛開始學習,用不着這麼多複雜的模板,這裏直接選擇Empty Activity來創建一個空的活動就可以了。

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
錘子按鈕:編譯項目

下拉列表:選擇運行哪一個項目,通常app就是當前的主項目

三角形按鈕:運行項目

1.1 Android Studio的一些簡寫

單詞/縮寫 含義
AVD:Android Virtual Device Android運行的虛擬設備
select a system image 選擇系統映像/差不多就是系統版本文件的意思
portrait 縱向的
lanscape 橫向的
emulated performance 仿真性能
graphics 圖像
device frame 設備框架
advanced setting 高級設置
default orientation 默認方向,指的是初次進入系統時的豎屏還是橫屏
instant run 即時運行

1.2 Android Studio項目結構分析

 任何一個新建的項目都會默認使用Android模式的項目結構,但這並不是項目真實的目錄結構,而是被Android Studio轉換過的。這種項目結構簡潔明瞭,適合進行快速開發,但是對於新手來說可能並不易於理解。

在這裏插入圖片描述
 Project是真實的項目目錄結構,而Android是經過轉化的項目目錄結構。

在這裏插入圖片描述
 現在整個項目的外層目錄結構已經介紹完了。你會發現,除了app目錄之外,大多數的文件和目錄都是自動生成的,我們並不需要進行修改。想必你已經猜到了,app目錄下的內容纔是我們以後的工作重點,展開之後結構如下圖所示。

在這裏插入圖片描述
下圖是谷歌官方文檔中提供的AS工程結構圖:

在這裏插入圖片描述
 可能很多人剛開始接觸studio時,對於BuildScript下面的兩個build.gradle文件不太明白,一模一樣的文件名放在同一個目錄下給人一種混亂的感覺(至少我當時是這麼頭疼的)

  1. 在一個工程中可以有多個build.gradle配置文件
  2. 工程根目錄存在一個build.gradle配置,用於對整個工程的配置(倉庫,插件)
  3. 每個模塊(module)內有一個build.gradle文件,對應該模塊緯度的相關編譯配置(模塊類型、構建方式、用於編譯的SDK版本、該模塊所依賴的庫等等)

一個工程中 build.gradle文件個數 = module個數(代表模塊的garadle配置文件) + 1(代表整個工程的配置文件)

1.3 安卓項目文件的第一次分析

 接下來我們來查看AndroidManifest.xml文件,也就是整個安卓項目的配置文件。

 這段代碼表示對HelloWorldActivity(MainActivity)這個活動進行註冊。沒有在AndroidManifest.xml裏註冊的活動是不能使用的。

 <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                    
//使用<intent-filter>括起來的以上兩段代碼很重要,其代表HelloWorldActivity是這個項目的主活動在手機上點擊應用圖標,首先啓動的就是這個活動。
            </intent-filter>
        </activity>

 下面我們打開MainActivity來一探究竟,查看器其究竟是如何運行的:

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);//創建活動時必須要執行的方法
        setContentView(R.layout.activity_main);//將佈局文件直接引入到活動中來
    }
}

 首先我們可以看到,MainActivity是繼承自AppCompatActivity的,這是一種向下兼容的Activity,可以將Activity在各個系統版本中增加的特性和功能最低兼容到Android 2.1系統。ActivityAndroid系統提供的一個活動基類,我們項目中所有的活動都必須繼承它或者它的子類才能擁有活動的特性(AppCompatActivityActivity的子類)。然後可以看到MainActivity中有一個onCreate()方法,這個方法是一個活動被創建時必定要執行的方法,其中只有兩行代碼,並且沒有HelloWorld!的字樣。那麼在應用中顯示的Hello World!是在哪裏定義的呢?

 其實Android程序的設計講究邏輯和視圖分離,因此是不推薦在活動中直接編寫界面的,更加通用的一種做法是:

  1. 在佈局文件中編寫界面
  2. 然後在活動中引入進來

 可以看到,在onCreate() 方法的第二行調用了setContentView()方法,就是這個方法給當前的活動引入了一個hello_world_layout佈局,那Hello World!一定就是在這裏定義的了!我們快打開這個文件看一看。

 佈局文件都是定義在res/layout目錄下的,當你展開layout目錄,你會看到hello_world_layout.xml這個文件。打開該文件並切換到Text視圖,代碼如下所示:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 現在還看不懂?沒關係,後面我會對佈局進行詳細講解的,你現在只需要看到上面代碼中有一個TextView,這是Android系統提供的一個控件,用於在佈局中顯示文字的。然後你終於在TextView中看到了Hello World!的字樣!哈哈!終於找到了,原來就是通過android:text="Hello World!"這句代碼定義的。

1.4 res目錄下的結構

在這裏插入圖片描述

目錄文件夾名 作用
以drawable開頭的文件夾 放圖片
以mipmap開頭的文件夾 放應用圖標
以values開頭的文件夾 用來放字符串、樣式、顏色等配置
layout文件夾 放佈局文件

 之所以有這麼多mipmap開頭的文件夾,其實主要是爲了讓程序能夠更好地兼容各種設備。Android機型尺寸各種各樣,於是屏幕適配就成了Android開發中很重要的一環。

 drawable文件夾也是相同的道理,由於我選擇的設備是"Nexus 5X API 24",所以Android Studio自動替我們生產了此文件夾,但是我們應該自己創建drawable-hdpi、drawable-xhdpi、drawable-xxhdpi等文件夾。在製作程序的時候最好能夠給同一張圖片提供幾個不同分辨率的版本,分別放在這些文件夾下,然後當程序運行的時候,會自動根據當前運行設備分辨率的高低選擇加載哪個文件夾下的圖片。當然這只是理想情況,更多的時候美工只會提供給我們一份圖片,這時你就把所有圖片都放在drawable-xxhdpi文件夾下就好了。

 知道了res目錄下每個文件夾的含義,我們再來看一下如何去使用這些資源吧。打開res/ values/strings.xml文件,內容如下所示:我們以程序名字符串爲例進行引用方式的說明:

<resources>
    <string name="app_name">MyHelloWorld</string>
</resources>

可以看到,這裏定義了一個應用程序名的字符串,我們有以下兩種方式來引用它。

  1. 在代碼中通過R.string.app_name 可以獲得該字符串的引用。
  2. 在XML中通過@string/app_name 可以獲得該字符串的引用。

 基本的語法就是上面這兩種方式,其中string 部分是可以替換的,如果是引用的圖片資源就可以替換成drawable ,如果是引用的應用圖標就可以替換成mipmap ,如果是引用的佈局文件就可以替換成layout ,以此類推。比如:我在所有的以mipmap開頭的文件夾中都加入了“cloud.png”文件,然後在AndroidManifest.xml文件中將android:icon="@mipmap/ic_launcher"語句修該爲android:icon="@mipmap/cloud"語句,那麼就出現了以下的圖標:

在這裏插入圖片描述
 這樣就實現了更改應用程序圖標的功能,所以可見修改一個圖標只需在AndroidManifest.xml文件中修改簡單的一句話就像,Andrioid StudioIDE果然已經將安卓開發簡化到“一步到位”。

1.5 Gradle入門學習

 Gradle是一個構建工具,它是用來幫助我們構建app的,構建包括編譯、打包等過程。我們可以爲Gradle指定構建規則,然後它就會根據我們的“命令”自動爲我們構建app。Android Studio中默認就使用Gradle來完成應用的構建。有些同學可能會有疑問:”我用AS不記得給Gradle指定過什麼構建規則呀,最後不還是能搞出來個apk。“ 實際上,app的構建過程是大同小異的,有一些過程是”通用“的,也就是每個app的構建都要經歷一些公共步驟。因此,在我們在創建工程時,Android Studio自動幫我們生成了一些通用構建規則,很多時候我們甚至完全不用修改這些規則就能完成我們app的構建。

 有些時候,我們會有一些個性化的構建需求,比如我們引入了第三方庫,或者我們想要在通用構建過程中做一些其他的事情,這時我們就要自己在系統默認構建規則上做一些修改。這時候我們就要自己向Gradle”下命令“了,這時候我們就需要用Gradle能聽懂的話了,也就是Groovy。Groovy是一種基於JVM的動態語言。

Gradle的基本組成

組成名詞 作用
Project與Task Project:每一個待構建的工程;Task:構建一個Project需要執行一系列的任務,比如:Java源碼編譯、資源文件編譯、Lint檢查、打包以生成最終的apk文件等等任務;
插件 兩個核心:1.定義Task;2.執行Task。爲了讓Gradle能正常工作,完成整個構建流程中的一系列Task的執行,必須導入合適的插件,這些插件中定義了構建Project中的一系列Task,並且負責執行相應的Task。
Gradle配置文件 Android Studio中的一個Module即爲Gradle中的一個Project。app目錄下的build.gradle文件,代表了app Module的構建腳本,它定義了應用於本模塊的構建規則。工程根目錄下也存在一個build.gradle文件,它代表了整個工程的構建,其中定義了適用於這個工程中所有模塊的構建規則。
構建腳本buildscript 用於Gradle下的腳本構建,定義了項目於的構建規則

插件功能詳細介紹:

 在新建工程的app模塊的build.gradle文件的第一行,往往都是如下這句:

apply plugin: 'com.android.application'

 這句話的意思就是應用“com.android.application“這個插件來構建app模塊,app模塊就是Gradle中的一個Project。也就是說,這個插件負責定義並執行Java源碼編譯、資源文件編譯、打包等一系列Task。實際上"com.android.application"整個插件中定義瞭如下4個頂級任務:

  • assemble: 構建項目的輸出(apk)
  • check: 進行校驗工作
  • build: 執行assemble任務與check任務
  • clean: 清除項目的輸出

 當我們執行一個任務時,會自動執行它所依賴的任務。比如,執行assemble任務會執行assembleDebug任務和assembleRelease任務,這是因爲一個Android項目至少要有debug和release這兩個版本的輸出。

Gradle配置文件的詳細介紹:

  • gradle.properties: 從它的名字可以看出,這個文件中定義了一系列“屬性”。實際上,這個文件中定義了一系列供build.gradle使用的常量,比如keystore的存儲路徑、keyalias等等。
  • gradlew與gradlew.bat: gradlew爲Linux下的shell腳本,gradlew.bat是Windows下的批處理文件。gradlew是gradle wrapper的縮寫,也就是說它對gradle的命令進行了包裝,比如我們進入到指定Module目錄並執行“gradlew.bat assemble”即可完成對當前Module的構建(Windows系統下)。
  • local.properties: 從名字就可以看出來,這個文件中定義了一些本地屬性,比如SDK的路徑。
  • settings.gradle: 假如我們的項目包含了不只一個Module時,我們想要一次性構建所有Module以完成整個項目的構建,這時我們需要用到這個文件。比如我們的項目包含了ModuleA和ModuleB這兩個模塊,則這個文件中會包含這樣的語句:include ‘:ModuleA’, ‘:ModuleB’。

1.6 詳解build.gradle文件

 不同於Eclipse,Android Studio是採用Gradle來構建項目的。Gradle是一個非常先進的項目構建工具,它使用了一種基於Groovy的領域特定語言(DSL)來聲明項目設置,摒棄了傳統基於XML(如Ant和Maven)的各種煩瑣配置。

 在之前對項目的目錄結構介紹中我們提到:有兩個build.gradle文件,一個是在最外層目錄下的,一個是在app目錄下的。這兩個文件對構建Android Studio項目都起到了至關重要的作用,下面我們就來對這兩個文件中的內容進行詳細的分析。項目中一般會出現2個或者多個 build.gradle 文件,一個在根目錄下,一個在 app 目錄下。如果切換到 Android 模式下則全部在 Gradle Scripts:

在這裏插入圖片描述
先來看一下最外層目錄下的build.gradle文件,代碼如下所示:

buildscript {
    repositories {//第一處:repositories
        jcenter() //構建腳本中所依賴的庫都在jcenter倉庫下載
    }
    dependencies {
        //指定了gradle插件的版本
        classpath 'com.android.tools.build:gradle:1.5.0'
    }
}

allprojects {
    repositories {//第二處:repositories
        //當前項目所有模塊所依賴的庫都在jcenter倉庫下載
        jcenter()
    }
}

 這些代碼都是自動生成的,雖然語法結構看上去可能有點難以理解,但是如果我們忽略語法結構,只看最關鍵的部分,其實還是很好懂的。

jcenter的含義:它是一個代碼託管倉庫,很多Android開源項目都會選擇將代碼託管到jcenter上,聲明瞭這行配置之後,我們就可以在項目中輕鬆引用任何jcenter上的開源項目了。

 dependencies 閉包中使用classpath 聲明瞭一個Gradle插件。聲明這個插件的原因是:因爲Gradle並不是專門爲構建Android項目而開發的,Java、C++等很多種項目都可以使用Gradle來構建。因此如果我們要想使用它來構建Android項目,則需要聲明com.android.tools.build:gradle:2.2.0 這個插件。其中,最後面的部分是插件的版本號,我在寫作本書時最新的插件版本是2.2.0。

 這樣我們就將最外層目錄下的build.gradle文件分析完了,通常情況下你並不需要修改這個文件中的內容,除非你想添加一些全局的項目構建配置。

 下面我們再來看一下app目錄下的build.gradle文件,代碼如下所示:

// 聲明是Android程序,
// com.android.application 表示這是一個應用程序模塊,可直接運行
// com.android.library 標識這是一個庫模塊,是依附別的應用程序運行
apply plugin: 'com.android.application'

android {
    compileSdkVersion 29  //編譯Sdk版本爲29
    buildToolsVersion "29.0.0"//指定項目的構建版本
    defaultConfig {
        applicationId "com.example.myhelloworld"//用於指定項目包名,初始化之後的修改在此進行
        minSdkVersion 15//當前項目的最低兼容的安卓系統版本
        targetSdkVersion 29//目標版本號,意味着此模塊所有特性在此安卓版本上最好
        versionCode 1//指定項目版本號
        versionName "1.0"//指定項目版本名
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"//指定當前測試單元類型
    }
    buildTypes {
        release {
            minifyEnabled false //是否對代碼進行混淆,此處爲不進行混淆
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'//用於指定混淆時使用的規則文件
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

各個部分的作用:

  1. 第一行應用了一個插件,一般有兩種值可選:com.android.application 表示這是一個應用程序模塊,com.android.library 表示這是一個庫模塊。應用程序模塊和庫模塊的最大區別在於,一個是可以直接運行的,一個只能作爲代碼庫依附於別的應用程序模塊來運行。
  2. android閉包 ,在這個閉包中我們可以配置項目構建的各種屬性。其內部又有以下兩個包:
    1. buildTypes閉包中用於指定生成安裝文件的相關配置,通常只會有兩個子閉包,一個是debug,一個是release。
    2. debug閉包用於指定生成測試版安裝文件的配置,release閉包用於指定生成正式版安裝文件的配置。另外,debug閉包是可以忽略不寫的,因此我們看到上面的代碼中就只有一個release閉包。
  3. dependencies閉包:這個閉包的功能非常強大,它可以指定當前項目所有的依賴關係。通常Android Studio項目一共有3種依賴方式:本地依賴、庫依賴和遠程依賴。
    1. 本地依賴可以對本地的Jar包或目錄添加依賴關係
    2. 庫依賴可以對項目中的庫模塊添加依賴關係
    3. 遠程依賴則可以對jcenter庫上的開源項目添加依賴關係

android閉包的內容分析:

  1. **compileSdkVersion:**用於指定項目的編譯版本,這裏指定成24表示使用Android 7.0系統的SDK編譯。
  2. **buildToolsVersion:**用於指定項目構建工具的版本,目前最新的版本就是24.0.2,如果有更新的版本時,Android Studio會進行提示。
  3. **defaultConfig閉包:**可以對項目的更多細節進行配置。
    1. applicationId 用於指定項目的包名,前面我們在創建項目的時候其實已經指定過包名了,如果你想在後面對其進行修改,那麼就是在這裏修改的。
    2. minSdkVersion 用於指定項目最低兼容的Android系統版本,這裏指定成15表示最低兼容到Android 4.0系統。
    3. targetSdkVersion 指定的值表示你在該目標版本上已經做過了充分的測試,系統將會爲你的應用程序啓用一些最新的功能和特性。比如說Android 6.0系統中引入了運行時權限這個功能,如果你將targetSdkVersion 指定成23或者更高,那麼系統就會爲你的程序啓用運行時權限功能,而如果你將targetSdkVersion 指定成22,那麼就說明你的程序最高只在Android 5.1系統上做過充分的測試,Android 6.0系統中引入的新功能自然就不會啓用了。
    4. versionCode 用於指定項目的版本號
    5. versionName 用於指定項目的版本名,這兩個屬性在生成安裝文件的時候非常重要,我們在後面都會學到。
  4. release閉包內容分析:
  5. minifyEnabled 用於指定是否對項目的代碼進行混淆,true 表示混淆,false 表示不混淆。
  6. proguardFiles 用於指定混淆時使用的規則文件,這裏指定了兩個文件:
    1. 第一個proguard-android.txt 是在Android SDK目錄下的,裏面是所有項目通用的混淆規則
    2. 第二個proguard-rules.pro 是在當前項目的根目錄下的,裏面可以編寫當前項目特有的混淆規則。需要注意的是,通過Android Studio直接運行項目生成的都是測試版安裝文件,關於如何生成正式版安裝文件我們將會在第15章中學習。

dependencies內容分析閉包:

  1. compile fileTree 就是一個本地依賴聲明,它表示將libs目錄下所有.jar後綴的文件都添加到項目的構建路徑當中。
  2. 第二行的compile 則是遠程依賴聲明,com.android.support:appcompat-v7:24.2.1 就是一個標準的遠程依賴庫格式,其中com.android.support 是域名部分,用於和其他公司的庫做區分;appcompat-v7 是組名稱,用於和同一個公司中不同的庫做區分;24.2.1是版本號,用於和同一個庫不同的版本做區分。加上這句聲明後,Gradle在構建項目時會首先檢查一下本地是否已經有這個庫的緩存,如果沒有的話則會去自動聯網下載,然後再添加到項目的構建路徑當中。至於庫依賴聲明這裏沒有用到,它的基本格式是compile project 後面加上要依賴的庫名稱,比如說有一個庫模塊的名字叫helper,那麼添加這個庫的依賴關係只需要加入compile project(’:helper’) 這句聲明即可。另外剩下的一句testCompile 是用於聲明測試用例庫的,這個我們暫時用不到,先忽略它就可以了。

1.7 掌握日誌工具的使用

 Android中的日誌工具類是Log(android.util.Log),這個類中提供瞭如下5個方法來供我們打印日誌。

方法名 作用
Log.v() 用於打印那些最爲瑣碎的、意義最小的日誌信息。對應級別verbose,是Android日誌裏面級別最低的一種。
Log.d() 用於打印一些調試信息,這些信息對你調試程序和分析問題應該是有幫助的。對應級別debug,比verbose高一級。
Log.i() 用於打印一些比較重要的數據,這些數據應該是你非常想看到的、可以幫你分析用戶行爲數據。對應級別info,比debug高一級。
Log.w() 用於打印一些警告信息,提示程序在這個地方可能會有潛在的風險,最好去修復一下這些出現警告的地方。對應級別warn,比info高一級。
Log.e() 用於打印程序中的錯誤信息,比如程序進入到了catch語句當中。當有錯誤信息打印出來的時候,一般都代表你的程序出現嚴重問題了,必須儘快修復。對應級別error,比warn高一級。

 其實很簡單,一共就5個方法,當然每個方法還會有不同的重載,但那對你來說肯定不是什麼難理解的地方了。我們現在就在HelloWorld項目中試一試日誌工具好不好用吧。

 打開HelloWorldActivity,在onCreate() 方法中添加一行打印日誌的語句,如下所示:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("MainActivity","onCreate execute");
    }
}

Log.d()方法中傳入了兩個參數:第一個參數是tag,一般傳入當前的類名就好,主要用於對打印信息進行過濾;第二個參數是msg ,即想要打印的具體的內容。

09/08 20:24:53: Launching app
$ adb shell am start -n "com.example.myhelloworld/com.example.myhelloworld.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Client not ready yet..Connected to process 8188 on device emulator-5554
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
D/EGL_emulation: eglMakeCurrent: 0x9c1613c0: ver 2 0 (tinfo 0xa80f6720)
D/MainActivity: onCreate execute
D/EGL_emulation: eglMakeCurrent: 0x9c1613c0: ver 2 0 (tinfo 0xa80f6720)

 而隨着我在模擬器上點擊,做更多的相關操作,日誌的內容也變得越來越多。

 快速在AS調用日誌方法可以使用快捷操作:logi/ligw…

在這裏插入圖片描述
在這裏插入圖片描述

  1. Show only selected application表示只顯示當前選中程序的日誌
  2. Firebase是谷歌提供的一個分析工具,我們可以不用管它
  3. No Filters相當於沒有過濾器

 點擊Edit Filter Configuration,會彈出一個過濾器配置界面。我們給過濾器起名叫data,並且讓它對名爲data的tag進行過濾:

在這裏插入圖片描述
logcat中的日誌級別:

 當前我們選中的級別是verbose,也就是最低等級。這意味着不管我們使用哪一個方法打印日誌,這條日誌都一定會顯示出來。而如果我們將級別選中爲debug,這時只有我們使用debug及以上級別方法打印的日誌纔會顯示出來,以此類推。你可以做一下試驗,當你把logcat中的級別選中爲info、warn或者error時,我們在onCreate() 方法中打印的語句是不會顯示的,因爲我們打印日誌時使用的是Log.d() 方法。

 日誌級別控制的好處就是,你可以很快地找到你所關心的那些日誌。相信如果讓你從上千行日誌中查找一條崩潰信息,你一定會抓狂的吧。而現在你只需要將日誌級別選中爲error,那些不相干的瑣碎信息就不會再幹擾你的視線了。

關鍵字過濾輸入框:

 我們可以在輸入框裏輸入關鍵字的內容,這樣只有符合關鍵字條件的日誌纔會顯示出來,從而能夠快速定位到任何你想查看的日誌。另外還有一點需要注意,關鍵字過濾是支持正則表達式的,有了這個特性,我們就可以構建出更加豐富的過濾條件。

在這裏插入圖片描述

1.8 小節

 你現在一定會覺得很充實,甚至有點沾沾自喜。確實應該如此,因爲你已經成爲一名真正的Android開發者了。通過本章的學習,你首先對Android系統有了更加充足的認識,然後成功將Android開發環境搭建了起來,接着創建了你自己的第一個Android項目,並對Android項目的目錄結構和執行過程有了一定的認識,在本章的最後還學習了Android日誌工具的使用,這難道還不夠充實嗎?

 不過你也別太過於滿足,相信你很清楚,Android開發者和出色的Android開發者還是有很大的區別的,你還需要付出更多的努力才行。即使你目前在Java領域已經有了不錯的成績,我也希望在Android的世界你可以放下身段,以一隻萌級小菜鳥的身份起飛,在後面的旅途中你會不斷地成長。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章