system: [SYSTEM]

user: 2. 设计与实现 2.1. 结构设计目标 客户端(界面)使用Android Studio [ 3 ] 和java JDK工具开发，主要展示用户的各种操作和操作结果的界面，为用户提供简洁明了的界面操作，例如添加、修改、删除具体任务以及模式选择等各种操作。 后台服务使用Android的广播信息机制和Server组件对相应的用户请求和各时间进行处理，并使用开源数据库框架LitePal [ 4 ] 对SQLite数据库 [ 5 ] [ 6 ] 进行管理和操作。保存用户输入的数据和一些系统文件数据。前台和后台使用逻辑语言控制，使两者进行相应的交互。 根据对结构和需求的分析 [ 7 ] ，软件的开发目标如下： 1) 用户可以按照需求选择不同的静音设置模式。 2) 不同模式中可以按照模式功能设置相应的静音任务。 3) 在当前静音任务结束时，如果没有其他的任务，应使手机回复原来的状态。 4) 对一个任务可以暂时的关闭和开启。 5) 静音模式下设置白名单。 6) 不同的联系人可以设置不同的来电铃声。 软件的功能结构图如图1所示。 根据系统的设计和功能分析，音效管理软件的层次结构如图2所示。 2.2. 软件功能 1) 自定义定时静音 该模式下，用户可以设置周一至周日中的一天或者几天的任意时间段的定时静音，为每一个任务设置不同的任务标签，静音模式可以为静音或振动。保存的任务以列表的形式显示出来，每一个任务列表 图1. 功能结构图 图2. 系统层次结构图 都带有一个开关以方便用户对其随时关闭和开启，避免经常的删除和添加同一个任务。 2) 整时定时静音 整时静音模式是将一天的二十四小时按照零点至六点为一个时间段，六点至二十四点每隔一小时为一个时间段，时间段的开始时间和结束时间已经设置好，用户只需选择相应的时间段即可，虽然限制了时间的设置，但是对于添加这种任务的用户来说更加的方便。 3) 教学定时静音 教学模式顾名思义是按照教学课表时间划分一天的时间段的，每一堂课的时间就是一个定时任务的时间长度。该模式分为夏令作息和冬令作息两个模块，添加课程名即添加静音任务，同时静音列表同时也是一张课程表。 4) 静音白名单 白名单的设置是为了避免在静音状态下错过重要的来电，为此在设置静音之前可以将认为重要的联系人的号码添加到白名单中，名单中的联系人来电时将会继续响铃而不影响静音任务的正常执行。 5) 来电铃声设置 来电铃声的功能和一般手机系统的铃声设置不同的是可以为每一个联系人设置不同的来电铃声且可以不同于系统设置。这种方式也可以作为一种铃声式的来电号码显示，根据来电铃声判别联系人。 2.3. 功能实现 2.3.1. 客户端 系统客户端是用户唯一接触到的部分，所以界面的布局设计和操作性能直接影响用户对软件的使用。简洁明确的界面布局要求功能层次之间的逻辑清晰和功能之间的切换流畅，文字与图标相结合是界面更加的丰富。操作流畅在于开发技术和数据逻辑的使用，良好的技术和清晰的逻辑影响着数据的传输和操作性能。 据以上性能可以得到客户端的结构布局如图3所示。 2.3.2. 后台服务 后台服务是整个系统正常运行的保障，包含了部分功能的实现和整个系统的数据管理。后台服务保障的这部分功能需要一直运行，不管用户正在操作软件还是软件处于后台运行的状态。而其他部分功能只有在用户操作软件时才会自动启动，所以并不需要后台服务的支持。在用户操作软件时和软件处于后台运行状态时都需要访问数据库，所以后台服务必须全程保障对数据的管理功能。 部分功能运行的保障。如定时静音功能，在系统不是人为结束时，必须保证某些功能的长期运行，需要Android组件 [ 8 ] 中的服务Service和进程守护的结合；其中的来电铃声功能需要接受到手机的广播信息才可以使用，需要Android组件中的广播接收器BroadcastReceive和Service相结合。 管理系统数据。客户端与数据库之间数据传输需要借助后台服务完成交互，同时对客户端传输的数据进行逻辑分析处理，使用Intent完成界面之间数据的传输；SQLite数据库数据使用开源数据框架LitePal管理，将数据库的操作转换为函数接口的调用，数据的操作不用任何的SQL语句，只需要调用相关功能的函数接口就行，保证数据的安全性和正确性。对一些过期的数据做合理化的处理，避免无用数据长期占用内存空间影响系统运行速度。 由以上叙述得后台服务的结构布局如图4所示。 2.4. 关键技术与算法 2.4.1. 客户端 客户端的界面布局因功能不同在结构上也不相同，所以整体的逻辑结构也不相同，客户端的数据接收和数据显示以及数据的传输和正确性的保证是关键技术。 1) 布局结构的重用 不同界面中的一些相似或者相同的布局可以提取出来形成一个布局文件，需要时只需嵌入布局文件即可，减少代码的重复率并提高编码质量。 2) 数据的正确性 用户在客户端输入数据时不会考虑数据的正确性，所以对输入数据的查错和规格有所处理，并对用 图3. 客户端结构布局图 图4. 系统层次结构图 户做出相应的提示，减少用户输入错误数据的次数，提高使用效率。 为解决界面中显示的中文字符在程序编码中不易识别且容易出差的情况，将所有使用到的中文字符统一写入string.xml文件中，使用不同的变量代替不同的中文含义，在程序中只需调用相应的字符变量即可，同时多次使用的字符不需要重复定义，只需简单的调用变量名即可，这将保证了部分字符无法识别而造成系统错误。 3) 不同界面之间的数据传输 不同界面的数据传输使用Intent完成，传输界面调用Intent的putExtra(，)函数接口发送要传输的数据，显示界面调用Intent的getTypeExtra(String，…)函数接口接收要显示的数据(其中Type表示接受的数据类型，可为String、Int等数据类型的关键字)。例如查看或修改定时任务时需要传输全部或部分数据至不同的界面以便显示，联系人来电铃声信息的查看。 4) 界面和数据库之间数据传输 a) 界面向程序传输数据 用户在界面数据数据时不知道数据的正确性，所以对数据的数据要验证和纠错并以是用户输入符合规则的数据。程序内部的数据都有一定的数据结构，因此对输入的数据必须要进行处理，转换为程序可以正确识别的数据格式。 b) 程序将数据显示在界面 程序中的数据都是按照相应的规则存储的，因此不需要做纠错处理，只需将数据内容绑定相应的适配器，调用setAdapter()把显示的数据加载到界面。 2.4.2. 后台服务 后台服务包含了业务接受、业务分析、数据访问不同层次，调用下层，向上次提供服务是后台服务的逻辑结构每一层相互独立有相互联系，保证相互之间的协调合作，提高层内部的内聚，降低层之间的耦合，确保系统功能的正常运行。 各层功能运行的主要技术支持和算法介绍如下： 1、业务接收层 业务接收层主要接收本地和手机系统发送的信息并发送给业务分析层处理。 本地发送的信息主要来自Service的自启动，为了保证定时静音功能能够根据数据的变化改变任务的设定，需要不断的扫描数据库的数据，为此在系统启动的时候启动一个服务Service，并且给改服务设定一个自启动的定时器。除非用户手动结束进程或者手机系统达到一定的运行限制时自动结束。 通过Android的广播信息机制，并在程序中注册想要接受的信息类型就可以接受到需要的信息。本软件系统主要接受手机的开机广播信息和手机电话的状态。广播的注册分为动态注册和静态注册，一般使用静态注册，一些特殊的广播只能使用动态注册。本系统的开机和电话广播使用静态注册，在配置文件AndroidManifest.xml中的 标签中添加需要的action。 2、业务分析层 接收上一层发送的数据并分析处理。通过接收的信息不同，触发不同的服务功能。接收的本地信息就做定时静音任务的处理，接收的电话广播信息就做来电铃声设置和白名单的处理。信息的处理及传递主要涉及以下技术： (1) 进程守护 为了避免系统服务的中断导致某些功能无法正常使用，使用AIDL通信机制将两个Service相互连接绑定，达到进程守护的效果。本系统中分别为本地服务LocalService和远程服务RemoteService，两者通过AIDL相互通信，在软件系统启动时将两个服务同时启动，运行中一旦有一方中断，另一方将会受到信息并将其重行启动，保证永远有一个服务运行。进程守护的通信关系如图5所示。 (2) Android多线程 [ 9 ] 系统中的代码都是默认在程序的主线程中执行的，而这种机制就会出现因为执行的任务逻辑复杂导致出现主线程被阻塞的情况，通常会出现ANR问题，所以定时静音任务的设定和更新使用多线程完成，为了简单方便，本系统使用匿名类的方法： New Thread(new Runable){ Public void run( ){ 静音任务处理; } }).start( ); (3) 进程等级提升 手机系统中的进程等级决定了在系统资源紧张的情况下，释放进程顺序，想要系统一直运行就要尽可能的避免被销毁释放，就要提高进程等级。服务是一直运行在后台的，并且它的系统优先级是比较低的，利用Notification类创建一个显示通知就可以将服务的等级提升为前台服务。 3、数据访问层 系统所有功能的实现最终都转化为数据信息的交互，数据信息的成功交互是功能完成的提前和标志。本系统的数据都存放在本地数据库中，为了提高对数据的操作效率，使用开源的Android数据库框架 图5. 进程守护关系图 LitePal。采用关系映射的模式将数据库的操作进行封装，创建一个继承DataSupport类的类即可创建数据表，类的数据成员代表数据表的字段，每一个数据字段的访问都是使用类的对象对成员函数的调用。创建litepal.xml文件并添加数据库的名称和版本等信息，添加类名即添加数据表。 4、算法设计 算法在时间上的耗费要降到最低，并且在逻辑上清晰，对每一种可能出现的错误都要有相对应的处理，不能出现程序进入死循环的流程，每前进一步检测是否有继续执行的必要，不需要则即可结束当前的执行，减少无用功对资源的耗费。定时静音服务和来电监听服务的算法流程图如图6和图7所示。 从图6的定时静音监听算法流程图中可知，软件开始运行时访问数据库读取开启的任务信息，对每一条任务的各项信息逐步验证，只要有任何一项与系统信息不匹配就中止后续的信息检查，然后继续下一条任务的各项信息检查；对于周期为一次的任务，首次检查出信息不匹配时，将其任务状态修改为关闭，避免系统再次访问读取无用任务信息。这两种方式都为了减少对数据库的访问时间，提高系统运行效率，增加用户的体验。 从图7的来电监听算法流程图中可知，检测到手机来电状态改变的信息后，只对来电信息做处理。来电状态时，利用手机来电后与铃声响起之间的时间间隔，通过手机号码访问数据库中的白名单信息表和来电铃声信息表，检查到信息后启动白名单服务或铃声设置服务，服务中记录当天系统信息并设置新的信息；接听和挂断状态时，因为来电状态肯定在这两种状态之前发生，所以不用再次访问数据库，只需要根据来电状态记录的系统信息恢复设置信息。 图6. 定时静音算法流程图 图7. 来电监听算法流程图