Android组件化开发(七)--从零开始教你分析项目需求并实现

简介: 前面几篇文章我们封装了几个组件化功能组件:包括:**网络请求组件,图片加载请求组件,应用保活组件,音乐播放组件封装。**> 每个组件都可以直接拿到自己项目中使用,当然还需根据自己项目要求进行优化。
🔥 Hi,我是小余。

本文已收录到 GitHub · Androider-Planet 中。这里有 Android 进阶成长知识体系,关注公众号 [小余的自习室] ,在成功的路上不迷路!

前言:

前面几篇文章我们封装了几个组件化功能组件:包括:网络请求组件,图片加载请求组件,应用保活组件,音乐播放组件封装。

每个组件都可以直接拿到自己项目中使用,当然还需根据自己项目要求进行优化。

组件化开发.png
组件化相关系列文章:

Android组件化开发(一)--Maven私服的搭建(https://juejin.cn/post/7118646272323485709)

Android组件化开发(二)--网络请求组件封装(https://juejin.cn/post/7119281692350611493)

Android组件化开发(三)--图片加载组件封装(https://juejin.cn/post/7120791098775044103)

Android组件化开发(四)--进程保活组件的封装(https://juejin.cn/post/7121643256495996936)

Android组件化开发(五)--完整版音乐播放组件的封装(https://juejin.cn/post/7122869564299280415)

今天我们先来聊个话题:各位在接到一个项目,或者一个需求的时候,是如何去实行的?

  • 1.先分析需求,然后一边代码,一边想思路,最后实现了项目组给的需求任务
这种方式写出来的代码,往往质量较差,类与类之间,模块与模块之间耦合一般都比较严重,而且很容易出bug,现实中这类型的开发其实不占少数,
笔者在刚开始入行的时候,就是这样,没有一个很好的事件流去参考。
  • 2.分析需求后,再画流程图,根据流程图,设计好你需要的类以及待实现的功能类与类之间的关系是继承还是组合关系,回调机制该如何设计,是否需要使用到线程池,使用哪种线程池?对象或者代码是否可以复用可扩展性?设计出一张UML类图,最后根据我们前面分析的步骤去写代码.
注意写代码的时候也是有技巧的,不要急于实现某个类的具体功能,
先把类的架子搭起来。然后,再去一部一部实现内部的逻辑,这样我们的类就会越来越饱满

下面笔者用一个例子来带大家了解下第二种方式的项目实践过程

任务:项目组让我们去封装一个应用更新的组件

首先我们需要对需求进行分析:我们参考大部分应用更新的过程:

UI上有个按钮,点击之后,会去服务器获取是否有版本需要更新,检测到新版本后,这个时候会弹出一个提示Dialog,点击确认后我们就会去服务器下载数据,下载到一个文件中,然后调用原生的安装方法去安装。

根据上面的需求分析:笔者画了一个基本的流程图

下载更新流程图.png

好了有了流程图后:就要开始设计我们的类了。

  • 1.为了响应点击事件,可以设计一个UpdateHelper类:内部提供一个checkUpdate的方法:
public class UpdateHelper{
    //这个方法是直接供UI层调用的方法,可能需要传入一个上下文下来
    public static checkUpdate(Context context){
        //1.传入url去服务器拿版本信息,这里如果获取失败,需要提供一个异常响应给上层,不然UI层会以为我们代码有问题了
        //2.对比当前版本信息和获取的版本信息
        //3.弹出一个提示更新的Dialog,并显示当前版本更新的内容。
        //4.用户点击确认后就开始去服务器下载apk了
    }
}
  • 2.通过对checkUpdate方法的分析,我们了解到:

    • 1.需要设计一个版本更新提示的Dialog。暂且起名:UpdateDialog
    • 2.因为需要去服务器下载apk数据,可能得需要起一个后台Service去下载数据。
  • 3.好接下来我们设计这个下载任务的的Service

UpdateService

public UpdateService extends Service{
    
    onStartCommand(){
        //1.startDownLoad()
    }
    //实现数据的下载以及监听
    public startDownLoad(){
    
    }
}

这个UpdateService中我们目前只让他实现一个startDownLoad方法去下载数据。接下来就是设计这个startDownLoad了,我们可不可以把下载代码都写在这个方法中呢,当然是可以的,但是笔者觉得这样代码写的太笨重了,不够优雅,且不符合设计模式中说的单一职责

  • 4.于是笔者设计了一个UpdateManager的类:这个类是用来对当前下载请求做一些前期的准备工作
    比如:

    • 1.检查当前是否已经有下载请求在处理了,忽略重复请求
    • 2.判断当前文件和文件夹是否存在,是否有必要预先新建一个文件。
    • 3.创建一个下载任务Runnable放到线程池中。

根据上面分析,我们需要创建一个下载任务的Runnable
新建一个UpdateRequestRunnable继承Runnable

class UpdateRequestRunnable extends Runnable{
    //这个方法中才是真正去实现下载任务请求,创建一个realDownLoadApk,让用户知道哦这里才是真正的去下载。
    run{
        realDownLoadApk()
    }
    
    realDownLoadApk(){
        //1下载开始。。
        //2下载中 
        //3下载结束
    
    }

}

我们想下,下载进度,下载成功还是失败等是不是都要通知到用户呢?
是的,我们需要在通知栏起一个下载的通知提示用户我们目前的下载进度和下载状态

那这个通知在哪个类里面设计呢?

其实你在UpdateManager或者UpdateService中去处理都可以。
笔者是在UpdateServiceOnCreate方法中初始化了一个通知Notification

那有了通知,通知如何知道到底现在的下载进度,就需要使用到回调了,

  • 5.所以我们创建一个UpdateStatusListener,用来监听当前下载进度.

别忘了,我们还有最重要的一部,将下载的apk进行安装,安装任务放在哪个类里面好呢

  • 6.笔者这里用了一个LocalBroadcastManager

    • 注册时机:启动UpdateService的时候。
    • 发送时机:回调下载完成的时候。
    • 反注册UpdateService Destroy的时候。

尽量做到闭环

以上就是整个应用更新任务的分析过程:

  • 7.有了上面的分析,可以大概画出一个基本的UML类图:有了类图我们就可以将代码功能补全啦。
    应用更新.png
  • 1.开发中注意点:Android10权限升级:对于访问文件系统,需要添加
android.permission.MOUNT_UNMOUNT_FILESYSTEM

并在application中设置:

android:requestLegacyExternalStorage="true"
  • 2.如果需要应用间访问文件:需要使用:FileProvider进行文件分享
<!--文件共享-->
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>
  • 3.高版本上会出现通知栏无法显示的情况:需要判断通知栏是否打开,并调用显示通知栏界面的api,手动开启通知权限。

总结:

笔者使用一个应用更新的例子,阐述了我们接到需求到需求实践的整个过程。

学习最好的方式是学习别人的思维方式

目前已将这个应用更新的组件作为一个类库,成为了我们组件化大家庭的一部分。
,**:https://github.com/ByteYuhb/anna_music_app

组件化开发.png

相关文章
|
4天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
27天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
14 0
|
3天前
|
存储 Java Android开发
Android系统 设置第三方应用为默认Launcher实现和原理分析
Android系统 设置第三方应用为默认Launcher实现和原理分析
17 0
|
1天前
|
数据库 Android开发 开发者
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第24天】 在竞争激烈的移动应用市场中,一个流畅且响应迅速的用户界面(UI)是吸引和保留用户的关键。针对安卓平台,开发者面临着多样化的设备和系统版本,这增加了构建高效UI的复杂性。本文将深入分析安卓平台上构建高效用户界面的最佳实践,包括布局优化、资源管理和绘制性能的考量,旨在为开发者提供实用的技术指南,帮助他们创建更流畅的用户体验。
|
3天前
|
存储 Java Linux
Android系统获取event事件回调等几种实现和原理分析
Android系统获取event事件回调等几种实现和原理分析
24 0
|
3天前
|
Android开发
Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
2 0
|
18天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
21天前
|
监控 算法 Android开发
安卓应用开发:打造高效启动流程
【4月更文挑战第5天】 在移动应用的世界中,用户的第一印象至关重要。特别是对于安卓应用而言,启动时间是用户体验的关键指标之一。本文将深入探讨如何优化安卓应用的启动流程,从而减少启动时间,提升用户满意度。我们将从分析应用启动流程的各个阶段入手,提出一系列实用的技术策略,包括代码层面的优化、资源加载的管理以及异步初始化等,帮助开发者构建快速响应的安卓应用。
|
21天前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
23 1
Android开发之使用OpenGL实现翻书动画
|
21天前
|
Android开发 开发者
Android开发之OpenGL的画笔工具GL10
这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
18 1
Android开发之OpenGL的画笔工具GL10