• 《第一行代码:Android篇》学习笔记(一)


    本文和接下来的几篇文章为阅读郭霖先生所著《第一行代码: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

    输入框里输入关键字的内容,这样只有符合关键字条件的日志才会显示出来,从而能够快速定位到任何你想查看的日志。另外还有一点需要注意,关键字过滤是支持正则表达式的,有了这个特性,我们就可以构建出更加丰富的过滤条件。

  • 相关阅读:
    Servlet3.0之五:servlet3.0下的web.xml
    RESTLET开发实例(二)使用Component、Application的REST服务
    并发容器之ConcurrentLinkedDeque
    script的onerror事件支持情况调查
    纯CSS后台框架
    浏览器对width与height的最大值限制
    DOM系统中的各种队列
    跨域的异步请求四
    JSON parse在各浏览器的兼容性列表
    在IE6~8下创建HTML5新标签
  • 原文地址:https://www.cnblogs.com/1693977889zz/p/16256303.html
Copyright © 2020-2023  润新知