软件工程-小米便签部署,代码结对泛读

一、小米便签项目部署

上周刚下载的Android Studio,运行完第一个helloworld。
github上扒下来小米便签的代码,真的 纯小白,根本不会部署

项目地址:
小米便签-github
在这里插入图片描述

1、删除原项目环境 替换为自己的——没成功

原项目为gradle项目可直接参考该文章部署,因小米便签原为eclipse项目,不能这样(两种项目的差别在后续有介绍)
看了一篇文章说是:参考文章

删除项目中原开发者的机器环境,替换为自己的机器环境

由于库的作者的开发环境(as的版本,sdk的版本,buildtool等和我们当前本机开发环境的不同,所以gradle的相关的文件和文件夹就会产生很大差异)

正常需要替换为自己机器的开发环境涉及到以下文件夹:
gradle 文件夹 (必须)
build.gradle (必须)
gradle.properties (必须)
.gradle 文件夹 (非必须)

替换为自己机器的环境很简单,只要你用Android Studio创建一个新的项目,然后将上面四个文件放到开源项目里面即可,同时记得将作者的开源项目里面的gradle文件给删掉。

原项目:
在这里插入图片描述

添加了自己初始helloworld的那个项目的几个文件
修改后:
在这里插入图片描述

gradel可以成功build,但是
在这里插入图片描述
在这里插入图片描述
文章的评论区也有好多人遇到这样的问题
然后就是还看了一大堆教程和gradle的一些解决,脑壳都难受了,解决来解决去就是一直不行
(遇到了好多问题,就简单写这一个吧)

参照方法二的解释,明白了该项目是eclipse项目的问题,找不到gradle tasks。要转换为gradle项目,所以直接这样是不行的

2、eclipse项目转换为AS下的gradle项目

小白兢兢业业瞎研究半天,发现老师的作业里给了构建参考,好,成功被自己无语到。原来:
由于小米便签的源代码最后修改时间是在9年前,那时候的代码使用一种叫Eclipse的Java开发工具开发,因此,我们需要将其转换成能在Android studio下运行的gradle项目

Android Studio默认使用 Gradle 构建项目, Eclipse 默认使用Ant构建项目。建议Android Studio导入项目时,使用 Gradle 构建项目。

小米便签构建参考

类似于IDEA中导入项目:
1)Create project from existing sources: 只能导入由idea创建的项目源码

2)Import project from external model:导入Eclipse/Flash Builder等创建的项目,这些项目将会被成功的被转idea项目文件。

参照网上idea导入好像应该是这样的:(然后导入选eclipse项目)
在这里插入图片描述

问:但是为什么我的导入外部项目没有eclipse的选项??而我本来就是不是gradle项目呀,我想把它变为gradle项目,但为什么只有这个选项唉…疑惑
答:…

在这里插入图片描述
网上看到idea中是setting->plugin->下载eclipse的插件就行
但android studio中好像没有类似的插件(或许有人知道插件是什么吗)

解决了半天网上没有类似的问题回答,询问chatgpt:

非常抱歉,最新版本的 Android Studio 中已经不再直接支持从外部模型导入 Eclipse 项目。在这种情况下,你可以手动迁移 Eclipse 项目到 Android Studio 中。

2.1 错误示例×××:

本人头铁将错就错直接选了那个gradle唉
然后:
Directory 'D:\project_all\Android\Notesmaster1\Notes-master' does not contain a Gradle build.

浅浅放一下gradle相关的一点基础知识~
在这里插入图片描述
跳转到 gradle浅析-知识

Directory ‘D:\project_all\Android\Notesmaster\Notes-master’ does not contain a Gradle build.

在这里插入图片描述
——建立第一个AS项目helloworld的时候gradle出现connect time out 的问题,应该是因为google太慢了然后根据以下文章的方法二换了源,而没有在本机下载gradle

【Android Studio】Gradle sync failed in xx s xxx ms;Connect timed out;Could not install Gradle dis解决方案
发现这篇文章突然要会员才能看了 =.=
呼没有会员 那就按照我的记忆复述一下:

ps.写个插曲:Gradle sync failed in xx s xxx ms;Connect timed out;Could not install Gradle dis解决方法
  • step1:
    gradle-wrapper.properties中改一下distributionUrl
    记得根据自己的版本来稍修改嗷!distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.2-bin.zip
    在这里插入图片描述
  • step2:
    然后改这个文件~
    在这里插入图片描述
    代码:
pluginManagement {
    repositories {
        maven { url = uri("https://maven.aliyun.com/repository/public/") }
        maven { url = uri("https://maven.aliyun.com/repositories/jcenter") }
        maven { url = uri("https://maven.aliyun.com/repositories/google") }
        maven { url = uri("https://maven.aliyun.com/repositories/central") }
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url = uri("https://maven.aliyun.com/repository/public/") }
        maven { url = uri("https://maven.aliyun.com/repositories/jcenter") }
        maven { url = uri("https://maven.aliyun.com/repositories/google") }
        maven { url = uri("https://maven.aliyun.com/repositories/central") }
        google()
        mavenCentral()
    }
}
  • step3:
    那个方框3的路径详细到gradle-8.2-bin (根据自己的版本)
    在这里插入图片描述

(分割线)

回到正文:
在这里插入图片描述
本小白默默的去那个helloworld项目复制了上述文件进来
在这里插入图片描述
虽然build成功了,但是!!!(唉,转折的话才是最重要的)其实我现在这个本质还是跟方法一,一样
在这里插入图片描述
这个项目的结构根本不是gradle的呜呜!!!!
在这里插入图片描述
所以,又面对了和第一次一样的错误:
在这里插入图片描述

*头铁人不撞南墙不死心,知错就错,果然就是会报错 *
总结:浪费时间浪费心情

2.2 换软件版本——小白的白痴解决之道

从往届学长那获取了他的软件压缩包,重新下载Android Studio=.=
(受不了了,搞三天了 还要学其他的呢,想出的下策)
再参考小米便签搭建的几个博客:
1、老师给的搭建架构参考
2、驼同学的文章
3、小米便签开源项目本地环境搭建与分析

其实主要参考 2、驼同学的文章(超级详细)跟着一步步搭建,
一些不一样的小问题再额外CSDN上搜索

列举一个乱码小问题:
解决乱码问题:
在这里插入图片描述

  • shift按两下出现搜索框
    在这里插入图片描述

  • studio64.exe.vmoptions 下添加-Dfile.encoding=UTF-8语句
    在这里插入图片描述
    好像对我没用…重启项目后错误还是乱码表示

在设置中找到File Encoding,里面都设置UTF-8
在这里插入图片描述

重启,成功了,错误提示变成中文了
在这里插入图片描述
(要是不成功,还有问题的话,也可能是setting->font的字体问题,有些字体不支持中文)

解决依赖问题
参照学长博客
在这里插入图片描述
路径记得到 lib

build.gradle (:app) 中自动生成了

在这里插入图片描述

finally,感动天感动地

在这里插入图片描述

3.小米便签的一些无法显示的功能的实现(功能终于全面咯!)

写到后边画UML图了突然发现老师说的那些功能有些根本找不到在哪,回过头来小改一下项目

问题:打开小米便签都没有他的功能栏,但是看到其他人的小米便签上就会显示相应的功能栏,并且在代码中也会有相应功能的代码,但是就是不显示。

style.xml下修改这两行代码,原本是none的改为visible,并把上一行注释掉
(如下所示)
在这里插入图片描述

原本运行没有菜单项:
在这里插入图片描述
出来咯!!
在这里插入图片描述
原本显示不了的删除功能也出来啦!
在这里插入图片描述
在这里插入图片描述

二、源码放入仓库中——gitee

写在前头,介绍一个好用的图形化软件——TortoiseGite
跳转到安装使用教程

1、初始化仓库

  1. 新建一个小米便签的仓库~

在这里插入图片描述

  1. 把仓库clone到本地
    在这里插入图片描述
    填写创建仓库的URL

在这里插入图片描述

在这里插入图片描述

  1. 将项目复制进src
    在这里插入图片描述

  2. 右键选择add(将这些文件加入暂存区):
    在这里插入图片描述

  3. commit——将暂存区内容添加到本地仓库中
    (也可以右键提交)
    在这里插入图片描述
    在这里插入图片描述

  4. 第一次提交,直接:提交(commit)并推送(push)就可以!
    在这里插入图片描述

  5. 进来了~
    在这里插入图片描述

2.创建dev分支

实践操作参考:组长组员两个人协同开发:组长负责维护开发分支dev,组员向dev上传提交;当dev测试合适后,组长有唯一权限向master上传作为最终结果。
① 远程仓库有master和dev两个分支
② 组长本地有master和dev分支,分别关联对应的远程分支
③ 组员本地只有一个分支,关联远程dev分支【可以选择clone某一个远程分支到本地】
④ 具体开发流程是:

  1. 组长和组员分别在各自的本地dev分支开发,有阶段性成果后push到远程dev【若有冲突,解决冲突再合并】
  2. 当开发完成、结果稳定后,组长将本地的master和dev分支merge,再把master分支push上去

在这里插入图片描述

三、结对泛读代码(小米便签)

1、用例图(UML)

用例图介绍(就看简介就好了,例子感觉画的有点问题)
老师的课件中其实也有介绍,但还是习惯贴网上的资源hh

包含关系与拓展关系区别:
我的理解

  • 包含关系 include
    用户一定得输入密码与检验密码才能进行取款
    在这里插入图片描述
  • 扩展关系 extend
    导出excel只是查询上机记录的一个衍生功能,可用可不用
    在这里插入图片描述

老师给的介绍的小米便签的功能:

功能特点:
① 快速新建,自动保存,自由分类;
② 与Google Task同步,方便将本地便签上传、谷歌工作表中的工作项同步到本地; (没找到)
③ 独特的清单模式,简单方便的管理事务;(没找到)
④ 闹钟提醒,发送便签到桌面、快速分享.(没找到)
⑤ 文本中对邮箱、电话号码、网址的识别,方便快速操作

UML用例图:
在这里插入图片描述

2、体系结构图(包图)

项目目录:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

其中java代码主要分为
data,gtask,model,tool,ui,widget六个模块

在这里插入图片描述

在这里插入图片描述

3、类之间的调用关系图

如何找到小米便签类间关系

3.1 类间关系的种类、语法、语义、例子和符号

类间关系的种类,它分为六个分类:继承(泛化)、实现、关联、聚合、组合、依赖。

它们所对应的语法分别是
(1)继承(泛化)关系:extends
(2)实现关系:implements
(3)关联关系:某类作为另一类的成员变量
(4)聚合关系:某类作为另一类的成员变量(整体和部分可分离)
(5)组合关系:某类作为另一类的成员变量(整体和部分不可分离)
(6)依赖关系:某类使用另一类作为自己的方法的参数(或者局部变量)存在

类间关系的语义和例子

  • 继承(泛化)关系: 某类继承另一类的功能,并可以增加它自己的新功能(交通工具和汽车)
  • 实现关系:类和接口之间的关系(就像电脑开机需要按下开机按钮这个接口来实现)
  • 关联关系:比依赖关系强,分为单向关联(唐僧和徒弟:前者类中与后者关系强烈,后者类中与前者关系不强)、双向关联(学生和学生证)和自身关联(领导自身也是员工)
  • 聚合关系:整体和部分的关系,且两者可分割(球队和教练、球员)
  • 组合关系:整体和部分的关系,且两者可分割(人和手、腿、头)
  • 依赖关系:一个类A使用到了另一个类B,这种关系弱于关联,但是类B的变化会影响到类A(人和他掌握技能)

符号:
(1)继承关系由子类指向父类
(2)实现关系由功能指向接口
(3)单向关联:若类A含有类B,则由类A指向类B
(4)聚合关系:由部分指向整体
(5)组合关系:由部分指向整体
(6)依赖关系:若类A使用类B,则由类A指向类B

为了加强理解,参照下图(引用别人的)
在这里插入图片描述

3.2 小米便签中各类类间关系的寻找方法

1. CTRL+鼠标左键

在Android Studio里,CTRL+鼠标左键点击某一类,可以查看整个项目引用该类的地方。

在这里插入图片描述
2. CTRL+F

  • 在任何一个编译器里CTRL+F都是搜索的快捷键。该功能能搜索到该文本下出现你所输入关键字的地方。

在这里插入图片描述

ctrl+shift+f 在整个项目中查找
在这里插入图片描述
3.了解项目类的框架,理解类的基本功能

上述两个方法只适用于继承和实现两个类间关系的寻找。而对于关联、聚合、组合、依赖这四个关系,通过上诉的他们的语法可知前三者可以在类的成员变量中寻找,依赖关系可以在类的方法的参数(或者局部变量)中寻找,但是还是需要理解类的基本功能来判断是否属于哪一项。

3.3 小米便签类间关系图

小米便签一共有10000多行代码,包括41个类和170个文件,其中类太多了,而本次任务是泛读代码,所以只画一些关键的类间关系

1. ui里的继承类间关系
在这里插入图片描述

2. ui里的实现类间关系

在这里插入图片描述

3.4 小米便签包类树状图

在这里插入图片描述
在这里插入图片描述
上图引用自:小米便签包类树状图

4、核心类的主要作用

4.1 核心类

本人觉得小米便签——便签——便签——便签,
so其中基础核心类应该是note(单个便签项)

在这里插入图片描述
note类被WorkingNote类引用
在这里插入图片描述
WorkingNote类在NoteEditActivityNoteListActivity(该两是起着编辑便签,展示便签作用的大哥大)中起着至关重要的作用
在这里插入图片描述
所以我觉得Note类是核心类

Note的作用:呈现在用户面前的文本在后端的组织方式

4.1.1 ContentValues

在这里插入图片描述

它是一个继承于Object类和 Parcelable接口的一个final类。Parcel是一个被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递,而只有实现了Parcelable接口的类才能被Parcel封装,以此实现高效的数据传输。

如果说用命令行操作数据库太麻烦了,android为大家提供了一个ContentValues可以操作数据库,而在小米便签中,就是利用的这个类进行的数据库的操作。

ContentValues有一个类似于JOSN的键值对应组织类型,可以利用put函数实现一个string对应一个类似于int,string的基础数据类型,但是不能够储存对象,然后通过数据库的插入方式将此类插入。

在小米便签中,先是利用put函数插入必要数据:
在这里插入图片描述
这里主要插入的是一个便签对应的创造时间,修改时间,类型等信息。后再进行数据库操作
在这里插入图片描述

4.1.2 Note的组织方式

Note最主要的有两个成员变量,一个ContentValue,另一个是NoteData
在这里插入图片描述
根据变量名可以看出,第一个成员变量主要储存一些日志信息,包括一些创造日期,修改日期,日志的打印和报错等都和这个类有关系。

另外还会通过一些put函数储存其他的信息:
在这里插入图片描述
这里的第一个函数显然是一个未定义的信息储存,主要还是作为一个其他信息的补充。而后两个的信息插入是标记本地修改以及调用系统函数获得修改时间。这里其他的功能大致如此。

而真正出现在用户视野的文本信息是储存在下面的。

4.1.3 NoteData的组织方式

NoteData这个类就是专门用以储存文本信息的类;在小米便签中有一个很小的人性化设计,就是为了方便用户操作,专门为储存在便签里的电话号码单独用一个成员变量储存:
在这里插入图片描述
主要包括两个ContentValues实例,和两个用以保存id号的long。

而保存文本的函数主要是:
在这里插入图片描述
这里报错文本和电话号码的函数几乎是一样的,一个用于储存文本和电话号码。另外两用来保存其他日志信息。

再利用context提交至数据库。
在这里插入图片描述

4.2 核心组件(谈Activity)——供自己后续学习

Android四大核心组件

  • Activity
  • Service
  • BroadcastReceiver
  • ContentProvider

Intent并不是Android应用程序核心组件,但是Activity,Service,BroadcastReceiver之间互相通信使用的消息使用的就是Intent

主要谈Activity:

4.2.1 Activity类简介
  • 在Android开发中,Activity是一个表示用户界面的组件,它通常会占据屏幕的一部分,并且可以包含用户交互的控件。
  • Activity是Android应用程序的基本构建块之一,它可以接收来自其他应用程序或系统的意图(Intent)并展示相应的界面。 Activity的作用是实现应用程序的界面和交互逻辑,每个Activity通常会呈现一个特定的界面,它可以包含用户输入控件以及展示数据的视图。
  • 可以使用 startActivity() 或 startActivityForResult() 方法启动新 Activity。这两种方法都需要传入一个 Intent 对象,从而实现不同的用户交互场景。
  • 同时,Activity还可以接收来自其他应用程序或系统的Intent,例如打开一个网页或者拍照等操作。
4.2.2 Activity生命周期、7种回调
  1. onCreate():必须实现此回调,它会在系统创建你的 Activity 时触发。你的实现应该初始化Activity的基本组件。
  2. onStart():此回调包含 Activity 进入前台与用户进行互动之前的最后准备工作。到了这一步用户可见不可交互。
  3. onResume():此时,该Activity位于Activity堆栈的顶部,并会捕获所有用户输入。应用的大部分核心功能都是在onResume()方法中实现的。到了这一步用户可见可交互。
  4. onPause():当用户点按"返回"或"最近使用的应用"按钮时,Activity失去焦点并进入"已暂停"状态时,系统就会调用onPause()。到这一步用户可见不可交互。系统会停止动画等消耗CPU的操作。
  5. onStop():到了这一步用户不可见。停止动画和刷新UI等。
  6. onRestart():当处于"onStop()"状态的Activity即将重启时,系统就会调用此回调。会从Activity停止时的状态恢复Activity至运行状态。
  7. onDestroy():这是Activity最后一个方法。可以用isFinishing()来判断它,如果有dialog在运转,要在这个界面将dialog给cancel掉,不然抛异常。
    在这里插入图片描述
    (图源网上)
4.2.3 Activity类4种状态
  1. 运行状态(Running):当Activity处于栈顶并且用户可以与其进行交互时,Activity处于运行状态。此时Activity在前台运行,可以接收用户输入和发送广播。
  2. 暂停状态(Paused):当Activity失去焦点但仍然可见时,Activity会进入暂停状态。此时Activity仍然在前台运行,但不能接收用户的输入事件。在该状态下,Activity仍然可以执行一些轻量级的操作,比如更新UI、响应系统事件等。
  3. 停止状态(Stopped):当Activity不再可见时,Activity就会进入停止状态。此时Activity不再在前台运行,但它的状态仍然得以保存,即便在系统内存不足而被销毁后也可以通过状态恢复重新创建。在该状态下,Activity可以执行一些轻量级的操作,比如保存数据、释放资源等。
  4. 销毁状态(Destroyed):当Activity被销毁时,Activity就进入了销毁状态。该状态下Activity已经被彻底回收,无法恢复,所有的关联资源都已经被释放。
    在这里插入图片描述
    (图源网上)
4.2.4 Activity类在小米便签中的体现

Activity类在小米便签中一共有四个,都存在于ui包中,分别是:NotesListActivityNoteEditActivityAlarmAlertActivityNotesPreferenceActivity

为什么Activity类是在AndroidManifest.xml中声明一遍?有什么特殊含义?

  1. 系统识别:通过在AndroidManifest.xml文件中声明Activity类,系统可以识别应用程序中包含的所有Activity。这样系统就知道了应用程序具有哪些可启动的组件,从而能够正确地管理和调度这些组件。就是说我只有在这个文件中声明过的Activity类才能够使用,才算是合法。

  2. 权限声明:在Activity的声明中,可以包含应用程序需要的权限声明。这样可以告知用户应用程序需要访问哪些系统资源或执行哪些敏感操作,提高了应用程序的透明度和用户对应用程序行为的控制。

  3. 启动配置:在Activity声明中可以指定Activity的启动模式、标志位、主题等配置信息,从而影响Activity的启动行为和显示效果。

  4. 生命周期管理:在Activity声明中可以指定Activity的生命周期回调方法,这样系统就能够按照声明的配置来调度Activity的生命周期,从而实现对Activity状态的管理和控制。

在AndroidManifest.xml文件中声明Activity类是非常重要的,它不仅告知系统应用程序的结构和组件,还提供了配置和管理这些组件的重要信息。

除了android:name其它几行又是什么意义?

NoteEditActivity:
在这里插入图片描述
这段代码是在AndroidManifest.xml文件中声明了一个名为NoteEditActivity的Activity,并对其进行了一些配置和设置。其中的各个部分:

  1. android:name=“.ui.NoteEditActivity”:指定了Activity的类名,使用了相对路径的方式指定了Activity所在的包名(当前包名)。

  2. android:configChanges=“keyboardHidden|orientation|screenSize”:指定了当键盘隐藏、屏幕方向或屏幕尺寸发生改变时,Activity不会重新创建,而是系统会调用onConfigurationChanged()方法来处理这些变化。

  3. android:launchMode=“singleTop”:指定了Activity的启动模式为singleTop,表示如果新的Activity正好在栈顶,就不再创建新的实例,而是直接复用栈顶的实例。

  4. android:theme=“@style/NoteTheme”:指定了Activity所使用的主题样式。

  5. <intent-filter>:定义了Activity可以响应的Intent类型。其中包含了三个<intent-filter>,分别指定了该Activity可以响应的三种不同的Intent:VIEW、INSERT_OR_EDIT和SEARCH。

  6. <meta-data>:定义了一些与搜索相关的元数据,这些元数据可用于配置搜索功能的行为。

通过在AndroidManifest.xml文件中对Activity进行这些配置,可以影响Activity的启动模式、主题样式、响应的Intent类型等行为,从而实现对Activity的定制和控制。

  • 41
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值