文章目录
安装+配置Android Studio
从这一步开始:
一直点 next
即可,直到存储路径的选择上,可以放到非 C
盘,这里我放到 D
盘了(截图中没改):
是否要添加到开始菜单栏:
直到完成:
是否继承旧有配置,第一次安装的选第二个就行:
谷歌问你能不能在不侵犯你隐私的前提下获取些帮助改进的信息……我选的 send
:
这个问题详见这篇博客:
配置,第一个是标准常规配置,第二个是自定义配置,选择第一个即可:
深色主题 or 浅色主题:
使用Android Studio
新建一个项目:
选择项目模块,可直接点next:
因为 Google
简易采用 Kotlin
来进行开发,不过也可以使用 java
,同时指定 Minimum SDK
的版本为 21
,对应 Android 5
版本:
编译器界面:
如果点了上图圈出来的那个,就会……:
运行 ‘app’
时出错:没有找到目标设备。
模拟器
这是因为缺少模拟器,点击:
进入下图界面,点击页面中间的 Create Virtual Device...
:
选择完成后点击 next
:
点击 Download
下载你想要的系统,下载完之后选中,点击 Next
:
点击接受,然后 next
:
下载完成后点击 Finish
:
更改Android SDK的路径
值得一提的是,Android SDK
的默认路径是在 C
盘,因此模拟器也会被下在 C
盘:
其实这个是可以更改的,我们根据 C: \Users\(你的主机名)\AppData\Local \Android\Sdk\
,找到 Sdk
文件夹,将其移动到 D
盘(我是将整个 Android
文件夹移动到 D
盘了):
PS:移动时记得关闭 AS
软件,否则会因为部分组件正在被使用导致无法成功移动。
然后在 AS
里重设 Sdk
的路径:
好了我们继续说配置模拟器,之后回到之前选择系统的界面,选择下载好的系统,点击 next
:
进行参数配置:
添加成功:
出现左侧的安卓手机就算配置成功啦!PS:在此之前可能会让你下载 HAXM
,跟着提示点就行了,因为我们上面把 SDK
移动到了 D
盘,因此也不用担心占内存什么的~
值得一提的是,出现如下图所示的弹窗,则表示模拟器已经启动了,无需再点击启动的三角符号:
当启动模拟器之后即可返回之前界面,运行代码:
这时我出现了这样的报错:Installed Build Tools revision 版本号 is corrupted. Remove and install again
焦头烂额许久之后,找到了原因,我下载的模拟器版本是 Android 7.0
,但是 Android SDK
却只有 API 32
这个版本:
解决方式是,下载 Android 7.0
之后,更改 build.gradle
配置文件,图中框起来的部分是修改后的内容,这里我选择的是我下载的 30
版本,之后记得点击右上角的 sync now
进行同步:
Hello World!
解决上述问题后再次运行程序,模拟器即可出现:
项目目录分析
我们来看一下 src/main/res
下的一些文件:
mipmap
系:用来放置图标,有多个版本的文件夹,是为了适应不同的设备,提高了代码兼容性。values
系:存放字符串、样式、颜色等配置。layout
系:存放布局文件的。drawable
系:存放图片。AndroidManifest.xml
:整个项目的配置文件,在程序中定义的组件都需要在这个文件中注册。
AndroidManifest.xml 分析
activity
表示对MainActivity
进行注册。- 因为包名在上文
package
中已经定义,所以用.
表示省略包名。 intent-filter
是拦截器,定义了整个项目的主Activity
,也就是项目的入口。
MainActivity.kt 分析
MainActivity.kt
是用 kotlin
实现的代码文件,可以类比于 C++/JAVA
的 main
文件/函数:
上图红框的意义是:MainActivity
继承了 AppCompatActivity
。
那么什么是
AppCompatActivity
呢?
Android 21
(也就是 Android 5
)之后引入了 Material Design
的设计方式,为了支持 Material Color 、调色板、toolbar 等各种新特性,AppCompatActivity
就应运而生,其不仅兼容旧有的 ActionBarActivity
,更是引入了AppCompatDelegate
类的设计,可以在普通的 Acitivity
中使用 AppCompate
的相关特性。
那么什么是
Acitivity
呢?
Activity类
是 Android
提供的一个基类,项目中所有程序员自定义的 Activity
都必须继承 基类Activity
或者 基类Activity的子类
,从而获得一个 Activity
的特性。
onCreate
与Create
在 view类
中,Create
是虚函数、由框架调用,用来 生成一个窗口的子窗口。 而 OnCreate
函数是用来表示 一个窗口正在生成。
一个窗口创建(Create
)之后,会向操作系统发送 WM_CREATE
消息,OnCreate()
函数主要是用来响应此消息的,因此又被叫做消息响应函数。其只是在窗口显示前设置窗口的属性,如风格、位置颜色等;实现我们要在窗口里面增加的东西,例如按扭,状态栏,工具栏等。这些子窗口一般定义成类中的一个成员变量,以保证生命周期的正确性。
Android
中Bundle类
的作用.
Bundle类
类似于 Map
,用于存放 key-value
键值对形式的值。相对于 Map
,它提供了各种常用类型的 put/get
方法,如:putString()/getString()
和 putInt()/getInt()
,put()
用于往 Bundle
对象放入数据,get()
方法用于从 Bundle
对象里获取数据。Bundle
的内部实际上使用了 HashMap类型
的变量来存放 put()
方法放入的值。
savedInstanceState
和onSaveInstanceState()
在 Activity
的生命周期中,只要离开了可见阶段,或者说失去了焦点,Activity
就很可能被进程 KILL 掉,这时候,就需要一种能保存当时的状态的机制—— savedInstanceState
。当一个 Activity
在 PAUSE 时,被 KILL 之前,它可以调用 onSaveInstanceState()
来保存当前 Activity
的状态信息。用来保存状态信息的 Bundle
会同时传给两个 method
,即 onRestoreInstanceState()
和 onCreate()
。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// override 确保该函数(即onCreate)为基类(即Activity)的虚函数并在此进行重写。
super.onCreate(savedInstanceState)
// 调用其父类Activity的onCreate方法来实现对界面的图画绘制工作。
// 其实这条语句放在子类中的onCreate方法中的任何位置都可,问题只是该语句必须要被执行,所以,最好放在第一行,避免遗忘。
// Activity中的onCreate方法中已经实现了一些基本操作,如果子类没有缺少super.onCraete,会导致子类中的onCreate方法功能不全。
setContentView(R.layout.activity_main)
// 作用:加载一个界面。Android讲究逻辑与视图分离,所以在Activity是不写界面的,界面是放在局部文件里面的。
// 该方法中传入的参数是”R.layout.activity_main“,其含义为R.java类中静态内部类layout的静态常量activity_main的值,
// 而该值是一个指向res目录下的layout子目录下的activity_main.xml文件的标识符,
// 因此代表着显示activity_main.xml所定义的画面/布局。
}
}
我们来看一下上面代码提到的 activity_main.xml
: