Kotlin 是一门用于现代多平台应用的静态编程语言,其中被广泛用于 Android 平台的开发,被称之为Android 世界的 Swift。它由大名鼎鼎的 JetBrains 公司设计开发并开源,著名的 IDE 工具 IntelliJ IDEA 就是他们的产品,所以无疑他们是对编程语言设计领域最为熟悉的专家。Kotlin 从 2016 年发布 1.0 的 release 版本开始至今,使用的开发者数量快速增长。此外 Kotlin 已经拥有强大的生态和社区开发者的支持:Kotlin 是著名的 IDE 厂商 JetBrains 公司开发的编程语言;在 Google I/O 2017中,Google 宣布在 Android 上为 Kotlin 提供最佳支持;Kotlin 在 Spring5.0 后端开发框架中的支持;Kotlin DSL 1.0 将在 Gradle5.0 得以应用,Kotlin 成为继 Groovy 语言开发 Gradle 另一门编程语言;Kotlin 成为 2018 年 Github 中增长速度最快的语言;2018年10月,Google 和 JetBrains 在 KotlinConf18 上公开宣布了 Kotlin 基金会;2019年5月,谷歌宣布 Kotlin 作为 Android 的首选语言。;2019年7月,Kotlin 在 O’Reilly 开源软件大会(OSCON)2019上赢得了享有声望的年度突破项目奖;
借助 jobb 工具,我们可以构建不透明二进制 Blob (OBB) 格式的已加密和未加密 APK 扩展文件。我们可以在搭载 Android 2.3(API 级别 9)或更高版本的设备上使用 StorageManager 在应用中下载和装载这些扩展文件。OBB 文件用于为 Android 应用提供额外文件资源(例如图形、音频和视频),这些文件资源与应用的 APK 文件是分开的。
在 Kotlin 中的循环有两种方式分别是for,while,在for循环中使用"in"来遍历,并且有两个遍历方式。1. for 循环:val items = listOf("java", "kotlin", "android")for (item in items) {//for遍历集合 println("lang $item")}for (index in items.indices) {//类似于java中的数组的length-index的遍历 println("The $index index is ${items[index]}")}2. while 循环:val items = listOf("java", "kotlin", "android")var index = 0while (index < items.size) {//while 循环的遍历方式 println("The $index lang is ${items[index++]}")}
当我们导入文件或文件夹时,如果其路径包含密度限定符,Resource Manager 会自动在导入过程中应用密度限定符。下表列出了受支持的不同密度在 Android 系统中的表示方法:密度Android 密度限定符低密度(约 120dpi)ldpi中密度(约 160dpi)mdpi高密度(约 240dpi)hdpi超高密度(约 320dpi)xhdpi超超高密度(约 480dpi)xxhdpi超超超高密度(约 640dpi)xxxhdpi以下示例说明了导入后输入路径如何转换为资源路径:Android 密度限定符:hdpi输入路径:/UserFolder/icon1/hdpi/icon.png资源路径:< projectFolder >/< moduleFolder >/src/main/res/drawable-hdpi/icon.pngAndroid 密度限定符:xhdpi输入路径:/UserFolder/icon1/abc-xhdpi/icon.png资源路径:< projectFolder >/< moduleFolder >/src/main/res/drawable-xhdpi/icon.pngAndroid 密度限定符:xxhdpi输入路径:/UserFolder/icon1/abc-xxhdpi/icon.png资源路径:< projectFolder >/< moduleFolder >/src/main/res/drawable-xxhdpi/icon.png
前面的小节我们介绍了应用构建相关的知识,从本小结我们学习应用调试相关的知识,首先我们要学习下开发者选项。
Android 上的“设置”应用包含一个名为开发者选项的界面,我们可以使用该屏幕配置一些系统行为来帮助我们分析和调试应用性能。例如,我们可以启用 USB 调试、捕获错误报告、启用点按的视觉反馈、在窗口 surface 更新时刷写 surface、使用 GPU 渲染 2D 图形,等等。Tips:开发者选项列表可能会因 Android 版本而异
列出已安装和可用的软件包sdkmanager --list [options]安装软件包sdkmanager packages [options]packages 参数是 --list 命令列出的 SDK 式的路径,这些路径括在引号中(例如 “build-tools;29.0.2” 或 “platforms;android-28”)。例如,下面展示了如何安装最新的平台工具(包括 adb 和 fastboot)以及适用于 API 级别 28 的 SDK 工具:sdkmanager "platform-tools" "platforms;android-28"更新所有已安装的软件包sdkmanager --update [options]
运行 Android Studio ,开始创建项目,选择 Start a new Android Studio project;选择项目类型为 Phone and Tablet, 界面选择 Empty Activity,点击 Next;填写项目信息;Name:项目名称,即应用名称;Package name:包名,应用的包名必须具备唯一性;Save location:项目在本地磁盘的保持路径;Language:项目开发语言,有 Java 和 Kotlin 可选;Finish:完成项目创建。项目创建完成后的初始代码。
和 Broadcast 类似,Android 系统也为我们预置了很多必备的 Content Provider,我们来学习一下如何使用。
我们的 FrameLayout 需要满足以下要求:一个图片,作为 FrameLayout 的前景;一个 Android Logo 图片资源(ImageView);一个文本资源,和 Logo 重叠,可以看到后添加的 View 会挡住前面添加的 View;一个文本资源,和前景图片重叠,可以看到前景图片时钟会在内部 View 之上显示。完成以上功能的布局代码比较简单:<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:foreground="@drawable/emercy" android:foregroundGravity="bottom|right" android:orientation="vertical"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="centerCrop" android:src="@mipmap/ic_launcher" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:background="#4C374A" android:padding="10dp" android:text="Welcome to iMooc" android:textColor="#FFFFFF" android:textSize="20sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left|bottom" android:background="#1E64D8" android:padding="10dp" android:text="Emercy Android" android:textColor="#FFFFFF" android:textSize="18sp" /></FrameLayout>效果如下:这就是 FrameLayout 的基本用法。
前面的小节我们学习了如何安装 NDK 和 CMake。本小节学习如何配置 CMake。
本门课程大致分为 9 大部分,基本涵盖了 Android 应用开发的方方面面,我们先了解下各部分的概括:
利用设备文件浏览器,我们可以在虚拟设备上查看、复制和删除文件。如果我们要检查应用创建的文件,或者要将文件传输到设备或从设备传输文件,这会很有用。Tips:除非我们使用的是已取得 root 权限的设备或带有标准 Android (AOSP) 系统映像(而不是某个 Google API 或 Google Play 系统映像)的模拟器,否则大多数设备数据都不可见。要使用设备的文件系统,请按以下步骤操作:在 Android Studio 依次点击 View > Tool Windows > Device File Explorer 或点击工具窗口栏中的 Device File Explorer 按钮以打开设备文件浏览器。在文件浏览器窗口中与设备内容交互。右键点击某个文件或目录可创建一个新的文件或目录,将选定的文件或目录保存到计算机上,上传、删除或同步文件。双击某个文件可在 Android Studio 中将其打开。
由于不限制选中数量,Checkbox 控件不存在类似 RadioGroup 的父容器,我们可以直接在布局文件中写<Checkbox/>标签,如下:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/group" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="20dp" android:orientation="horizontal"> <CheckBox android:id="@+id/cb_android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="Android" /> <CheckBox android:id="@+id/cb_ios" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="iOS" /></LinearLayout>我们看到可以有两个选项同时被选中,和 RadioButton 一样,通过android:checked属性设置默认选中的选项。
Android Studio 中的代码示例浏览器使我们能够根据项目中当前突出显示的符号查找 Android 代码示例。在代码中突出显示某个变量、类型或方法右键点击以显示上下文菜单;从上下文菜单中,选择 Find Sample Code;在工具窗口的左侧窗格中,选择一个示例;然后,滚动浏览右侧窗格以查找在所选示例中使用的突出显示的代码行。
使用 Kotlin 开发 Android 应用程序,给你带来最大方便之一的是可以省去 findviewById , 可以看到在 Java 中会写很多类似的模板代码,并且毫无技术含量。实现下面简单的 UI 效果:在 Java 中的 findviewById 实现:package com.imooc.imooctest;import android.os.Bundle;import android.widget.ImageView;import android.widget.RatingBar;import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import androidx.core.content.ContextCompat;public class Main2Activity extends AppCompatActivity { private TextView mTvTitle; private TextView mTvTime; private TextView mTvScore; private TextView mTvLaunage; private TextView mTvDirector; private TextView mTvActors; private TextView mTvHot; private RatingBar mRatingBarScore; private ImageView mIvPoster; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); mTvTitle = findViewById(R.id.movie_tv_title); mTvTime = findViewById(R.id.movie_tv_time); mTvScore = findViewById(R.id.movie_tv_rating_score); mTvLaunage = findViewById(R.id.movie_tv_language); mTvDirector = findViewById(R.id.movie_tv_director); mTvActors = findViewById(R.id.movie_tv_actors); mTvHot = findViewById(R.id.movie_tv_hot); mRatingBarScore = findViewById(R.id.movie_rating_bar); mIvPoster = findViewById(R.id.movie_iv_poster); mTvTitle.setText("Forrest Gump"); mTvTime.setText("1994"); mTvScore.setText("8.8"); mTvLaunage.setText("Language: English(USA)"); mTvDirector.setText("Director: Robert Zemeckis"); mTvActors.setText("Starring: Tom Hanks, Rebecca Willams, Sally Field, Michael..."); mTvHot.setText("1786891"); mRatingBarScore.setRating(4.4f); mIvPoster.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.biz_app_icon_cover)); }}在 Kotlin 中的实现:对于上述实现的 Java 的代码实际有效逻辑仅仅也就 20 多行,然而其中模板代码占了 50% 左右,那么 Kotlin 就可以省去这些模板。对于上面相同代码效果,Kotlin 仅需一半的代码实现,非常简单高效。package com.imooc.imooctestimport android.os.Bundleimport androidx.appcompat.app.AppCompatActivityimport androidx.core.content.ContextCompatimport kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) movie_tv_title.text = "Forrest Gump" movie_tv_time.text = "1994" movie_tv_rating_score.text = "8.8" movie_tv_language.text = "Language: English(USA)" movie_tv_director.text = "Director: Robert Zemeckis" movie_tv_actors.text = "Starring: Tom Hanks, Rebecca Willams, Sally Field, Michael..." movie_tv_hot.text = "1786891" movie_rating_bar.rating = 4.4f movie_iv_poster.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.biz_app_icon_cover)) }}技巧点:在 Kotlin 开发 Android 应用程序中只需要在 build.gradle 中添加如下 plugin 即可,当然这个已经是 Kotlin 开发 Android 的自动生成的标配了。apply plugin: 'kotlin-android-extensions'
在 Android 中有两种类型的广播:有序广播无序广播下面分别来介绍这两类广播。
Android 系统要求所有 APK 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新。
本节学习了 Android 内置的最常用的播放器,最关键的是要熟悉它的状态机时序图,因为可能在实际开发中你会使用更强大的第三方播放器,但是基本时序仍然是参照 Android 官方设计的,在了解时序之后就可以按照本节的步骤使用各种 API 来播放音视频了。在掌握了本节内容之后,如果感兴趣也可以研究研究市面上常用的开源播放器,可以让你对播放器有更深的理解。
本节将介绍 Android 原生布局的最后一个布局,也是最不常用的布局——绝对布局(AbsoluteLayout)。目前在 Android SDK 中处于被弃用的状态,原因是前面学习过的 5 大布局太过强大。确实,绝对布局在开发中中可能从来都用不到,但是我们作为学习过慕课教程的高级玩家,需要一方面扩展自己的知识面,另一方面需要学习绝对布局的设计思想及设计理念,这对我们今后的学习都是有益无害的。
Android Studio 包含一个 APK 分析器,可让你在构建流程完成后立即了解 APK 的组成。使用 APK 分析器可以减少调试应用的 DEX 文件和资源相关问题所用的时间,并且有助于减小 APK 的大小。通过 APK 分析器,你可以完成以下操作:查看 APK 中的文件(如 DEX 和 Android 资源文件)的绝对大小和相对大小;了解 DEX 文件的组成;快速查看 APK 中的文件(如 AndroidManifest.xml 文件)的最终版本;对两个 APK 进行并排比较。
在这个阶段,Gradle 创建了一个模型来代表任务,并参与到项目构建中来。Android 项目中这个阶段就是执行build.gradle 脚本文件。
sdkmanager 是一个命令行工具,我们可以用它来查看、安装、更新和卸载 Android SDK 的软件包。
Drawable 从字面上理解就是一个可绘制的图形对象,最简单的例子就是常用的 Bitmap 对象,在 Android 中可以通过一个 BitmapDrawable 对象来呈现。每一个 Drawable 内部都保存了一个“res/drawable”目录下的私有文件,比如我们会将不同分辨率的图片资源存储在“mdpi”、“hdpi”、“xhdpi”以及“xxhdpi”里面,这些目录是在创建工程的时候 Android Studio 自动帮我们生成好的,然后在运行的时候系统会根据当前的设备类型自动选择一种合适的 bitmap 图片资源为我们所用。
本节课程我们主要学习了 Android Studio 如何查找和使用示例代码。本节课程的重点如下:了解如何查找和使用示例代码。
列表布局类似 ListView 里面的 item 布局,但是由于 ExpandableListView 有主类和子类区分,所以这里需要提供两套布局以适应主列表和展开后的子列表:主列表布局 list_group.xml : <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/listTitle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft" android:paddingTop="10dp" android:paddingBottom="10dp" android:textColor="@android:color/black" />为了突出大分类,字体设置为黑体。子列表布局 list_item.xml :<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/expandedListItem" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft" android:paddingTop="10dp" android:paddingBottom="10dp" />
在 Eclipse 左侧展示的就是我们创建的工程的目录结构目录文件比较多,其中需要大家着重注意的是以下 5 个:src: 用于存放源文件,也就是没有进行编译的程序文件。结构按照包名排列,与 Java 工程类似。gen: 用于存放编译中间产物,由 ADT 自动生成,我们一般不做修改。内部有一个 R.java 文件,是工程的资源字典。工程内 Res 目录下的所有资源都会通过 id 的形式登记在该文件内。assets: 用于存放打包在 apk 内的静态文件。该目录下的文件将不会在 R.java 内生成对应的 id,并且会以原始格式保存,适用于保存类似文本文件,视频文件,MP3 音频等媒体文件。res: 用于存放资源文件,主要有以下几个资源:drawable: 存放各种位图文件(png、jpg、9图、gif等),除此之外可能是一些其他的 drawable 类型的 XML 文件layout: 布局文件,各个页面的 UI 样式values: XML 类型的描述文件AndroidMainfest.xml: 应用程序清单文件,包含了 android 应用中的元信息,Android 中的四大组件以及用户权限列表等都需要在此注册,同时也详细描述了 android 应用的项目结构。以上 5 个目录是大家必须掌握的,后面的开发也会频繁用到。另外还有一些如果感兴趣可以简单了解,不作要求。android 9.0: 包含了项目需要的库文件(Jar 文件),和普通 Java 项目中的/lib类似。同时其中还包含项目打包时需要的META-INF目录.Android Private Libraries: 存放项目中引入的第三方 JAR 包**bin:**编译结果,保存的是二进制文件,包括class、资源文件、dex、apk 等,我们可以在这个目录下导出 apk 文件proguard-project.txt: 代码混淆配置文件project.properties: 工程属性的配置文件。可以再次设置编译使用的 Android 版本号
这个我们直接看文件内容吧://注释1apply plugin: 'com.android.application'//注释2android { compileSdkVersion 28 buildToolsVersion "29.0.2" defaultConfig { applicationId "com.bthvi.myuiapplication" minSdkVersion 19 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }}//注释3dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'}上面的文件就是 app 模块下的 build.gradle 文件,我们看到主要是分三个部分,注释1,注释2,注释3分别对应如下三个语句和闭包:apply plugin 语句android 闭包dependencies 闭包
本节介绍了一个以前经常接触的数据格式,在 Andorid 中我们的布局可以很方便的用 XML 来编写,重新回到本节开头的问题,Android 系统是如何将我们写好的 XML 布局转换成 UI 样式的呢?是否也可以通过XmlPullParser来完成?当然,除了编写 Android 布局之外,XML 也是网络传输中常用的数据格式,我们可以将需要的数据通过 XML 格式存储,然后通过上一节学习的 HttpURLConnection 来进行传输。除了 XML,还有另一种数据格式非常实用,我们将在下一节揭晓。
本节课程我们主要学习了 Android Studio 的快捷键。本节课程的重点如下:熟练掌握常用的键盘快捷键如何配置自定义快捷键