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

总结:

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

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

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

相关文章
|
21天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
42 19
|
21天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
46 14
|
20天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
21天前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
21天前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
29 0
|
7月前
|
存储 Java 开发工具
Android开发的技术与开发流程
Android开发的技术与开发流程
410 1
|
4月前
|
安全 Android开发 Swift
安卓与iOS开发:平台差异与技术选择
【8月更文挑战第26天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各占一方。本文旨在探索这两个系统在开发过程中的不同之处,并分析开发者如何根据项目需求选择合适的技术栈。通过深入浅出的对比,我们将揭示各自平台的优势与挑战,帮助开发者做出更明智的决策。
79 5
|
4月前
|
移动开发 搜索推荐 Android开发
安卓与iOS开发:一场跨平台的技术角逐
在移动开发的广阔舞台上,两大主角——安卓和iOS,持续上演着激烈的技术角逐。本文将深入浅出地探讨这两个平台的开发环境、工具和未来趋势,旨在为开发者揭示跨平台开发的秘密,同时激发读者对技术进步的思考和对未来的期待。
|
4月前
|
移动开发 开发工具 Android开发
探索安卓与iOS开发的差异:技术选择的影响
【8月更文挑战第17天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文通过比较这两个平台的编程语言、开发工具及市场策略,揭示了技术选择对开发者和产品成功的重要性。我们将从开发者的视角出发,深入探讨不同平台的技术特性及其对项目实施的具体影响,旨在为即将步入移动开发领域的新手提供一个清晰的指南,同时给予资深开发者新的思考角度。
64 3
|
4月前
|
编解码 Android开发 iOS开发
安卓与iOS开发:平台差异下的技术创新之路
在数字时代的浪潮中,移动应用开发如同两股潮流——安卓与iOS,各自携带着独特的技术生态和文化基因。本文将深入探讨这两大平台的开发环境、编程语言和工具的差异,以及它们如何塑造了不同的用户体验和技术趋势。通过比较分析,我们旨在揭示跨平台开发的可能性和挑战,同时探索未来技术创新的方向。让我们一起跟随代码的足迹,穿越安卓的开放草原和iOS的精密园林,发现那些隐藏在平台差异之下的创新机遇。
47 1