一、建立項目相關:
Start a new Android Studio project:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMyYTMvw1dvwlMvwlM3VWaWV2Zh1Wa-cmbw5yYhdjZklXO6ZTcvwFO5YTMxETNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
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檔案不太明白,一模一樣的檔案名放在同一個目錄下給人一種混亂的感覺(至少我當時是這麼頭疼的)
- 在一個工程中可以有多個build.gradle配置檔案
- 工程根目錄存在一個build.gradle配置,用于對整個工程的配置(倉庫,插件)
- 每個子產品(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
系統。
Activity
是
Android
系統提供的一個活動基類,我們項目中所有的活動都必須繼承它或者它的子類才能擁有活動的特性(
AppCompatActivity
是
Activity
的子類)。然後可以看到
MainActivity
中有一個
onCreate()
方法,這個方法是一個活動被建立時必定要執行的方法,其中隻有兩行代碼,并且沒有
Hello
World!的字樣。那麼在應用中顯示的
Hello World!
是在哪裡定義的呢?
其實Android程式的設計講究邏輯和視圖分離,是以是不推薦在活動中直接編寫界面的,更加通用的一種做法是:
- 在布局檔案中編寫界面
- 然後在活動中引入進來
可以看到,在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>
複制
可以看到,這裡定義了一個應用程式名的字元串,我們有以下兩種方式來引用它。
- 在代碼中通過
可以獲得該字元串的引用。R.string.app_name
- 在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 Studio
IDE果然已經将安卓開發簡化到“一步到位”。
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'
}
複制
各個部分的作用:
- 第一行應用了一個插件,一般有兩種值可選:com.android.application 表示這是一個應用程式子產品,com.android.library 表示這是一個庫子產品。應用程式子產品和庫子產品的最大差別在于,一個是可以直接運作的,一個隻能作為代碼庫依附于别的應用程式子產品來運作。
- android閉包 ,在這個閉包中我們可以配置項目建構的各種屬性。其内部又有以下兩個包:
- buildTypes閉包中用于指定生成安裝檔案的相關配置,通常隻會有兩個子閉包,一個是debug,一個是release。
- debug閉包用于指定生成測試版安裝檔案的配置,release閉包用于指定生成正式版安裝檔案的配置。另外,debug閉包是可以忽略不寫的,是以我們看到上面的代碼中就隻有一個release閉包。
- dependencies閉包:這個閉包的功能非常強大,它可以指定目前項目所有的依賴關系。通常Android Studio項目一共有3種依賴方式:本地依賴、庫依賴和遠端依賴。
- 本地依賴可以對本地的Jar包或目錄添加依賴關系
- 庫依賴可以對項目中的庫子產品添加依賴關系
- 遠端依賴則可以對jcenter庫上的開源項目添加依賴關系
android閉包的内容分析:
- compileSdkVersion:用于指定項目的編譯版本,這裡指定成24表示使用Android 7.0系統的SDK編譯。
- buildToolsVersion:用于指定項目建構工具的版本,目前最新的版本就是24.0.2,如果有更新的版本時,Android Studio會進行提示。
- defaultConfig閉包:可以對項目的更多細節進行配置。
- applicationId 用于指定項目的包名,前面我們在建立項目的時候其實已經指定過包名了,如果你想在後面對其進行修改,那麼就是在這裡修改的。
- minSdkVersion 用于指定項目最低相容的Android系統版本,這裡指定成15表示最低相容到Android 4.0系統。
- targetSdkVersion 指定的值表示你在該目标版本上已經做過了充分的測試,系統将會為你的應用程式啟用一些最新的功能和特性。比如說Android 6.0系統中引入了運作時權限這個功能,如果你将targetSdkVersion 指定成23或者更高,那麼系統就會為你的程式啟用運作時權限功能,而如果你将targetSdkVersion 指定成22,那麼就說明你的程式最高隻在Android 5.1系統上做過充分的測試,Android 6.0系統中引入的新功能自然就不會啟用了。
- versionCode 用于指定項目的版本号
- versionName 用于指定項目的版本名,這兩個屬性在生成安裝檔案的時候非常重要,我們在後面都會學到。
- release閉包内容分析:
- minifyEnabled 用于指定是否對項目的代碼進行混淆,true 表示混淆,false 表示不混淆。
- proguardFiles 用于指定混淆時使用的規則檔案,這裡指定了兩個檔案:
- 第一個proguard-android.txt 是在Android SDK目錄下的,裡面是所有項目通用的混淆規則
- 第二個proguard-rules.pro 是在目前項目的根目錄下的,裡面可以編寫目前項目特有的混淆規則。需要注意的是,通過Android Studio直接運作項目生成的都是測試版安裝檔案,關于如何生成正式版安裝檔案我們将會在第15章中學習。
dependencies内容分析閉包:
- compile fileTree 就是一個本地依賴聲明,它表示将libs目錄下所有.jar字尾的檔案都添加到項目的建構路徑當中。
- 第二行的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…
- Show only selected application表示隻顯示目前選中程式的日志
- Firebase是谷歌提供的一個分析工具,我們可以不用管它
- 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的世界你可以放下身段,以一隻萌級小菜鳥的身份起飛,在後面的旅途中你會不斷地成長。