【安卓基础1】初识Android

🏆作者简介:|康有为| ,大四在读,目前在小米安卓实习,毕业入职

🏆本文收录于  安卓学习大全,欢迎关注

🏆安卓学习资料推荐:

        视频:b站搜动脑学院 视频链接 (他们的视频后面一部分没再更新,看看前面也挺好的)

        书籍:《第一行代码》(第3版) by 郭霖 (z-lib.org)

        思维导图: https://www.processon.com/view/link/62427cb2e0b34d0730e20e00(来自动脑学院)

目录

一、创建HelloWorld程序

二、分析HelloWorld程序

目录分析

HelloWorld程序怎么启动的?

1.看配置文件AndroidManifest.xml

2.看MainActivity

3.看activity_main.xml

三、详解项目中的资源

如何使用资源

四、详解Gradle

Gradle介绍

自动化构建工具有哪些?

build.gradle

五、日志

六、AndroidStudio 操作


一、创建HelloWorld程序

前提:下载好了AndroidStudio(我用的是刺猬版)

直接 new project,选择Empty Views Activity (很多教程说的是创建Empty Activity, 老版本AndroidStudio的Empty Activity = 新版本AndroidStudio的 Empty Views Activity,所以这里选择 Empty Views Activity)

语言选择java

点击Finish,等待一会

这里切换成Project

点击启动按钮,就能在虚拟手机上看到HelloWorld了(虚拟机配置一下,好像新版本是自带了一个虚拟机,直接就能用)

二、分析HelloWorld程序

目录分析

将项目结构模式切换成Project,这就是项目真实的目录结构了。

除了app目录之外,大多数的文件和目 录是自动生成的,我们并不需要进行修改。app目录下的内容才是我们以后 的工作重点

HelloWorld程序怎么启动的?

1.看配置文件AndroidManifest.xml

首先打开AndroidManifest.xml文件,从中可以找到如下代码:

这段代码表示对MainActivity进行注册,没有在AndroidManifest.xml里注册的Activity是不 能使用的。

其中intent-filter里的两行代码非常重要, 它们 表示MainActivity是这个 项目的Activity,在手机上点击应用图标,首先启动的就是这个Activity。

那MainActivity具体又有什么作用呢?Android四大组件,Activity是 Android应用程序的门面,凡是在应用中你看得到的东西,都是放在Activity中的。

2.MainActivity

打开MainActivity文件,如下图

首先可以看到,MainActivity是继承自AppCompatActivity的。AppCompatActivity是 AndroidX中提供的一种向下兼容的Activity,可以使Activity在不同系统版本中的功能保持一 致性。而Activity类是Android系统提供的一个基类,我们项目中所有自定义的Activity都必须 继承它或者它的子类才能拥有Activity的特性(AppCompatActivity是Activity的子类)。

然后可以看到MainActivity中有一个onCreate()方法,这个方法是一个Activity被创建时必定要 执行的方法,其中只有两行代码,并且没有“Hello World! ”的字样。那么程序显示 的“Hello World! ”是在哪里定义的呢?

3.activity_main.xml

布局文件都是定义在res/layout目录下的,当你展开layout目录,你会看到 activity_main.xml这个文件。打开该文件并切换到Text视图。

点击下图按钮切换Test视图

看到上面代码中有一个 TextView,这是Android系统提供的一个控件,用于在布局中显示文字。

终于 看到了 “HelloWorld”字样!

三、详解项目中的资源

如果你展开res目录看一下

所有 以“drawable”开头的目录都是用来放图片

所有 以“mipmap”开头的目录都是用来放应用图标

所有 以“values”开头的目录都是用来放字符串、样式、颜色等配置的

所有 以“layout”开头的目录都是用来放布局文件的。

之所以有这么多“mipmap”开头的目录,其实主要是为了让程序能够更好地兼容各种设备。 drawable目录也是相同的道理,虽然Android Studio没有帮我们自动生成,但是我们应该自 己创建drawable-hdpi、drawable-xhdpi、drawable-xxhdpi等目录。在制作程序的时候, 最好能够给同一张图片提供几个不同分辨率的版本,分别放在这些目录下,然后程序运行的时 候,会自动根据当前运行设备分辨率的高低选择加载哪个目录下的图片。当然这只是理想情 况,更多的时候美工只会提供给我们一份图片,这时你把所有图片都放在drawable-xxhdpi目 录下就好了,因为这是最主流的设备分辨率目录。

如何使用资源

知道了res目录下每个子目录的含义,我们再来看一下如何使用这些资源吧。

打开 res/values/strings.xml文件,内容如下所示:

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

可以看到,这里定义了一个应用程序名的字符串,我们有以下两种方式来引用它。

 在代码中通过R.string.app_name可以获得该字符串的引用。

 在XML中通过@string/app_name可以获得该字符串的引用。

基本的语法就是上面这两种方式,其中string部分是可以替换的,如果是引用的图片资源就可 以替换成drawable,如果是引用的应用图标就可以替换成mipmap,如果是引用的布局文件就 可以替换成layout,以此类推。

下面举一个简单的例子来帮助你理解,打开AndroidManifest.xml文件,找到如下代码:

    android:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.HelloWorldJava"

其中,HelloWorld项目的应用图标就是通过android:icon属性指定的,应用的名称则是通过 android:label属性指定的。可以看到,这里对资源引用的方式正是我们刚刚学过的在XML中 引用资源的语法。

四、详解Gradle

Gradle介绍

gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具

所谓的构建过程就是:编译,测试,依赖管理,打包,部署。以前我们开发是手动导入jar包的,类似于面向过程,一步一步来,缺什么包就导什么包,很麻烦,容易出错,jar包版本还不统一,需要关心jar包与jar包之间的依赖。通过采用gradle的构建方式,只需通过complie xxxxx引入一个jar包,然后这个jar包所依赖的其他jar包gradle会自动帮引入,无需关心jar包与jar包之间的依赖,在什么地方以什么形式引入外部jar包,都委托给gradle管理了,体现了面象对象的思想,无需关心内部实现过程,直接引入就可。(注意Gradle不是一种编程语言,它不能帮你实现软件中的任何实际功能)

Android studio的默认插件是Gradle,或许是因为Gradle编译速度比Maven 快很多,而且Gradle完全兼容kotlin语言。当我们新建一个android 项目,gradle已经默认配置好了。

打开gradle-wrapper.properties文件,查看配置信息:可以看到distributionUrl=https://services.gradle.org/distributions/gradle-5.1.1-all.zip说明默认使用的是gradle 5.1.1 的版本,当然可以改成我们本地有的版本,distributionUrl=file:///+gradle的本地路径,例如:distributionUrl=file:///c:/tools/gradle-5.6.4.zip就可以了。 android gradle插件详解地址:https://developer.android.com/studio/releases/gradle-plugin?hl=zh-cn

自动化构建工具有哪些?

Ant 2000年诞生,主要是编译代码,测试代码。

Maven 2007年诞生,主要是编译测试,依赖管理。

Gradle 2012年诞生 主要是是编译测试,依赖管理,DSL自定义扩展任务。

build.gradle

build.gradle文件分别在项目目录下和对应module目录都有存在。

下图是项目目录下的build.gradle:

接下来是module目录的build.gradle:

module目录下的的build.gradle里的dependencies {…}里面的依赖,是单单一个模块本身所需的依赖!是程序运行的编译依赖。

在External Libraries文件夹下,如图

可以看到项目添加的所有依赖,包括子依赖都会显示在里面。除build.gradle里的dependencies {…}里面添加的依赖之外的依赖都是子依赖。

子依赖都是gradle智能自动的帮你添加的,它检查到你主动添加的依赖,又依赖于其他依赖,就会帮你加上。另外当gradle检查到依赖间有冲突时,出现依赖间多次引用相同jar包(只能将库里的源码打进去,而资源什么的不能打进去)、aar包(自动的将资源文件和源码一起打进去,不用担心资源缺失的问题),它只会默认选择版本较高的添加,不会重复添加。这就是gradle出色的依赖管理。

切换成显示代码

五、日志

Android的日志工具Log

打开MainActivity,在onCreate()方法中添加一行打印日志的语句,如下所示:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//日志Log.d("MainActivity", "onCreate execute");}
}

Log.d()方法中传入了两个参数:

第一个参数是tag,一般传入当前的类名就好,主要用于对 打印信息进行过滤;

第二个参数是msg,即想要打印的具体内容。

重新启动后看到日志输出

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

为什么用Log不用println()

在真正的项目开发中, 是极度不建议使用System.out.println()或println()方法的,如果你在公司的项目中经 常使用这两个方法来打印日志的话,就很有可能要挨骂了。

为什么System.out.println()和println()方法会这么不受待见呢?经过我仔细分析之 后,发现这两个方法除了使用方便一点之外,其他就一无是处了。方便在哪儿呢?在Android Studio中你只需要输入“sout”,然后按下代码提示键,方法就会自动出来了,相信这也是很多 Java新手对它钟情的原因。那缺点又在哪儿了呢?这个就太多了,比如日志开关不可控制、不能添加日志标签、日志没有级别区分……

Logcat中的过滤器

目前只有3个过滤器,Show only selected application表示只显示当前选中程序的日志; Firebase是Google提供的一个开发者工具和基础架构平台,我们可以不用管它;No Filters相当于没有过滤器,会把所有的日志都显示出来。那可不可以自定义过滤器呢?当然可以,我们 现在就来添加一个过滤器试试。

新版本筛选方式:

新版Android Studio Logcat 筛选日志

六、AndroidStudio 操作

创建模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/695683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git笔记——2

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、撤销修改__情况一 二、撤销修改__情况二 三、撤销修改__情况三 四、删除文件 五、理解分支 六、创建、切换和合并分支初体验 七、删除分支 八、合并冲突 总…

idea maven创建kotlin项目

第一步&#xff1a;打开idea 第二步&#xff1a;添加依赖 <repositories><repository><id>mavenCentral</id><url>https://repo1.maven.org/maven2/</url></repository></repositories><build><sourceDirectory>…

ElasticSearch DSL查询、排序 、分页的原理及语法

1. DSL查询分类和基本语法 ElasticSearch提供了基于Json的DSL来定义查询&#xff0c;常见的查询类型包括&#xff1a; • 查询所有&#xff1a;查询出所有数据&#xff0c;一般测试用&#xff0c;一般不是查出所有&#xff0c;一次性查询20条。例如 match_all • 全文检索(ful…

【webrtc】m77 PacedSender

mediasoup是m77的代码,m77的代码并没有paced controller ,而且与paced sender 的逻辑混在了一起。结合大神们的代码分析,对照m77 进行 理解。m77 有ProbeController。给pacersender 更新飞行数据:PacedSender::InsertPacket(size_t bytes) 对应的是 PacingController::OnPa…

虹科技术丨PTP时钟源设备全攻略:从普通时钟到透明时钟的进阶之路

来源&#xff1a;虹科工业智能互联 虹科技术丨PTP时钟源设备全攻略&#xff1a;从普通时钟到透明时钟的进阶之路 原文链接&#xff1a;https://mp.weixin.qq.com/s/ArBtuLpU6mXax4QWmZDKfQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #PTP #普通时钟 #透明时钟 …

区块链笔记(五)---德勤相关分析报告

web3.0 定义&#xff1a; 在《Insights into a Modern World》提出&#xff0c;“信息将由用户自己发布、保管、不可追溯且永远不会泄露&#xff0c;用户的任何行为将不需要任何中间机构来帮助传递”&#xff1b;用来指代一种区块链技术&#xff0c;可以基于“无须信任的交互…

解决用户留存难!复购低! 作为企业家的你可以看看!

工会排队模式详解 在互联网营销的大潮中&#xff0c;各种促销模式层出不穷&#xff0c;但真正能够吸引消费者并实现双赢的却寥寥无几。工的会排队模式便是在这一背景下应运而生&#xff0c;它巧妙地结合了工会积分、奖金池和排队机制&#xff0c;为消费者和商家带来了全新的体…

助力探索社交出海最短变现路径,融云 1V1 音视频「限时免费」

在社交赛道&#xff0c;1V1 业务是最好的切入点。 对于初创公司来说&#xff0c;1V1 业务的技术成本和运营成本相对可控&#xff0c;并且具备与秀场直播等业务融合拓展的巨大空间。未来&#xff0c;相信 1V1 业务会吸引更多开发者投身其中。 一位社交出海经验丰富的从业者曾在…

PHP+vue+mysql校园论坛bbs系统w076f-

本文尝试以B/S架构设计模式中的vue框架&#xff0c;php语言为基础&#xff0c;通过必要的编码处理、BBS论坛系统整体框架、功能服务多样化和有效性的高级经验和技术实现方法&#xff0c;旨在完成一个快速、高效、便捷的BBS论坛系统。本系统以用户与管理员两类人&#xff0c;作为…

【力扣 - 二叉树的直径】

题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 提示&#xff1a; 树中节点数目在范围 [1, 10000] 内…

【最新Dubbo3深入理解】Dubbo3核心Tripple协议详解

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

区块链游戏解说:什么是 Planet IX

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;Planet IX Dashboard 什么是 Planet IX Planet IX&#xff0c;一个由原生 IX TOKEN 推动的 Web3 玩赚平台。作为一款 GameFi 策略游戏&#xff0c; Planet IX 上的每项资…

C语言字符串函数strchr与strrchr

注意&#xff1a; 这两个函数的功能&#xff0c;都是在指定的字符串 s 中&#xff0c;试图找到字符 c。strchr() 从左往右找&#xff0c;strrchr() 从右往左找。字符串结束标记 ‘\0’ 被认为是字符串的一部分。 示例 char *p;p strchr("www.qq.com", .); // 从左…

python自动化接口测试

前几天&#xff0c;同组姐妹说想要对接口那些异常值进行测试&#xff0c;能否有自动化测试的方法。仔细想了一下&#xff0c;工具还挺多&#xff0c;大概分析了一下&#xff1a; 1、soapui:可以对接口参数进行异常值参数化&#xff0c;可以加断言&#xff0c;一般我们会加http…

如何申请试用Gemini 1.5 Pro

https://developers.googleblog.com/2024/02/gemini-15-available-for-private-preview-in-google-ai-studio.html 我开发的chatgpt网站&#xff1a; https://chat.xutongbao.top

浅谈数字信号处理器的本质与作用:从定义、原理到应用场景

数字信号处理器&#xff08;DSP&#xff09;作为一种关键的电子元件&#xff0c;在通信、音频、图像处理等领域扮演着不可或缺的角色。然而&#xff0c;对于许多人来说&#xff0c;数字信号处理器的概念可能依然模糊&#xff0c;其作用和原理也许并不为人所熟知。因此&#xff…

”戏说“ 交换机 与 路由器

一般意义上说 老哥 这文章发表 的 东一榔头 西一锤 呵呵&#xff0c; 想到哪里就啰嗦到哪里 。 交换机&#xff1a; 其实就是在通道交换 路由器&#xff1a; 不光是在通道交换还要在协议上交换 下图你看懂了吗&#xff1f; &#xff08;仅仅数据交换-交换机 协议…

Bert基础(三)--位置编码

背景 还是以I am good&#xff08;我很好&#xff09;为例。 在RNN模型中&#xff0c;句子是逐字送入学习网络的。换言之&#xff0c;首先把I作为输入&#xff0c;接下来是am&#xff0c;以此类推。通过逐字地接受输入&#xff0c;学习网络就能完全理解整个句子。然而&#x…

Eclipse的Java Project的入口main函数

在使用Eclipse创建java project项目的时候&#xff0c;一个项目里面通常只有一个main&#xff0c;那么一个项目里面是否可以有多个main函数呢&#xff1f;其实可以的&#xff0c;但是运行java application的时候要选择执行哪个main函数。 下面举个例子&#xff1a; 1、创建一个…

(二十二)Flask之上下文管理第三篇【收尾—讲一讲g】

目录&#xff1a; 每篇前言&#xff1a;g到底是什么&#xff1f;生命周期在请求周期内保持数据需要注意的是&#xff1a; 拓展—面向对象的私有字段深入讲解一下那句&#xff1a; 每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域…