|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
-
- Android Studio 配置:
- Arctic Fox 2020.3.1
- classpath "com.android.tools.build:gradle:7.0.1"
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20"
- distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
-
- gradle 版本管理
- ext.android : app版本信息
- ext.version : 依赖包版本信息
- ext.dependencies_required : 必须的依赖项
- ext.dependencies_testImplementation : 测试依赖
- ext.dependencies_androidTestImplementation : 测试依赖
- ext.dependencies_custom : 自己添加的依赖项,按需定制
-
- androidx.appcompat:appcompat 自带jetpack中的lifecycle、viewmodel、livedata
-
- app:
- module : 按模块进行业务划分
-
- common:
- app: 获取application
- base: 存放业务的基础类
- activity、fragment、adapter的基类
- eventbus: livedata的事件总线
- 粘性事件: 不管先注册还是先发送消息,都能收到消息
- 非粘性事件: 必须先注册,再发送消息,如果先发送消息,再注册,则先发送的消息是监听不到
- util : 工具类,包含Kotlin的扩展属性
-
- media包: 实现音视频的播放封装
- test音频: val source = listOf("http://ws.stream.qqmusic.qq.com/C4000017AcyB00D6Cr.m4a?guid=395745734&vkey=9CF75D8FDE45B1A7755C15F93C5F74CC18E444873F498DF3F5B9F0B41889778BE0EAC45305BD444F90D777C612BC5865DB0AF55A318854E1&uin=&fromtag=66"
- ,"http://ws.stream.qqmusic.qq.com/C400001lePVO36SNSo.m4a?guid=748677131&vkey=A6077E31CB4A1C8A4F3D5D2BEDE8D3E16AB69FF2FEE95D9D48288EAD048AB89DC53B6846D184F842257617AF9714D97C864FB183BE05CC66&uin=&fromtag=66"
- ,"http://ws.stream.qqmusic.qq.com/C400000ZFBf22vBvrf.m4a?guid=921100582&vkey=C9EA33972404E2AC1C80A479614AD44A9BF132A16F9B307D9515F595B41901AE53F6681E28BDA799FC047F30D624F8A19AE9C4856ADBEF4B&uin=&fromtag=66")
-
- image包: 实现了图片加载的封装
-
-
- 防快速点击和跳转限制:
- 1 扩展点击事件和效果 -> ViewClickExtension.kt 类
- https://www.cnblogs.com/zh2314372037/p/13965371.html
- 2 BaseActivity覆写 startActivityForResult(intent: Intent, requestCode: Int, options: Bundle?),检查目标和间隔时间,判断是否可以跳转新的Activity
- https://blog.csdn.net/ziyexiaoxiao/article/details/85292729
-
- 注意include为merge的坑,viewbinding中需动态绑定 https://juejin.cn/post/6844904065655111693
-
- 讨论点:
- 状态加载的判断: 加载复习状态页没问题,学前总测试状态页也没问题,
- 但如何判断课程学习完成,目前是课程学习完成后才判断进入课程学后总测试
- 我的考虑是在进入课程详情界面时,对所有课时的学习进度进行判断,不包含课时的学后测试,当所有课时都学习完了,则进入学后总测试的状态页,
- 而在学习中,同样做引导课时前测试,学习,课时后测试,
- 课时后测试将包含 小游戏练习、再测一次、重新学习、下一步(进入学后总测试)或者下一课时(为当前课时的下一课时),
- 需要考虑的是,下一步或者下一课时的判断为循环判断,如,共10课时,现在点击学习的第5个,如果后面几个课时都学习完后,而1课时没有学习完成,下一课时将直接进入1课时的学习,
- 而下一步是在所有课时都学习完成的情况下,直接进入学后总测试的界面。
- 学前总测试 :不让跳过,必须测,用于进行界面判断 和 统计的判断
- 课时学前测试: 不让跳过,必须测,不然对统计和判断有影响
-
- 作文如何记录每个课时是否学习完成:
- 1 视频 : 1)保存播放的时间点 2)保存有效和总时间 3)保存进度点( 学习完成entityId设置为负值,未学习完成为正值)
- 2 知识点速记 : 和英语课时一样处理
- 3 知识点测试:添加一个单词作为进度点, 学习完成有进度,否则没有进度
- 4 课堂练习: 设置了进度点(为当前显示的entityId)
- lesson的learnedIndex 为当前位置,但在学习的时候,需要对当前位置进行-1,第一次学习,初始时,必须为0
- 学习完成entityId设置为负值,未学习完成为正值
-
-
-
- Kotlin的单例模式: https://developer.aliyun.com/article/642618
- 饿汉式(直接获取实例)、懒汉式(一次判空获取实例)、双重校验锁
- object 声明: 为饿汉式单例,即直接实例
- 数字精度格式: https://www.jianshu.com/p/5286a44ed9b1
- Material Design Components 组件使用 https://www.jianshu.com/p/bc71b4179cb2
-
- // Android Gradle 插件 4.0,下述配置不再是必需的,并且会导致构建失败。外部原生 build 现在会自动打包这些库,因此使用 jniLibs 明确打包库会导致重复。
- // sourceSets {
- // main {
- // jniLibs.srcDirs = ['libs']
- // }
- // }
-
-
- 自建数据库
- 实现口语收藏、作文笔记收藏
- CourseMainFragmentViewModel.loadmain()
-
- 测试的时候注意一下,如果课程包的数据库进行误删不存在的情况下,如何进行规避!
- 日历控件使用研究
-
-
- 计算当前词汇量,课程完成/重学的时候调用一下;重学直接程序帮忙调用
- public native long calcCurrentVocabulary(long projectID) throws Exception;
- 计算学习效率(综合学习效率和课程效率)
- public native void calcEfficiency(projectID, packID, courseID) throws Exception;
-
- 课程学习、时长信息
- public native String courseDetail(projectID, packID, courseID ) throws Exception;
- 速记课程排序列表 进度
- public native String courseSorted(long projectID ) throws Exception;
-
- 词条数统计 近90天词条数统计
- public native String entityCountList(long projectID, long gradeID ) throws Exception;
- 获取已学课程ID列表
- public native String getLearnedCourseIDList() throws Exception;
- 获取正确/错误词汇列表
- public native String getWordList(long projectID, long packID, long courseID, long categroy ) throws Exception;
-
- 保存数据struct.Record
- public native void parseData(String var1) throws Exception;
- 重学
- public native void relearn(long var1, long var3, long var5, long var7, long var9, double var11, double var13, double var15) throws Exception;
- 保存已学课程ID
- public native void setLearnedCourseID(long var1, long var3, long var5) throws Exception;
- 设置视频播放点
- public native void setVideoPoint(long var1, long var3, long var5, long var7, String var9) throws Exception;
- 统计信息
- public native String statisticsCenter(long var1, long var3) throws Exception;
-
- 设置课程学习点,同时会更新对应lesson的进度点
- public native void setLearnPoint(long var1, long var3, long var5, long var7, long var9, long var11) throws Exception;
- GetVideoPoint 获取视频播放点
- public native String getVideoPoint(long var1, long var3, long var5, long var7) throws Exception;
- public native void gameFinished(long var1, long var3, long var5, long var7, long var9) throws Exception;
- public native void changeLocker(long var, long var3, long var5, long var7, long var9, boolean var11) throws Exception;
- public native void delLearnedCourseID(long var1, long var3, long var5) throws Exception;
- public native void destroy();
-
- 启动:
- - 检查uuid 生成uuid
- - 检查licence,没有licence 跳转进行设备账号激活
- - 激活成功 拉取绑定的课程列表
- - 拉取成功后保存本地,拉取失败,使用本地数据,本地没有数据,提示重新拉取,否则无法进入项目
- - 下载课程、复制本地数据(词典、测词汇量)
- - 进入课程
|