关于android开发一个简单APP的总结

2019年09月02日作者:井井客原创来源:原创

安卓开发练手项目,虽未完成但已有雏形,现在也只是从大局上简单分析总结一下而已。

关于android开发一个简单APP的总结

做这款APP的初衷是因为公司让我们在禅道上录入任务,记录用时,再汇总数据分析业绩。不过作为一名懒人,我一般只在周五一次性录,这就导致我的任务时间有点随便填的嫌疑,并且还经常漏掉些小任务。

正好那时打算用android做一款简单的APP,练练手,最终做了这款日程APP。功能上比较简单,录入待开始日程后可以开始、暂停、完成,操作还算方便。

日程APP是一个小型的完整项目,使用了安卓内置SQLite数据库。稍后会围绕数据库、抽象类、UI界面这三方面进行分析。

GitHub地址:https://github.com/jingjingke/Schedule

1、数据库

暂时只设计了3张表(参考ScheduleDatabaseHelper.java文件),分别为:
(1)status:状态表,枚举,初始化中完成。有4个值:未开始、进行中、已暂停、已完成。
(2)schedule:日程主表,记录任务名称、内容、备注、开始时间、状态、用时等信息。
(3)progress:进度表,每一个日程开始至结束/暂停为一条记录,主要字段为:日程、开始时间、结束时间。

schedule数据库设计

schedule表中的状态为int类型,关联status的id;progress中的日程也为int类型,关联schedule中的id。
schedule表中的用时,则是在progress表记录结束/暂停时,计算开始与结速的时间差,进行累加。

2、数据抽象模型

抽象了两个类:日程(Schedule.java)、进度(Progress.java),抽象类中包含的元素也与数据库中schedule、progress两个表差不多。

schedule数据类型

3、界面

APP中目前仅有4个页面:
(1)首页:展示未开始、进行中、已暂停的日程。
(2)列表页:分类展示所有监听。
(3)新增页:新增日程。
(4)详情:展示日程详情及相关进度记录。

schedule界面效果

代码部分,项目使用的UI元素主要存放在res(values、drawable)中管理。

values文件夹下colors.xml存放颜色(主题色、字体色、边框色等)、dimens.xml存放尺寸(文字、间距的尺寸等)、strings.xml存放界面文本信息(APP标题、按钮文本等)、styles.xml存放自定义样式(按钮样式等)。

drawable文件夹下存放了一些渐变背景、SVG图、自定义图形相关等。

schedule资源布局

4、交互

在ScheduleDatabase.java文件中汇总了一些数据库的操作,如数据库新增、查询等。

其中查询返回类型:Schedule、List<Schedule>和List<Progress>。

当返回类型为Schedule,只需要用Schedule类中的getXXX即可取出数据并赋值到页面元素。

当返回类型为List<Schedule>(List<Progress>同样),表示返回一个列表。这时,需要配合Adapter来完成渲染页面元素。
而根据页面样式不同,我定义了两个ScheduleAdapter,一个ProgressAdapter。

schedule简单流程

上面画了一个详情页的简单"流程",不太严谨,见晾。下面贴了一部分数据库操作代码仅供参考。

package com.jingjingke.schedule;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

public class ScheduleDatabase {

    private ScheduleDatabaseHelper dbHelper;
    SQLiteDatabase database;

    SimpleDateFormat simpleDateFormat;

    public ScheduleDatabase(Context context) {
        dbHelper = new ScheduleDatabaseHelper(context, "Schedule.db", null, 1);
        database = dbHelper.getWritableDatabase();

        // 设置时区
        simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8"));
    }

    // 查询日程详情
    public Schedule querySchedule(int schedule_id) {
        Schedule schedule = new Schedule();
        Cursor cursor = database.rawQuery("select s.id,s.name,s.content,s.remark,s.create_time,s.cost_time,i.name as status,i.id as sid " +
                "from schedule as s inner join status as i on s.status_id=i.id where s.id=? limit 1", new String[]{String.valueOf(schedule_id)});
        if (cursor.moveToFirst()) {
            schedule = extractionOfSchedule(cursor);
        }
        return schedule;
    }

    // 查询进度列表
    public List<Progress> queryProgress(int schedule_id) {
        List<Progress> list = new ArrayList<Progress>();
        Cursor cursor = database.rawQuery("select * from progress where schedule_id=? order by start_time desc", new String[]{String.valueOf(schedule_id)});
        if (cursor.moveToFirst()) {
            do {
                String remark = cursor.getString(cursor.getColumnIndex("remark"));
                long start_time = cursor.getLong(cursor.getColumnIndex("start_time"));
                long end_time = cursor.getLong(cursor.getColumnIndex("end_time"));

                String start = simpleDateFormat.format(new Date(start_time));
                String end = "";
                if (end_time != 0) {
                    end = simpleDateFormat.format(new Date(end_time));
                }

                Progress progress = new Progress(start, end, remark);
                list.add(progress);
            } while (cursor.moveToNext());
        }
        return list;
    }

    // 根据日程Id取得最后一条开始时间与当前时间差
    private long getLastCostTime(int schedule_id) {
        long cost = 0;
        Cursor cursor = database.rawQuery("select start_time from progress where schedule_id=? order by start_time desc limit 1", new String[]{String.valueOf(schedule_id)});
        if (cursor.moveToFirst()) {
            long start_time = cursor.getLong(cursor.getColumnIndex("start_time"));
            long time = new Date().getTime();
            cost = time - start_time;
        }
        return cost;
    }

    // 提取每一条查询得出的日程数据
    private Schedule extractionOfSchedule(Cursor cursor) {
        int id = cursor.getInt(cursor.getColumnIndex("id"));
        String name = cursor.getString(cursor.getColumnIndex("name"));
        String content = cursor.getString(cursor.getColumnIndex("content"));
        String remark = cursor.getString(cursor.getColumnIndex("remark"));
        String status = cursor.getString(cursor.getColumnIndex("status"));
        int sid = cursor.getInt(cursor.getColumnIndex("sid"));

        long cost_time = cursor.getLong(cursor.getColumnIndex("cost_time"));
        // 如果状态是进行中,则用花需要在原基础上累加最后一次用时(用当前时间计算)
        if (sid == 2) {
            cost_time += getLastCostTime(id);
        }
        String cost = getCostText(cost_time);

        long create_time = cursor.getLong(cursor.getColumnIndex("create_time"));
        String create = simpleDateFormat.format(new Date(create_time));

        Schedule schedule = new Schedule(id, name, content, remark, status, sid, create, cost);
        return schedule;
    }

    // 工具--返回用时文本
    private String getCostText(long time) {
        long day, hour, minute, second;
        time = time / 1000;
        day = time / 86400;
        hour = (time % 86400) / 3600;
        minute = (time % 86400 % 3600) / 60;
        second = (time % 86400 % 3600 % 60);
        // 过滤无用数据
        return (day == 0 ? "" : (day + "天")) +
                (day + hour == 0 ? "" : (hour + "小时")) +
                (day + hour + minute == 0 ? "" : (minute + "分")) +
                (day + hour + minute + second == 0 ? "--" : (second + "秒"));
    }

}

在做这款APP的时候,其实也是很多不懂,像头部带状态栏整体做渐变背景、自定义样式等等,基本是边搜索边做。搬砖不难,把砖用在哪里能建好房子才是好。因为搜索的都是比较零散的东西,就不在此多说,我自己是觉得数据库表设计(后期拓展方便)、抽象类实现(可以覆盖多种相似数据模型)比较核心,另外就是UI整合到一块的想法,对于后期维护怎么方便。现在好像我做的都还只是一般般。

另外后面有机会还会丰富一下这款APP。我自己YY了一下:
(1)添加一个日历插件,可以按日按月查询做了哪些事;
(2)如果不想要的日程比较多了,是不是得有一个编辑和删除功能;
(3)本来想做但还没有做的的进度备注功能;
(4)添加日程消费功能,记录在做某些事的时候花了多少钱,然后做上统计。

想法美好,现实残酷。希望我不要这么懒了...

文章TAG:

本文标题:关于android开发一个简单APP的总结
本文链接:http://www.jingjingke.com/c/02359.html

上一篇:快速了解npm link
下一篇:MAC安装低版本PHP(5.6)+MySQL(5.7.28)并运行