当前位置: 首页 > news >正文

【安卓基础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 操作

创建模块

相关文章:

【安卓基础1】初识Android

&#x1f3c6;作者简介&#xff1a;|康有为| &#xff0c;大四在读&#xff0c;目前在小米安卓实习&#xff0c;毕业入职。 &#x1f3c6;安卓学习资料推荐&#xff1a; 视频&#xff1a;b站搜动脑学院 视频链接 &#xff08;他们的视频后面一部分没再更新&#xff0c;看看前面…...

08-静态pod(了解即可,不重要)

我们都知道&#xff0c;pod是kubelet创建的&#xff0c;那么创建的流程是什么呐&#xff1f; 此时我们需要了解我们k8s中config.yaml配置文件了&#xff1b; 他的存放路径&#xff1a;【/var/lib/kubelet/config.yaml】 一、查看静态pod的路径 [rootk8s231 ~]# vim /var/lib…...

PROBIS铂思金融破产后续:ASIC牌照已注销

2024年1月31日&#xff0c;PROBIS铂思金融的澳大利亚ASIC牌照 (AFSL 338241) 被注销《差价合约经纪商PROBIS宣布破产&#xff0c;澳大利亚金融服务牌照遭暂停》&#xff0c;这也就意味着&#xff0c;PROBIS铂思金融目前已经没有任何金融牌照。 值得注意的是&#xff0c;时至今日…...

数字世界的探索者:计算机相关专业电影精选推荐

目录 推荐计算机专业必看的几部电影 《黑客帝国》 《社交网络》 《乔布斯传》 《心灵捕手》 《源代码》 《盗梦空间》 《头号玩家》 《我是谁&#xff1a;没有绝对安全的系统》 《战争游戏》(WarGames) 《模仿游戏》(The Imitation Game) 《硅谷》(Silicon Valley) …...

Spring Boot项目中TaskDecorator的应用实践

一、前言 TaskDecorator是一个执行回调方法的装饰器&#xff0c;主要应用于传递上下文&#xff0c;或者提供任务的监控/统计信息&#xff0c;可以用于处理子线程与主线程间数据传递的问题。 二、开发示例 1.自定义TaskDecorator import org.springframework.core.task.Task…...

511. 游戏玩法分析 I

文章目录 题意思路代码 题意 题目链接 统计每个用户第一次登陆平台时间 思路 代码 select player_id, min(event_date) as first_login from Activity group by player_id;...

大模型训练流程(三)奖励模型

为什么需要奖励模型 因为指令微调后的模型输出可能不符合人类偏好&#xff0c;所以需要利用强化学习优化模型&#xff0c;而奖励模型是强化学习的关键一步&#xff0c;所以需要训练奖励模型。 1.模型输出可能不符合人类偏好 上一篇讲的SFT只是将预训练模型中的知识给引导出来…...

替换if...else的锦囊妙计

目录 前言 一、又臭又长的if...else 二、消除if...else的锦囊妙计 1、使用注解 2、动态拼接名称 3、模板方法判断 4.策略工厂模式 5.责任链模式 6、其他的消除if...else的方法 1.根据不同的数字返回不同的字符串 2.集合中的判断 3.简单的判断 4.spring中的判断 原文…...

新建一个flask项目

在Flask中创建一个新的项目&#xff0c;您可以遵循以下步骤&#xff1a; 确保您已经安装了Python环境。如果还未安装Flask&#xff0c;可以通过pip来安装&#xff1a; pip install flask创建一个新的文件夹作为您的项目文件夹&#xff0c;例如myflaskapp&#xff1a; mkdir …...

【Linux 内核源码分析】物理内存组织结构

多处理器系统两种体系结构&#xff1a; 非一致内存访问&#xff08;Non-Uniform Memory Access&#xff0c;NUMA&#xff09;&#xff1a;这种体系结构下&#xff0c;内存被划分成多个内存节点&#xff0c;每个节点由不同的处理器访问。访问一个内存节点所需的时间取决于处理器…...

力扣日记2.21-【回溯算法篇】46. 全排列

力扣日记&#xff1a;【回溯算法篇】46. 全排列 日期&#xff1a;2023.2.21 参考&#xff1a;代码随想录、力扣 46. 全排列 题目描述 难度&#xff1a;中等 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&…...

[AIGC] Kafka 消费者的实现原理

在 Kafka 中&#xff0c;消费者通过订阅主题来消费数据。每个消费者都属于一个消费者组&#xff0c;消费者组中的多个消费者可以共同消费一个主题&#xff0c;实现分布式消费。每个消费者都会维护自己的偏移量&#xff0c;用于记录已经读取到的消息位置。消费者可以选择手动提交…...

Dubbo框架admin搭建

Dubbo服务监控平台&#xff0c;dubbo-admin是图形化的服务管理界面&#xff0c;从服务注册中心获取所有的提供者和消费者的配置。 dubbo-admin是前后端分离的项目&#xff0c;前端使用Vue&#xff0c;后端使用springboot。因此&#xff0c;前端需要nodejs环境&#xff0c;后端需…...

Linux 内存top命令详解

通过top命令可以监控当前机器的内存实时使用情况&#xff0c;该命令的参数解释如下&#xff1a; 第一行 15:30:14 —— 当前系统时间 up 1167 days, 5:02 —— 系统已经运行的时长&#xff0c;格式为时:分 1 users ——当前有1个用户登录系统 load average: 0.00, 0.01, 0.05…...

OCP使用CLI创建和构建应用

文章目录 环境登录创建project赋予查看权限部署第一个image创建route检查pod扩展应用 部署一个Python应用连接数据库创建secret加载数据并显示国家公园地图 清理参考 环境 RHEL 9.3Red Hat OpenShift Local 2.32 登录 通过 crc console --credentials 可以查看登录信息&…...

Chrome关闭时出现弹窗runtime error c++R6052,且无法关闭

环境&#xff1a; Chrome 版本121 Win10专业版 问题描述&#xff1a; Chrome关闭时出现弹窗runtime error cR6052&#xff0c;且无法关闭 解决方案&#xff1a; 1.任务管理器打开&#xff0c;强制结束进程 2.再次打开谷歌浏览器&#xff0c;打开设置关于Chrome&#xff0…...

【动态规划专栏】专题二:路径问题--------6.地下城游戏

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…...

flink operator 1.7 更换日志框架log4j 到logback

更换日志框架 flink 1.18 1 消除基础flink框架log4j 添加logback jar 1-1 log4j log4j-1.2-api-2.17.1.jar log4j-api-2.17.1.jar log4j-core-2.17.1.jar log4j-slf4j-impl-2.17.1.jar 1-2 logback logback-core-1.2.3.jar logback-classic-1.2.3.jar slf4j-api-1.7.25.jar2 …...

算法项目(1)—— LSTM+CNN+四种注意力对比的股票预测

本文包含什么? 项目运行的方式(包教会)项目代码(在线运行免环境配置)不通注意力的模型指标对比一些效果图运行有问题? csdn上后台随时售后.项目说明 本项目实现了基于CNN+LSTM构建模型,然后对比不同的注意力机制预测股票走势的效果。首先看一下模型结果的对比: 模型MS…...

Qt C++春晚刘谦魔术约瑟夫环问题的模拟程序

什么是约瑟夫环问题&#xff1f; 约瑟夫问题是个有名的问题&#xff1a;N个人围成一圈&#xff0c;从第一个开始报数&#xff0c;第M个将被杀掉&#xff0c;最后剩下一个&#xff0c;其余人都将被杀掉。例如N6&#xff0c;M5&#xff0c;被杀掉的顺序是&#xff1a;5&#xff…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...