主頁 > 移動端開發 > 《第一行代碼:Android篇》學習筆記(一)

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

2022-05-11 08:43:00 移動端開發

本文和接下來的幾篇文章為閱讀郭霖先生所著《第一行代碼: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_
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_
        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

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

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472338.html

標籤:其他

上一篇:如何基于 ZEGO SDK 實作 iOS 變聲/混響/立體聲

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

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more