《第一行代碼:Android篇》學習筆記(一)

来源:https://www.cnblogs.com/1693977889zz/archive/2022/05/11/16256303.html
-Advertisement-
Play Games

本文和接下來的幾篇文章為閱讀郭霖先生所著《第一行代碼:Android(篇第2版)》的學習筆記,按照書中的內容順序進行記錄,書中的Demo本人全部都做過了。 每一章節本人都做了詳細的記錄,以下是我學習記錄(包含大量書中內容的整理和自己在學習中遇到的各種bug及解決方案),方便以後閱讀和查閱。最後,非常 ...


本文和接下來的幾篇文章為閱讀郭霖先生所著《第一行代碼:Android(篇第2版)》的學習筆記,按照書中的內容順序進行記錄,書中的Demo本人全部都做過了。
每一章節本人都做了詳細的記錄,以下是我學習記錄(包含大量書中內容的整理和自己在學習中遇到的各種bug及解決方案),方便以後閱讀和查閱。最後,非常感激郭霖先生提供這麼好的書籍。

第一章 開始啟程——你的第一行Android代碼

歡迎你來到Android世界!

Android發展時間線:

2003年10月,Andy Rubin等人一起創辦了Android公司;

2005年8月,谷歌收購了該公司,並讓Andy Rubin繼續負責Android項目;

2008年,谷歌終推出了Android系統的第一個版本;

Android的發展受到重重阻撓:

喬布斯自始至終認為Android抄襲iPhone的產品,剽竊了諸多iPhone的創意,並聲稱一定要毀掉Android;

2010年,Linux團隊將基於Linux開發的Android操作系統從Linux內核主線中除名;

甲骨文則針對Android侵犯Java知識產權一事對谷歌提起了訴訟……

谷歌的開放政策:

任何手機廠商和個人都能免費獲取到Android操作系統的源碼,並且可以自由地使用和定製。

三星、HTC、摩托羅拉、索愛等公司都推出了各自系列的Android手機,Android市場上百花齊放。

僅僅推出兩年後,Android就超過了已經霸占市場逾十年的諾基亞Symbian,成為了全球第一大智能手機操作系統。

國內的手機廠商,小米、華為、魅族等新興品牌都推出了相當不錯的Android手機,並且也獲得了市場的廣泛認可.

目前Android已經占據了全球智能手機操作系統70%以上的份額。

1.1 瞭解全貌——Android王國簡介

Android從面世以來到現在已經發佈了二十幾個版本了。谷歌為Android王國建立了一個完整的生態系統。手機廠商、開發者、用戶之間相互依存,共同推進著Android的蓬勃發展。

1.1.1 Android系統架構

Android大致可以分為四層架構:Linux內核層、系統運行庫層、應用框架層和應用層。

1.Linux內核層

Android系統是基於Linux內核的,這一層為Android設備的各種硬體提供了底層的驅動,如顯示驅動、音頻驅動、照相機驅動、藍牙驅動、Wi-Fi驅動、電源管理等。

2.系統運行庫層

這一層通過一些C/C++庫來為Android系統提供了主要的特性支持。如SQLite庫提供了資料庫的支持,OpenGL|ES庫提供了3D繪圖的支持,Webkit庫提供了瀏覽器內核的支持等。

同樣在這一層還有Android運行時庫,它主要提供了一些核心庫,能夠允許開發者使用Java語言來編寫Android應用。另外,Android運行時庫中還包含了Dalvik虛擬機(5.0系統之後改為ART運行環境),它使得每一個Android應用都能運行在獨立的進程當中,並且擁有一個自己的Dalvik虛擬機實例。相較於Java虛擬機,Dalvik是專門為移動設備定製的,它針對手機記憶體、CPU性能有限等情況做了優化處理。

3.應用框架層

這一層主要提供了構建應用程式時可能用到的各種API, Android自帶的一些核心應用就是使用這些API完成的,開發者也可以通過使用這些API來構建自己的應用程式。

4.應用層

所有安裝在手機上的應用程式都是屬於這一層的,比如系統自帶的聯繫人、簡訊等程式,或者是你從Google Play上下載的小游戲,當然還包括你自己開發的程式。

image

1.1.2 Android已發佈的版本

2008年9月,谷歌正式發佈了Android 1.0系統;

隨後的幾年,谷歌以驚人的速度不斷地更新Android系統,2.1、2.2、2.3系統的推出使Android占據了大量的市場;

2011年2月,谷歌發佈了Android 3.0系統,這個系統版本是專門為平板電腦設計的,但也是Android為數不多的比較失敗的版本,推出之後一直不見什麼起色;

在同年的10月,谷歌又發佈了Android 4.0系統,這個版本不再對手機和平板進行差異化區分,既可以應用在手機上,也可以應用在平板上。

2014年Google I/O大會上,谷歌推出了號稱史上版本改動最大的Android 5.0系統,其中使用ART運行環境替代了Dalvik虛擬機,大大提升了應用的運行速度,還提出了Material Design的概念來優化應用的界面設計。除此之外,還推出了Android Wear、Android Auto、Android TV系統,從而進軍可穿戴設備、汽車、電視等全新領域。

2015年GoogleI/O大會上推出了Android 6.0系統,加入運行時許可權功能;

2016年Google I/O大會上推出了Android 7.0系統,加入多視窗模式功能,這也是目前最新的Android系統版本;

查看最新的數據訪問:https://developer.android.google.cn/about/dashboards/

image

1.1.3 Android應用開發特色

Android系統到底提供了哪些東西,可供我們開發出優秀的應用程式。

1.Android系統四大組件

(1)活動(Activity):是所有Android應用程式的門面,凡是在應用中你看得到的東西,都是放在活動中的。

(2)服務(Service):你無法看到它,但它會一直在後臺默默地運行,即使用戶退出了應用,服務仍然是可以繼續運行的。

(3)廣播接收器(Broadcast Receiver):廣播接收器允許你的應用接收來自各處的廣播消息,比如電話、簡訊等,當然你的應用同樣也可以向外發出廣播消息。

(4)內容提供器(Content Provider):為應用程式之間共用數據提供了可能,比如你想要讀取系統電話簿中的聯繫人,就需要通過內容提供器來實現。

2.豐富的系統控制項

Android系統為開發者提供了豐富的系統控制項,使得我們可以很輕鬆地編寫出漂亮的界面。

3.SQLite資料庫

Android系統還自帶了這種輕量級、運算速度極快的嵌入式關係型資料庫。它不僅支持標準的SQL語法,還可以通過Android封裝好的API進行操作,讓存儲和讀取數據變得非常方便。

4.強大的多媒體

Android系統還提供了豐富的多媒體服務,如音樂、視頻、錄音、拍照、鬧鈴,等等,這一切你都可以在程式中通過代碼進行控制,讓你的應用變得更加豐富多彩。

5.地理位置定位

現在的Android手機都內置有GPS,走到哪兒都可以定位到自己的位置,發揮你的想象就可以做出創意十足的應用,如果再結合功能強大的地圖功能,LBS這一領域潛力無限。

1.2 手把手帶你搭建開發環境

1.2.1 準備所需要的工具

  • JDK

    JDK是Java語言的軟體開發工具包,它包含了Java的運行環境、工具集合、基礎類庫等內容。

  • Android SDK

    Android SDK是谷歌提供的Android開發工具包,在開發Android程式時,我們需要通過引入該工具包,來使用Android相關的API。

  • Android Studio

    在很早之前,Android項目都是用Eclipse來開發的,安裝ADT插件後就可以用來開發Android程式了。

    在2013年的時候,谷歌推出了一款官方的IDE工具Android Studio,由於不再是以插件的形式存在,Android Studio在開發Android程式方面要遠比Eclipse強大和方便得多。

1.2.2 搭建開發環境

Android官網下載最新的開發工具,下載地址是:https://developer.android.google.cn/studio/index.html

百度網盤去下載,下載地址是:https://pan.baidu.com/s/1nuABMDb

註意:現在點擊Finish按鈕來啟動Android Studio,一開始會讓你選擇是否導入之前Android Studio版本的配置,由於這是我們首次安裝,這裡選擇不導入就可以了。

image

在點擊Finish按鈕,配置工作就全部完成了。然後Android Studio會嘗試聯網下載一些更新,等待更新完成後再點擊Finish按鈕就會進入Android Studio的歡迎界面

目前為止,Android開發環境就已經全部搭建完成了。

image

1.3 創建你的第一個Android項目

1.3.1 創建HelloWorld項目(註意:Language 選擇Java)

  1. 在Android Studio的歡迎界面點擊Start a newAndroid Studio project;

  2. pplication name表示應用名稱,此應用安裝到手機之後會在手機上顯示該名稱;

  3. Company Domain表示公司功能變數名稱,如果是個人開發者;

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

  5. AndroidStudio會根據應用名稱和公司功能變數名稱來自動幫我們生成合適的包名,如果你不想使用預設生成的包名,也可以點擊右側的Edit按鈕自行修改;

  6. Project location表示項目代碼存放的位置,如果沒有特殊要求的話,這裡也保持預設就可以了;

  7. Android 4.0以上的系統已經占據了超過98%的Android市場份額,因此這裡我們將Minimum SDK指定成API 15就可以了;

  8. Wear、TV和Android Auto這幾個選項分別是用於開發可穿戴設備、電視和汽車程式的;

  9. Android Studio提供了很多種內置模板,剛開始學習,這裡直接選擇Empty Activity來創建一個空的活動就可以了;

    記得:配置環境變數,

    ANDROID_HONE

    C:\用戶\xxxx\AppData\Local\Android\Sdk\platform-tools

1.3.2 啟動模擬器

由於Android Studio自動為我們生成了很多東西,你現在不需要編寫任何代碼,HelloWorld項目就已經可以運行了。但是在此之前還必須要有一個運行的載體,可以是一部Android手機,也可以是Android模擬器。

暫時先使用模擬器來運行程式:

  1. 創建一個Android模擬器,觀察Android Studio頂部工具欄中的圖標

image

  1. Virtual Device Configuration

image

圖:選擇要創建的模擬器設備
  1. 選擇創建Nexus 5X這台設備的模擬器

image

  1. 選擇模擬器所使用的操作系統版本,Download Android 11.0系統。繼續點擊Next

image

  1. 確認模擬器配置

    以對模擬器的一些配置進行確認,比如說指定模擬器的名字、解析度、橫豎屏等信息,如果沒有特殊需求的話,全部保持預設就可以了。

image

  1. 完成模擬器的創建,然後會彈出如圖

image

  1. 點擊Actions欄目中最左邊的三角形按鈕即可啟動模擬器

image

1.3.3 運行HelloWorld

Android Studio頂部工具欄中的圖標,三角形按鈕是用來運行項目的。

image

運行結果:(像使用手機一樣,按住滑鼠向上劃、向下劃),Android Studio太智能了

image

1.3.4 分析你的第一個Android程式

  1. HelloWorld項目(Android模式的項目結構)

image

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

  1. 點擊圖中的Android區域可以切換項目結構模式

image

  1. 將項目結構模式切換成Project,這就是項目真實的目錄結構

image

(1).gradle和.idea

這兩個目錄下放置的都是AndroidStudio自動生成的一些文件,我們無須關心,也不要去手動編輯。

(2)app

項目中的代碼、資源等內容幾乎都是放置在這個目錄下的,我們後面的開發工作也基本都是在這個目錄下進行的。

(3)build

它主要包含了一些在編譯時自動生成的文件。

(4)gradle

包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前將gradle下載好,而是會自動根據本地的緩存情況決定是否需要聯網下載gradle。

Android Studio預設沒有啟用gradle wrapper的方式,如果需要打開,可以點擊Android Studio導航欄→File→Settings→Build, Execution,Deployment→Gradle,進行配置更改。

(5).gitignore

這個文件是用來將指定的目錄或文件排除在版本控制之外的。

(6)build.gradle

項目全局的gradle構建腳本,通常這個文件中的內容是不需要修改的。

(7)gradle.properties

這個文件是全局的gradle配置文件,在這裡配置的屬性將會影響到項目中所有的gradle編譯腳本。

(8)gradlew和gradlew.bat

這兩個文件是用來在命令行界面中執行gradle命令的,其中gradlew是在Linux或Mac系統中使用的,gradlew.bat是在Windows系統中使用的。

(9)HelloWorld.iml

iml文件是所有IntelliJ IDEA項目都會自動生成的一個文件(Android Studio是基於IntelliJ IDEA開發的),用於標識這是一個IntelliJ IDEA項目,我們不需要修改這個文件中的任何內容。

(10)local.properties

這個文件用於指定本機中的AndroidSDK路徑,通常內容都是自動生成的,我們並不需要修改。

除非你本機中的Android SDK位置發生了變化,那麼就將這個文件中的路徑改成新的位置即可。

(11)settings.gradle

這個文件用於指定項目中所有引入的模塊。由於HelloWorld項目中就只有一個app模塊,因此該文件中也就只引入了app這一個模塊。

image

通常情況下模塊的引入都是自動完成的,需要我們手動去修改這個文件的場景可能比較少。

整個項目的外層目錄結構,除了app目錄之外,大多數的文件和目錄都是自動生成的,我們並不需要進行修改。下麵我們就來對app目錄下的內容進行更為詳細的分析。

image

(1)build

這個目錄和外層的build目錄類似,主要也是包含了一些在編譯時自動生成的文件,不過它裡面的內容會更加更雜,我們不需要過多關心。

(2)libs

項目中使用到了第三方jar包,就需要把這些jar包都放在libs目錄下,放在這個目錄下的jar包都會被自動添加到構建路徑里去。

(3)androidTest

用來編寫Android Test測試用例的,可以對項目進行一些自動化測試。

(4)java

所有Java代碼的地方,展開該目錄,你將看到我們剛纔創建的HelloWorldActivity文件就在裡面。

(5)res

你在項目中使用到的所有圖片、佈局、字元串等資源都要存放在這個目錄下。這個目錄下還有很多子目錄,圖片放在drawable目錄下,佈局放在layout目錄下,字元串放在values目錄下,所以你不用擔心會把整個res目錄弄得亂糟糟的。

(6)AndroidManifest.xml

整個Android項目的配置文件,程式中定義的所有四大組件都需要在這個文件里註冊,另外還可以在這個文件中給應用程式添加許可權聲明。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zhouzhou">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.HelloWorld">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

(7)test

用來編寫Unit Test測試用例的,是對項目進行自動化測試的另一種方式。

(8).gitignore

用於將app模塊內的指定的目錄或文件排除在版本控制之外,作用和外層的.gitignore文件類似。

(9)app.iml

IntelliJ IDEA項目自動生成的文件,我們不需要關心或修改這個文件中的內容。

(10)build.gradle

app模塊的gradle構建腳本,這個文件中會指定很多項目構建相關的配置。

(11)proguard-rules.pro

用於指定項目代碼的混淆規則,當代碼開發完成後打成安裝包文件,如果不希望代碼被別人破解,通常會將代碼進行混淆,從而讓破解者難以閱讀。

詳細解析:

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

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

intent-filter里的兩行代碼非常重要:

表示MainActivity是這個項目的主活動,在手機上點擊應用圖標,首先啟動的就是這個活動。

而在Android四大組件的時候說過,活動是Android應用程式的門面,凡是在應用中你看得到的東西,都是放在活動中的。

打開MainActivity代碼如下所示:

package com.zhouzhou;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

//MainActivity是繼承自AppCompatActivity的,這是一種向下相容的Activity,可以將Activity在各個系統版本中增加的特性和功能最低相容到Android 2.1系統。
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
  • Activity是Android系統提供的一個活動基類,我們項目中所有的活動都必須繼承它或者它的子類才能擁有活動的特性(AppCompatActivity是Activity的子類)。
  • MainActivity中有一個onCreate()方法,這個方法是一個活動被創建時必定要執行的方法,其中只有兩行代碼,並且沒有Hello World!的字樣。
  • Android程式的設計講究邏輯和視圖分離,因此是不推薦在活動中直接編寫界面的,更加通用的一種做法是,在佈局文件中編寫界面,然後在活動中引入進來。
  • 在onCreate()方法的第二行調用了setContentView()方法,就是這個方法給當前的活動引入了一個activity_main佈局,那HelloWorld!一定就是在這裡定義的了!

佈局文件都是定義在res/layout目錄下的,當你展開layout目錄,你會看到activity_main.xml這個文件。(我是直接在代碼上按住Ctrl鍵,滑鼠定位到setContentView(R.layout.activity_main)中的activity_main,點擊即可進入)

註意:遇到一個小插曲,打開activity_main.xml顯示的是視圖,不是代碼?

快捷鍵:Alt+Shift+左右箭頭(第一個圖標是顯示代碼)

image

activity_main.xml代碼如下:

<?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>

終於找到了,原來就是通過android:text="Hello World!" 這句代碼定義的Hello World!的字樣。

1.3.5 詳解項目中的資源

(1)res目錄

image

歸納一下:

  • 所有以drawable開頭的文件夾都是用來放圖片
  • 所有以mipmap開頭的文件夾都是用來放應用圖標
  • 所有以values開頭的文件夾都是用來放字元串樣式顏色等配置的
  • layout文件夾是用來放佈局文件的

註:之所以有這麼多mipmap開頭的文件夾,是為了讓程式能夠更好地相容各種設備。

drawable文件夾也是相同的道理。Android Studio沒有幫我們自動生成,但是我們應該自己創建drawable-hdpi、drawable-xhdpi、drawable-xxhdpi等文件夾。

在製作程式的時候最好能夠給同一張圖片提供幾個不同解析度的版本,分別放在這些文件夾下,然後當程式運行的時候,會自動根據當前運行設備解析度的高低選擇載入哪個文件夾下的圖片。

當然這隻是理想情況,更多的時候美工只會提供給我們一份圖片,這時你就把所有圖片都放在drawable-xxhdpi文件夾下就好了。

(2)strings.xml文件

打開res/values/strings.xml文件:

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

這裡定義了一個應用程式名的字元串,我們有以下兩種方式來引用它:

  • 在代碼中通過R.string.app_name可以獲得該字元串的引用;
  • 在XML中通過@string/app_name可以獲得該字元串的引用

其中string部分是可以替換的,如果是引用的圖片資源就可以替換成drawable,如果是引用的應用圖標就可以替換成mipmap,如果是引用的佈局文件就可以替換成layout,以此類推。

語法練習:打開AndroidManifest.xml

......
<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.HelloWorld">
        ......
    </application>

1.3.6 詳解build.gradle文件

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

HelloWorld項目中有兩個build.gradle文件,一個是在最外層目錄下的,一個是在app目錄下的。這兩個文件對構建AndroidStudio項目都起到了至關重要的作用。

  • 最外層目錄下的build.gradle文件:
// Top-level build file where you can add configuration options common to all sub-projects/modules.頂層構建文件,您可以在其中添加所有子項目/模塊通用的配置選項。
plugins {
    id 'com.android.application' version '7.1.0' apply false
    id 'com.android.library' version '7.1.0' apply false
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
  • app目錄下的build.gradle文件:
plugins {
    
    id 'com.android.application'
    /**
    *com.android.application表示這是一個應用程式模塊
    *com.android.library表示這是一個庫模塊
    *應用程式模塊和庫模塊的最大區別在於,一個是可以直接運行的,一個只能作為代碼庫依附於別的應用程式模塊來運行。
    **/
}
//下麵是一個大的android閉包,可以配置項目構建的各種屬性。
android {
    //compileSdk用於指定項目的編譯版本,32表示使用Android 11.0系統的SDK編譯(24表示使用Android 7.0系統的SDK編譯)。
    compileSdk 32
   //在android閉包中又嵌套了一個defaultConfig閉包
    defaultConfig {
        //包名,後期想改可以在這裡更改
        applicationId "com.zhouzhou"
        //minSdk用於指定項目最低相容的Android系統版本
        minSdk 21
        //targetSdk指定的值表示你在該目標版本上已經做過了充分的測試,系統將會為你的應用程式啟用一些最新的功能和特性。
        targetSdk 32
        //versionCode用於指定項目的版本號
        versionCode 1
        //versionName用於指定項目的版本名,和versionCode一樣,在生成安裝文件的時候非常重要
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    //buildTypes閉包,用於指定生成安裝文件的相關配置,通常只會有兩個子閉包,一個是debug,一個是release。release閉包用於指定生成正式版安裝文件的配置。另外,debug閉包是可以忽略不寫的,因此我們看到上面的代碼中就只有一個release閉包。
    buildTypes {
        release {
            //minifyEnabled用於指定是否對項目的代碼進行混淆,true表示混淆,false表示不混淆。
            minifyEnabled false
            /**
            *第一個proguard-android.txt是在Android SDK目錄下的,裡面是所有項目通用的混淆規則。
            *第二個proguard-rules.pro是在當前項目的根目錄下的,裡面可以編寫當前項目特有的混淆規則。
            *需要註意的是,通過Android Studio直接運行項目生成的都是測試版安裝文件,關於如何生成正式版安裝文件我們將會在第15章中學習。
            **/
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
//dependencies閉包,它可以指定當前項目所有的依賴關係。通常Android Studio項目一共有3種依賴方式:本地依賴、庫依賴和遠程依賴。
//本地依賴可以對本地的Jar包或目錄添加依賴關係,庫依賴可以對項目中的庫模塊添加依賴關係,遠程依賴則可以對jcenter庫上的開源項目添加依賴關係。
dependencies {

    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

1.4 前行必備——掌握日誌工具的使用

Android中日誌工具的使用方法,這對以後的Android開發之旅會有極大的幫助。

1.4.1 使用Android的日誌工具Log

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高一級。

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

package com.zhouzhou;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

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

小插曲:No connected device 解決:以管理員的方式運行AS

解決問題的博客地址:https://blog.csdn.net/qq_35605213/article/details/93891176

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

image

1.4.2 為什麼使用Log而不使用System.out

在真正的項目開發中,是極度不建議使用System.out.println()方法的!如果你在公司的項目中經常使用這個方法,就很有可能要挨罵了。

這個方法除了使用方便一點之外,其他就一無是處了。缺點太多了,比如日誌列印不可控制、列印時間無法確定、不能添加過濾器、日誌沒有級別區分……Log對以上談不上絕對好,但是已經做的相當不錯了。

除了Log.v()、Log.d()、Log.i()、Log.w()、Log.w()之外,logcat中還能很輕鬆地添加過濾器:

image

目前只有3個過濾器:

  • Show only selected application表示只顯示當前選中程式的日誌;
  • Firebase是谷歌提供的一個分析工具,我們可以不用管它;
  • NoFilters相當於沒有過濾器,會把所有的日誌都顯示出來;

我們也可以自己添加一個過濾器試試:

image

點擊圖Edit Filter Configuration,會彈出一個過濾器配置界面。給過濾器起名叫Myfilter,並且讓它對名為data的tag進行過濾,嘗試在onCreate()方法中把列印日誌的語句改成Log.d("data", "onCreate execute"),然後再次運行程式,你就會在data過濾器下看到這行日誌了。

image

logcat中的日誌級別控制,有5個方法:

image

日誌級別控制的好處就是,你可以很快地找到你所關心的那些日誌。最後,看一下關鍵字過濾。如果使用過濾器加日誌級別控制還是不能鎖定到你想查看的日誌內容的話,那麼還可以通過關鍵字進行進一步的過濾。

image

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

個人學習筆記,針對本人在自學中遇到的問題。


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

-Advertisement-
Play Games
更多相關文章
  • 19c單實例配置GoldenGate 併進行用戶數據同步測試 當前數據使用的是經典模式配置GoldenGate 進行數據同步,關於容器資料庫配置GoldenGate 請參閱: Configuring Oracle GoldenGate in a Multitenant Container Datab ...
  • 離線CDH集群自動化部署工具 離線CDH集群安裝與部署的自動化腳本工具,簡單支持「離線一鍵裝機」。 腳本將對系統配置做出一定修改,使用前請務必確認當前伺服器無其他人員、任務使用,以免造成不必要的麻煩,建議提前使用測試伺服器或虛擬機測試體驗。 一、Features 已實現的自動化功能(僅支持Redha ...
  • 一、引言 需求描述:現實工作中,有一些很特別的需求:在一個彙總表中,需要顯示明細數據。因為是在彙總表中,所以明細數據只能顯示在某一列中,這個列,就是多行數據合併為一行之後的結果。 案例描述:比如,在物料凈需求表中,需求量扣減庫存量、在途量等等之後,結果為剩餘量,剩餘量為負則需要採購。此時,不管剩餘量 ...
  • 5月中國資料庫排行榜已出爐!各大資料庫廠商表現如何?排名有何變化?一起來解讀吧! ...
  • 本文和接下來的幾篇文章為閱讀郭霖先生所著《第一行代碼:Android(篇第2版)》的學習筆記,按照書中的內容順序進行記錄,書中的Demo本人全部都做過了。 每一章節本人都做了詳細的記錄,以下是我學習記錄(包含大量書中內容的整理和自己在學習中遇到的各種bug及解決方案),方便以後閱讀和查閱。最後,感激 ...
  • 本文和接下來的幾篇文章為閱讀郭霖先生所著《第一行代碼:Android(篇第2版)》的學習筆記,按照書中的內容順序進行記錄,書中的Demo本人全部都做過了。 每一章節本人都做了詳細的記錄,以下是我學習記錄(包含大量書中內容的整理和自己在學習中遇到的各種bug及解決方案),方便以後閱讀和查閱。最後,感激 ...
  • 本文和接下來的幾篇文章為閱讀郭霖先生所著《第一行代碼:Android(篇第2版)》的學習筆記,按照書中的內容順序進行記錄,書中的Demo本人全部都做過了。 每一章節本人都做了詳細的記錄,以下是我學習記錄(包含大量書中內容的整理和自己在學習中遇到的各種bug及解決方案),方便以後閱讀和查閱。最後,感激 ...
  • 本文和接下來的幾篇文章為閱讀郭霖先生所著《第一行代碼:Android(篇第2版)》的學習筆記,按照書中的內容順序進行記錄,書中的Demo本人全部都做過了。 每一章節本人都做了詳細的記錄,以下是我學習記錄(包含大量書中內容的整理和自己在學習中遇到的各種bug及解決方案),方便以後閱讀和查閱。最後,感激 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...