第一章 第一行Android代码
一、Android简介
1.android系统架构
linux kernel(Linux内核层):提供硬件底层驱动
libraries(系统运行库层):提供了主要的特性支持,如SQLite库、Webkit库;还包含android runtime(android运行时库)
application framework(应用框架层):提供了构建应用程序时可能用到的各种API
applications(应用层):手机上的应用程序
2.Android应用开发特色
1.四大组件
活动(Activity):看得到的
服务(Service):看不到的
广播接收器(Broadcast Receiver):接受其他应用的广播消息
内容提供器(Content Provider):应用程序间共享数据
2.丰富的系统控件
3.SQLite数据库(嵌入式关系型数据库,支持标准的SQL语法,还可以通过Android API进行操作)
4.强大的多媒体
5.地理位置定位
二、工具准备
JDK
Android SDK
Android Studio
Tips:新建项目的时候是否勾选use legacy android.support libraries
不要勾选,因为已经使用androidx类库替代了
三、分析第一个Android程序
.gradle和.idea
自动生成,无需关心
2.app
放置项目的代码、资源等内容
3.build
包含编译时自动生成的文件,无需关心
4.gradle
包含了gradle wrapper
的配置文件,使用gradle wrapper
的方式不需要提前将gradle
下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle
.gitignore
将指定的目录或文件排除在版本控制之外
6.build.gradle
项目全局的gradle
构建脚本
7.gradle.properties
全局的gradle
配置文件
8.gradlew和gradlew.bat
在命令行页面中执行gradle
命令
9.HelloWorld.iml
IDEA自动生成,标识这是一个IDEA项目
10.local.properties
指定本机中Android SDK路径
11.setting.gradle
指定项目中所有引入的模块
1.app目录详解
1.build
编译时自动生成
2.libs
第三方jar包
3.androidTest
编写测试用例,自动化测试
4.java
Java
代码或Kotlin
代码
5.res
资源目录:图片放到drawable
目录录下,布局放到layout
目录下,字符串放到values
目录下
6.AndroidManifest.xml
整个项目的配置文件,四大组件都需要在这个文件注册
7.test
自动化测试的另一种方式
.gitignore
app模块内指定的目录和文件排除在版本控制之外
9.app.iml
IDEA项目自动生成,无需关心
10.build.gradle
app模块的gradle构建脚本
11.proguard-rules.pro
指定项目代码的混淆规则,防止打成的安装包文件被破解
2.分析HelloWorld项目
<activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>
表示MainActivity是这个项目的主活动,点击应用首先出现的就是这个活动
创建的活动继承了AppCompatActivity,这是一种向下兼容的Activity(兼容到Android2.1)
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
}
为当前的活动引入activity_main这个布局
3.详解项目中的资源
drawable
开头:放图片
mipmap
开头:放应用图标
values
开头:放字符串、样式、颜色等配置
layout
:放布局文件
<resources><string name="app_name">HelloWorld</string>
</resources>
4.详解build.gradle
文件
最外层目录下的build.gradle
文件:
buildscript {repositories {google()jcenter()
}dependencies {classpath "com.android.tools.build:gradle:4.1.2"// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files}
}allprojects {repositories {google()jcenter()
}
}
google()
是Google自家的扩展依赖库
jcenter()
是第三方代码托管库,现在已经废弃,迁移至mavenCentral()
classpath "com.android.tools.build:gradle:4.1.2
" 表明Gradle构建的是Android项目
app
目录下的build.gradle
文件:
plugins {id 'com.android.application'
}android {compileSdkVersion 30buildToolsVersion "30.0.3"defaultConfig {applicationId "com.jack.helloworld"minSdkVersion 21targetSdkVersion 30versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}dependencies {implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'com.google.android.material:material:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.1'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
com.android.application
表示这是一个应用程序模块, com.android.library
表示这是一个库模块。二者最大的区别在于,应用程序模块是可以直 接运行的,库模块只能作为代码库依附于别的应用程序模块来运行。
applicationId "com.jack.helloworld"
是每一个应用的唯一标识符,绝对不能重复,默认会使用我们在创建项目时指定的包名
四、Android中的日志工具类Log
Log(android.util.Log)
Log.v()
对应级别verbose
,日志信息
Log.d()
对应级别debug
,调试信息
Log.i()
对应级别info
,数据信息
Log.w()
对应级别warn
,警告信息
Log.e()
对应级别error
,错误信息
Log.d("HelloWorldActivity","onCreate excute");
第一个参数是tag,一般传入当前类名,用于对打印信息过滤;第二个参数是msg,打印的具体内容
相关文章:
第一章 第一行Android代码
一、Android简介 1.android系统架构 linux kernel(Linux内核层):提供硬件底层驱动 libraries(系统运行库层):提供了主要的特性支持,如SQLite库、Webkit库;还包含android runtime&…...

怎样利用 AI 大模型,辅助研发管理与效能提升?
AI 大模型已经逐渐渗透到各行各业的应用场景中,在软件研发领域也不例外。在软件研发领域,从需求分析到软件设计,从软件开发到测试,以及最后发布上线,AI 在各个环节都发挥着重要作用。10 月 21 日,思码逸首席…...
聊天室的创建
要创建一个聊天室,您需要: 确定聊天室的主题和目的。 选择一个适当的聊天室平台或应用程序,如Discord、Slack、Zoom等。 注册一个账户并创建一个聊天室。 添加您的朋友或家人或需要的人到聊天室中。 设置聊天室的规则和管理机制ÿ…...

大数据信息抽取
随着互联网的广泛应用和技术的不断进步,海量数据被产生、存储和共享。这些数据中包含着宝贵的的信息和知识,二大数据信息抽取是正是为了把这些数据中关键、有用的信息提取出来。 大数据信息抽取就是指通过自动化的方式,从大数据中提取有异议…...

驱动开发11-1 编写IIC驱动-读取温湿度数据
头文件 head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define GET_HUM _IOR(m, 1, int) #define GET_TEM _IOR(m, 0, int) #endif 应用程序 si7006.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #inc…...

上海中优城市万豪酒店推出全新国际IP童趣主题房,独特住宿体验中国首秀
2023年10月30日,中国上海 – 近日,上海中优城市万豪酒店正式推出由全球品牌娱乐公司孩之宝官方授权打造的小马宝莉和变形金刚主题客房,以创意客房、新奇体验和丰富礼遇,为童游家庭或年轻的动漫迷们开启沉浸式入住之旅,…...
zsh和bash之间互相切换
zsh->bash exec bashbash->zsh exec zsh...
Java - window系统快捷键大全
Ctrl 快捷键 介绍 Ctrl F 在当前文件进行文本查找 (必备) Ctrl R 在当前文件进行文本替换 (必备) Ctrl Z 撤销 (必备) Ctrl Y 删除光标所在行 或 删除选中的行 (必备) Ctrl X …...
深入理解数据结构(1)—用链表实现栈
栈是一种数据结构,链表也是一种数据结构。它们都是由基础的语法实现的。 如果一个数据结构可以用另外的数据结构来实现,那么可以有力的证明——“数据结构是一种思想”,是一种讲语法组合起来实现某种功能的手段 一、栈的特点——要实现哪些功…...
Jtti:debian安装firewalld错误怎么办
如果在Debian系统上安装Firewalld时出现错误,可以尝试以下步骤来解决问题: 更新软件包列表: 首先确保您的Debian系统的软件包列表是最新的。运行以下命令: sudo apt update 安装Firewalld: 使用以下命令安装Firewalld&…...
如何理解python中的*args和**kwargs
args用于表示可变数量的位置参数(Positional Arguments) kwargs 用于表示可变数量的关键字参数(Keyword Arguments)。 *args 来接收不定数量的位置参数 实例: def exampleFunc(*args):print(type(args))for arg in args:print…...

软考之软件工程基础理论知识
软件工程基础 软件开发方法 结构化方法 将整个系统的开发过程分为若干阶段,然后依次进行,前一阶段是后一阶段的工作依据按顺序完成。应用最广泛。特点是注重开发过程的整体性和全局性。缺点是开发周期长文档设计说明繁琐,工作效率低开发前要…...

香港服务器不稳定的几种情况
近年来,随着互联网的迅猛发展,香港作为一个重要的网络枢纽地区,扮演着连接中国内地和国际网络的重要角色。一些用户表示在使用香港服务器时可能会遇到不稳定的情况,导致访问困难、加载缓慢甚至无法连接。 为什么香港服务器会…...

报修软件有什么用?企业如何做好设备管理与维护?
在当今的商业环境中,设备设施的维护和管理已经成为企业运营的重要环节。无论是学校、酒店、物业等大型企事业单位,还是运维集成商、制造工厂等企业单位,都需要对设备设施进行有效的管理。报修软件作为一种智能化的解决方案,为设备…...
Go语言的键盘输入和打印输出
键盘输入和打印输出 一、打印输出 1.1 fmt包 fmt包实现了类似C语言printf和scanf的格式化I/O。格式化verb(‘verb’)源自C语言但更简单。 详见官网fmt的API:https://golang.google.cn/pkg/fmt/ 1.2 导入包 import "fmt"1.3 常…...

jenkins实践篇(2)—— 自动打tag的可回滚发布模式
大家好,我是蓝胖子,在上一篇我简单介绍了如何基于特定分支做自动编译和发布,在生产环境中,为了更加安全和快速回滚,我采取的是通过对代码打tag的方式来进行部署,下面我将详细介绍整个发布过程的逻辑。 发布…...
golang worker channel 模式
大概流程就是job -> JobQueue调度器循环获取JobQueue ,获取到的job ,再去异步获取等待可用的 worker,取出 chan Job,将job 写入改worker的 chan Jobworker 处理任务,先处理 case job : <-w.JobChannel: 处理完成后再将 chan…...
舔狗日记之好一条舔狗
闲来没事,爬了下vx《舔狗日记》,感觉挺有意思的,分享出来给大家看看。 PS:仅供娱乐,侵删。 舔狗2023 舔狗日记 2023年10月11日 晴天 你们根本不懂舔狗的快乐。被舔的人,无法预知接下来会不会继续被舔&…...

【地理位置识别】IP归属地应用的特点
IP归属地应用是一类用于确定特定IP地址的地理位置信息(通常是城市、地区或国家)的工具和服务。以下是IP归属地应用的几个主要特点: 地理位置识别: IP归属地应用主要用于确定IP地址的地理位置。这可以帮助组织更好地了解其网站访问…...
华为实验基础(2):路由器基础
一、路由器的分类 1、从功能、性能和应用方面划分: (1) 骨干路由器 :骨干路由器是实现主干网络互连的关键设备,通常采用模块化结构,通过热备 份、双电源和双数据通路等冗余技术提高可靠性 ,华…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...