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

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

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

前言:

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

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

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

Android组件化开发(一)--Maven私服的搭建

Android组件化开发(二)--网络请求组件封装

Android组件化开发(三)--图片加载组件封装

Android组件化开发(四)--进程保活组件的封装

Android组件化开发(五)--完整版音乐播放组件的封装

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

  • 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,手动开启通知权限。

总结:

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

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

目前已将这个应用更新的组件作为一个类库,成为了我们组件化大家庭的一部分。

相关文章
|
7天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
9天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
9天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
10天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
22 2
|
11天前
|
Android开发
布谷语音软件开发:android端语音软件搭建开发教程
语音软件搭建android端语音软件开发教程!
|
6月前
|
存储 Java 开发工具
Android开发的技术与开发流程
Android开发的技术与开发流程
400 1
|
3月前
|
移动开发 搜索推荐 Android开发
安卓与iOS开发:一场跨平台的技术角逐
在移动开发的广阔舞台上,两大主角——安卓和iOS,持续上演着激烈的技术角逐。本文将深入浅出地探讨这两个平台的开发环境、工具和未来趋势,旨在为开发者揭示跨平台开发的秘密,同时激发读者对技术进步的思考和对未来的期待。
|
3月前
|
安全 Android开发 Swift
安卓与iOS开发:平台差异与技术选择
【8月更文挑战第26天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各占一方。本文旨在探索这两个系统在开发过程中的不同之处,并分析开发者如何根据项目需求选择合适的技术栈。通过深入浅出的对比,我们将揭示各自平台的优势与挑战,帮助开发者做出更明智的决策。
70 5
|
3月前
|
移动开发 开发工具 Android开发
探索安卓与iOS开发的差异:技术选择的影响
【8月更文挑战第17天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文通过比较这两个平台的编程语言、开发工具及市场策略,揭示了技术选择对开发者和产品成功的重要性。我们将从开发者的视角出发,深入探讨不同平台的技术特性及其对项目实施的具体影响,旨在为即将步入移动开发领域的新手提供一个清晰的指南,同时给予资深开发者新的思考角度。
52 3
|
3月前
|
编解码 Android开发 iOS开发
安卓与iOS开发:平台差异下的技术创新之路
在数字时代的浪潮中,移动应用开发如同两股潮流——安卓与iOS,各自携带着独特的技术生态和文化基因。本文将深入探讨这两大平台的开发环境、编程语言和工具的差异,以及它们如何塑造了不同的用户体验和技术趋势。通过比较分析,我们旨在揭示跨平台开发的可能性和挑战,同时探索未来技术创新的方向。让我们一起跟随代码的足迹,穿越安卓的开放草原和iOS的精密园林,发现那些隐藏在平台差异之下的创新机遇。
43 1