[210308更新!]持续更新的Android & Android Jetpack & Material Design & Material Design Component(MDC)入门学习笔记

本文是作者关于Android、Android Jetpack、Material Design及MDC的持续更新学习笔记,涵盖了从基础布局到高级特性的实践,包括约束布局、持续集成、ViewBinding、DataStore等内容。通过实例解析,帮助开发者掌握Android开发的最佳实践。
摘要由CSDN通过智能技术生成

这是我第一次写有关Android的文章,甚至是第一篇有关编程的文章,所以我打算将这个文章作为持续更新的文章,算是学习笔记吧。希望我的文章能给屏幕前的你有所帮助。你可以选择耐心的全部看完,或者点击目录看你想看到的章节。无论是哪种,各位可以选择收藏这篇文章,我应该会持续更新的。
最近搞了一个个人博客,这篇文章的更新也会放在上面,但是是分开章节更新,欢迎关注。

写在前面

其实我接触Android已经3年了,但是每次做新的项目的时候总是要回顾我最开始编写的程序,这说明我在最初的程序里做的好多东西都是常用的,通用性很高,这也是我想写这篇文章的目的之一:将这些东西都总结一下。
当然还有其他的目的。自从Google宣布Android Jetpack之后,有关Android和Material Design Component(MDC)的中文资料太少,好多东西你只能通过Stack Overflow或者官方英文文档才能搜到。前者里面你搜到的问题可能和你的问题不符,后者有的时候非常鸡肋(例如Navigation控件的例子)看得头疼就想看他源码怎么写的,但是找源码看还费时费力。因此,我想写这篇文章总结一下我这几年遇到过的问题和解决方案,下次遇到同样问题的时候不是去看我自己曾经写过的代码,而是看这篇文章就能找到解决问题的办法。
虽然上面有了目录,但是在这里我还是像列举一下我这篇文章的结构,以及我接下来要补充的内容。

  • 写代码得有个好习惯
  • 帮你节省时间的持续集成:Travis CIGitHub Action
  • 从最基础的布局开始:ConstraintLayout 1.0
    • 重点介绍对象
    • 这是有史以来第一次Android实现了拖动放置模块(其实以前也行,但是拖进去之后要写一堆margin和padding,或者LinearLayout堆叠)
    • 2.0以及MotionLayout我还没有研究,等之后吧
  • 必须使用的绑定组件工具:ViewBinding
    • 重点介绍对象
    • ViewBinding很好用,每个写Android程序的人都要使用一下
  • 全新的可持续化数据方式:DataStore
    • 重点介绍对象
    • 需要知道的前置知识:Kotlin Coroutine与Flow
    • 2020年12月我重点攻克对象
    • 重点说说Preferences,Protobuf目前用不到,到时候再说
  • 简单易用的ORM数据库包:Room
    • 由于额外添加了DataStore的介绍,所以本节提前
  • 最强大的列表控件:RecyclerView
    • DiffUtil很好用,每个用Recycler且要频繁更新数据的人都要试试
  • 现代化的设计模式:MVVM模式以及ViewModelLiveData
    • 正在探索中
  • 全盘Fragment化的基础:Navigation导航组件
    • 配合Material自带的过渡动画(Transition)
  • 创建属于自己个性化的应用:Style样式以及Theme主题的自定义
  • 一些其他交互组件的集合
    • 该模块主要是一些大家比较常用的Material Design View的集合,包括ButtonBottomAppBarSnackbar等等
    • 首发记录BottomAppBarSnackbar以及FloatingActionButton之间的配合关系
  • 完全不一样的创建Android工程的方式:Android ComposeFlutter搁置中,咕咕咕,自己现在尝试Desktop版的Compose,太不完善了

本篇文章都是使用Kotlin和Android Studio进行编写。

更新日志

顺便在这里写一下整篇文章的更新历史,以便各位寻找:

时间 内容
20201026 创建文章,完成1.1-2.1章节
20210106 更新1.5的内容,增加Java 11警告
20210112 完成2.2章节,格式修正
20210218 完成2.3章节,格式修正
20210308 因为DataStore API更改,因此修正2.3章节,调整未来计划

相关资料

当然我这篇文章只是展现了一部分内容,因此我在这里放出一些相关资料,供大家参考。

等等,Java?Kotlin?

什么?你还在使用Java编写Android程序?不知道Google已经宣布Kotlin是官方语言了吗?
好吧,还是有一些人仍然在执着于Java。现在列举一些Kotlin的好处。

  • Kotlin代码好看一些
  • 大多数变量或常量都可以通过推断来知道变量或常量类型
  • 函数式编程
  • 空指针安全
  • Kotlin的向下支持可以使你用JDK 1.6就能享受到Java 9以上的语言特性
  • 100%兼容Java

所以,还是用Kotlin吧。
还有,如果你使用Android Studio进行编写,那么你应该知道整个工程都使用Gradle进行项目构建。Gradle的配置文件bulid.gradle是用的Groovy编写的,相比于Kotlin它的可读性很差,而且没有IDE上的类型推断支持。得益于Kotlin DSL的支持,你可以将文件重命名为build.gralde.kts,然后将里面的代码全部改写成Kotlin,就好看多了。
在此我放一个模板:

// build.gradle.kts
buildscript {
   
    repositories {
   
	// maven仓库用法:maven(url)
        mavenCentral()
        jcenter()
        google()
    }
    dependencies {
   
        classpath("com.android.tools.build:gradle:4.2.0-alpha07")
        classpath(kotlin("gradle-plugin", version = "1.4.10"))
    }
}

allprojects {
   
    repositories {
   
        mavenCentral()
        jcenter()
        google()
    }
}

tasks.register("clean", Delete::class) {
   
    delete(rootProject.buildDir)
}
// app/build.gradle.kts
// 你还可以定义val或者var
plugins {
   
    id("com.android.application")
    kotlin("android")
    kotlin("kapt")
    kotlin("plugin.serialization") version "1.4.0"
}
android {
   
    compileSdkVersion(30)
    defaultConfig {
   
        applicationId = "com.example.example"
        minSdkVersion(26)
        targetSdkVersion(30)
        versionCode = 1
        versionName = "1.0.0-alpha1"
    }
    buildTypes {
   
        getByName("debug") {
   
            isMinifyEnabled = false
        }
        getByName("release") {
   
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
            signingConfig = signingConfigs.findByName("github")
        }
    }
    // 这样可以在src/mian里面使用kotlin文件夹啦~
    sourceSets["main"].java.srcDir("src/main/kotlin")
    // 使用Java 8
    compileOptions {
   
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions.jvmTarget = "1.8"
    // ViewBinding
    buildFeatures.viewBinding = true
}

dependencies {
   
// settings.gradle.kts
include(":app")

写代码得有个好习惯

如果读者是Android新手的话,建议养成一些好习惯。

  • 不要看到一个好的包就要直接引入,除非它对你写代码有很大的帮助。
    • 我自己写的时候就是好多个包都引入,比如Glide、RxJava、Retrofit等等,后来发现用Okhttp就可以完成的东西就没必要用一堆无用的包了。
    • 多引入包有个坏处,你需要全部都下载下来。在国内如果不用阿里云等镜像,这个速度是相当慢的。
  • 建议使用稳定版的Android Studio,不要使用Eclipse,后者的Android官方插件早就不支持了。而且一定是稳定版的Android Studio,虽然没有新功能(例如4.2可以使用Android Compose)但是更加稳定。你绝对不想编得好好的程序因为IDE的问题导致运行不了。
  • 虽说前两条是不建议的,但是你可以有个工程专门探索新功能,或者是多下一个IDE。
  • 版本号一定要有规律,这个是有一个准则的,我贴在这里,还有中文版
    • 简单来说,版本号的第一个数字是大版本更新,第二个数字是小版本更新,第三个数字是正式版的bug小修。
    • 对于测试版,可以在正式的版本号后面增加alpha、beta、rc,alpha是早期版本,beta是中期版本,rc(Release Candidate)是临近发布的时候的版本
  • 建议自己建一个BaseActivity和BaseFragment,让你所有的Activity和Fragment都继承自你自己创建的类。相信我,你会回来感谢我的。

看完这些,想必你已经按耐住不住想动手试试的感觉了,那现在开始吧~

帮你节省时间的持续集成:Travis CI与GitHub Action

谁说我不能说一些无关Android的东西的呢:>
要知道,开发Android应用最麻烦的地方就是生成带签名的包。每次都要通过Android Studio生成有点太麻烦。于是,你可以使用持续集成(Continuous integration)来帮助你完成这个步骤,只需要给他一个配置信息和一个Keystore,它就可以在你规定好的时间进行build,并且生成一个带有签名的APK包。

Travis CI

在GitHub没有被微软收购之前,有多家网站都提供CI服务,其中Travis CI是集成GitHub最好的一个,所以我最开始也使用的Travis CI进行打包和build。
在你的工程中新建一个名为.travis.yml,并且在Travis CI 网站1或者Travis CI 网站2中登录你的GitHub账号,打开你想使用CI的项目即可。它可免费支持公开项目的CI。你可以在这里看到他的官方文档,但是他们好像不怎么更新了,最新的好像还是API 25的版本,但是你可以使用API30的SDK。
他还可以加密文件,不过得需要Linux环境,安装Ruby之后使用gem install travis就可以使用Travis提供的Travis CLI了。几个比较常用的命令是travis logintravis deploytravis encrypt-file等等。 各位可以自己尝试一下,我自从部署好了之后就忘记怎么做了…
不过这个不是我这次说的重点,重点在于GitHub Action。

GitHub Action

自从GitHub被微软收购了之后,开始了大刀阔斧的更新改革,例如GitHub的手机客户端、宽屏幕的Web网页,当然还有这一小节的主角:GitHub Action。

准备工作

创建KeyStore

如果你想搞一个带有签名的APK的话(如果要上架商店的话必须带签名),必须搞一个KeyStore。这也不难,Android Studio就带有这样的功能。点击菜单栏中的「Build」-「Generate Signed Bundle / APK…」,不用管选项,直接在新弹出来的窗口中点击Next,如图1所示。
图1 创建KeyStore Step 1

图1 创建KeyStore Step 1

在弹出来的窗口中,你可以看到「Create new…」的选项,这个选项就是新建新的KeyStore,在弹出来的窗口中,填入一些信息,填完确认即可,如图2。
图2 创建KeyStore Step 2

图2 创建KeyStore Step 2
我现在这个版本的Android Studio是4.2 Canary 12,在创建的时候出现了
Warning: Different store and key passwords not supported for PKCS12 KeyStore, Ignoring user-specified -keypass value.

的问题,创建倒是可以创建,不知道能不能用。所以我还是乖乖的把store的密码和key的密码设成了一个

加密KeyStore

当然,对于开源项目来讲,直接将jks文件放上去不保险,有可能就被破译掉了。所以我一般会进行一波加密。在Linux环境下,可以使用openssl进行加密。我选择的是aes-256-cbc的加密方法,它需要两个数字

// encode
openssl enc -e -aes-256-cbc -iv <value1> -K <value2> -in <in_file> -out <enc_file> (-salt -pbkdf2)
// decode
openssl enc -d -aes-256-cbc -iv <value1> -K <value2> -in <in_file> -out <enc_file> (-salt -pbkdf2)

你可以随机生成,也可以取固定值(比如MD5、SHA1之类的)但是要千万记住这两个数。

配置Gradle
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值