1. 程式人生 > >安卓開發(一)時間管理應用DayPlay

安卓開發(一)時間管理應用DayPlay

需求分析:

日常生活中,人們常常會因為拖拉而無法按時完成任務。“你有多少時間,就會花多少時間做一件事”,似乎是常人的通病。也許你開始時躊躇滿志,目標明確,可是時間一長往往就會偏離目標,將時間浪費在一些無謂的事情上。缺乏適時的、足夠多的提醒是主因。
當前,市場上有足夠多的優秀日程管理應用,如Wunderlist等。這些應用大多提供日程記錄、日程優先順序、鬧鐘提醒、同步等功能。但這些應用的任務事項時間跨度都比較大、期限也比較長,提醒功能比較被動。這雖然有利於把握大的方向,但對於短期內效率的提高不一定有很好的效果。從另一個角度上看,養成良好的時間管理習慣,既需要著眼於長遠的目標,也需要有具體的、可行的短期實踐方案。所謂短期,我認為一天比較合適。
本應用並不致力於像Wunderlist一樣具有十分全面的功能。而是專注於為拖拉者做好一天(甚至更短)的規劃,通過主動的、多次的提醒及時檢查、糾偏,讓拖拉者逐漸成長為高效的成功人士。

設計理念:

一天計劃,任務事項的主動、多次提醒,及時糾偏。

基本功能:

1、新增任務功能:可以新增任務事項,包括任務描述,任務屬性(4類:重要緊迫、重要不緊迫、緊迫不重要、不緊迫不重要),任務標籤,截止時間,圖片等
2、提醒功能:包括兩個模式:①普通模式:任務截止時間提醒②強迫模式:根據不同的任務屬性,間隔一定的時間提醒一次
3、根據任務標籤的搜尋功能
4、分享:微信、QQ等

擴充套件功能:

提醒內容的自定義、任務完成情況總結表單等(待定)

DayPlan最終效果

DayPlan開啟後,首先顯示一個任務列表,如圖1,任務列表左側以不同顏色標記任務的緊迫性,同時可以看到任務的標題、日期、截止時間、是否完成等資訊。
使用者點選某項任務後,將進入編輯頁面,在該頁面可以修改任務標題、截止時間,新增提醒等。
這裡寫圖片描述

這裡寫圖片描述
在編輯介面點選相機按鈕,進入拍照介面
這裡寫圖片描述
在編輯介面點選圖片,進入檢視圖片介面,使用者可以放大照片檢視細節在任務截止時間到了的時候,DayPlan彈出一個視窗,給出簡短的提醒資訊
這裡寫圖片描述

功能詳細描述

(一)規劃功能:
使用者可以在前一天晚上做好第二天的規劃,新增必要的任務事項,包括任務描述,任務的緊迫性(重要緊迫、重要不緊迫、緊迫不重要、不緊迫不重要),截止時間,並且可以新增一張相關的圖片作為提示。
(二)提醒功能
使用者可以為每個事項新增提醒功能,每當截止時間到的時候,DayPlan給出一個簡短的提醒。DayPlan致力於在提醒使用者的同時不過分打擾使用者。
(三)分享功能
DayPlan可以從某個任務生成一個描述該任務的字串,並分享到其他應用。

系統架構設計

根據經典的MVC設計模式,我們把系統劃分為三層:模型層、檢視層、控制層。
(一)模型層
模型物件儲存著DayPlan的應用資料和業務邏輯。模型物件不關心使用者介面,它存在的唯一目的就是儲存和管理應用資料。DayPlan的模型物件主要是管理圖片的Photo類、管理任務事項的Plan類、進行資料儲存的DayPlanJSONSerializer類、應用執行過程中儲存資料的資料池單例類SinglePlanLab類等。
(二)檢視層
檢視物件知道如何在螢幕上繪製自己及如何響應使用者的輸入,DayPlan中的檢視物件主要由layout檔案中定義的各類元件構成。比如ZoomImageView類就是一個可以響應使用者手勢進行圖片縮放的檢視物件。
(三)控制層
控制物件包含應用的邏輯單元,是檢視與模型的聯絡紐帶。控制物件響應檢視突發的各類事件。在DayPlan中,控制物件主要由Fragment類的各個子類構成。
最後,給出DayPlan應用總體框圖
這裡寫圖片描述

各子模組介紹

(一)模型層子模組
模型層主要的模組是資料處理模組、資料儲存模組。
1、資料處理模組
主要由類Photo、類Plan、類SinglePlanLab處理。分別介紹如下:
①Photo類:儲存圖片路徑的類。
②Plan類:儲存任務事項的類。包含任務標題、任務截止時間等成員變數。
以上兩個類均提供了從JSON物件獲取資料的構造器及轉化為JSON物件的方法,以方便資料儲存。
③SinglePlanLab類:儲存應用中所有Plan物件的單例類。為了保證資料的同步,應該把整個應用中的所有Plan物件集中儲存在一個單例類裡,這樣資料就只有一份。其他物件從SinglePlanLab物件獲取需要的Plan物件的引用。因為其他物件獲取的只是SinglePlanLab物件中Plan池中某個Plan的引用,所以當其他物件修改Plan時,實際上是對SinglePlanLab中的Plan物件進行操作,所以可以保證SinglePlanLab中的Plan將會得到同步更新。
這裡貼一下SinglePlanLab.java的程式碼:

package cn.edu.zju.isee.www.dayplan;

import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.UUID;

import android.content.Context;
import android.util.Log;

public class SinglePlanLab {
    private static final String         TAG         ="SinglePlanLab";
    private static final String         FILENAME    ="plans.json";

    private static SinglePlanLab        sPlanLab;
    private ArrayList<Plan>             mPlans;
    private DayPlanJSONSerializer       mSerializer;
    private Context                     mContext;



    private SinglePlanLab(Context context){
        mContext=context;
//      mPlans=new ArrayList<Plan>();
        mSerializer=new DayPlanJSONSerializer(mContext, FILENAME);
//      mPlans.add(new Plan("","今天要去跑步"));
//      mPlans.add(new Plan("","資訊理論與編碼還有複習"));
//      mPlans.add(new Plan("","嵌入式系統設計課程作業"));
//      mPlans.add(new Plan("","網路安全課程大作業期末..........."));
        try{
            mPlans=mSerializer.loadPlans();
//建立1000條資訊用於測試
            Log.d(TAG,"load plans");
        }catch(Exception e){
            Log.d(TAG,"plans.json doesn't exist,create empty planLab");
            mPlans=new ArrayList<Plan>();
        }
    }


    public static SinglePlanLab getInstance(Context context){
        if(sPlanLab==null){
            sPlanLab=new SinglePlanLab(context);
        }

        return sPlanLab;
    }

    public void addPlan(Plan plan){
        mPlans.add(plan);
    }

    public void deletePlan(Plan plan){
        mPlans.remove(plan);
    }

    public Plan getPlan(int index){
        Plan p;
        try{
            p=mPlans.get(index);
        }catch(Exception e){
            Log.d(TAG,"getPlan out of range,return null");
            return null;
        }
        return p;
    }

    public Plan getPlan(UUID planId){
        for(Plan p:mPlans){
            if(p.getId().equals(planId)){
                return p;
            }
        }
        return null;
    }

    public ArrayList<Plan>getPlans(){
        return mPlans;
    }
    public int getLength(){
        int result=0;
        for(Plan plan:mPlans){
            result++;
        }
        return result;
    }

    public ArrayList<Plan> getPlanByLabel(String label){
        ArrayList<Plan>result=new ArrayList<Plan>();
        for(Plan plan:mPlans){
            if(plan.getLabel().equals(label)){
                result.add(plan);
            }
        }
        return result;
    }

    public ArrayList <Plan> getPlanByType(String type){
        ArrayList <Plan>result=new ArrayList<Plan>();
        for(Plan plan:mPlans){
            if(plan.getType().equals(type)){
                result.add(plan);
            }
        }
        return result;
    }

    public ArrayList <Plan>getPlanByDate(Date date){
        ArrayList<Plan>result=new ArrayList<Plan>();
        for(Plan plan:mPlans){
            if(plan.getDate().equals(date)){
                result.add(plan);
            }
        }
        return result;
    }

    public Boolean savePlans(){
        try{
            mSerializer.savePlans(mPlans);
            Log.d(TAG,"plans saved to file");
            return true;
        }catch(Exception e){
            Log.d(TAG,"error save plans");
            return false;
        }
    }

    public void clearPlans(){
        File f=new File(mContext.getFilesDir()+"/"+FILENAME);
        if(f.exists()){
            mContext.deleteFile(FILENAME);          
        }
        mPlans.clear();
    }
}

2、資料儲存模組
DayPlan中處理資料儲存的類是DayPlanJSONSerializer。在DayPlan中需要儲存的資料是SinglePlanLab中的所有Plan類例項。DayPlan應用採用JSON儲存資料,過程如下:
首先,Plan類包含了一個轉化為JSON物件的方法、一個從JSON物件獲取資料並構造Plan例項的建構函式。儲存資料時首先將Plan例項轉化為JSON例項。
然後,DayPlanJSONSerializer類負責將JSON物件儲存到應用的內部空間。
讀取資料時,DayPlanJSONSerializer從檔案讀取資料並構造JSON物件,然後呼叫Plan的建構函式構造Plan物件。
由於SinglePlabLab維護著整個應用的資料,所以資料的儲存與讀取由SinglePlanLab負責。SinglePlanLab類知道如何使用DayPlanJSONSerializer類讀取與儲存資料。

(二)控制層子模組
根據應用的功能,可將控制層劃分為5個子模組:新增任務模組、刪除任務模組、提醒模組、拍照模組,分享模組。
1、新增任務模組
主要由類PlanListFragment與PlanEditFragment類處理。當用戶在任務列表介面點選某個任務的時候,PlanListFragment啟動PlanEditFragment並把使用者所點選任務的對應的Plan例項的UUID傳遞給PlanEditFragment。PlanEditFragment利用UUID從SinglePlanLab獲取Plan物件並初始化檢視。
使用者修改資料後,PlanEditFragment從檢視層獲取資料,對Plan例項作相應的修改,完成更新資料層的功能。
2、刪除任務模組
主要由PlanListFragment類處理。當用戶在任務列表介面長按操作時,進入刪除模式,可以選擇多個任務並刪除。PlanListFragment負責告知模型層哪些任務被刪除了。
3、提醒模組
主要由類PlanEditFragment和AlarmActivity類處理。當用戶點選“提醒我”按鈕時,PlanEditFragment啟動一個TimePicker,使用者輸入時間後,PlanEditFragment呼叫系統鬧鐘服務,在設定的時間啟動AlarmActivity,AlarmActivity則根據Plan的內容彈出提醒視窗。
4、拍照模組
主要由類PlanEditFragment和PlanCameraFragment處理。當用戶點選相機按鈕後,PlanEditFragment啟動PlanCameraActivity(管理PlanCameraFragment的Activity)。PlanCameraFragment使用系統相機API完成拍照、處理圖片、儲存圖片的功能,並把圖片路徑傳遞給PlanEditFragment,PlanEditFragment根據圖片路徑生成一個Photo物件並新增到Plan例項裡。最後,PlanEditFragment重新整理檢視層,使用者將看到剛剛拍攝的照片的縮圖。
5、分享模組
主要由類PlanEditFragment處理。當用戶點選“分享”按鈕時,PlanEditFragment根據當前的Plan例項,生成一個包含任務標題、任務截止時間、任務緊迫情況、任務完成情況的字串,然後將該字串附加到一個隱式Intent裡,啟動其他應用,實現分享功能。

(三)檢視層子模組
DayPlan的介面主要有:任務列表介面(圖1),編輯介面(圖2),拍照介面(圖3),檢視照片介面(圖4)等。
1、任務列表介面
該介面需要顯示多個任務,並且根據使用者的上下滑動載入不同的任務並顯示。使用ListView可以方便地解決這個問題。
2、編輯介面、拍照介面
編輯介面由佈局檔案fragment_edit_plan.xml完成。此外,為了實現左右滑動切換到不同任務的編輯介面,我們使用PlanPagerActivity(包含ViewPager成員)來管理PlanEditFragment。
拍照介面由佈局檔案fragment_plan_camera.xml完成。
3、檢視照片介面
DayPlan自定義了一個ZoomImageView類,負責響應使用者手勢進行圖片的縮放。ZoomImageView類繼承自View類,包含一個Bitmap成員。ZoomImageView類檢測使用者的手勢操作,根據手指的座標計算出圖片縮放的比例,通過重寫View的OnDraw函式,將Bitmap按照所計算的縮放比例繪製到螢幕上。在使用者看來,就像進行了圖片的縮放一樣。

總結

DayPlan實現了一個時間管理應用的基本功能,但尚有以下不足:
DayPlan根據一段時間的任務完成情況繪製統計圖的統計功能尚未完成;DayPlan在檢視照片模式中進行圖片縮放的時候,流暢度與系統自帶照片檢視軟體相比還有差距;DayPlan在拍照過程中,由於直接呼叫了硬體相機,實現起來相對複雜,且拍照過程中亮度無法自動調節。但直接呼叫相機應用的方法則無法獲得全尺寸的照片,不能滿足DayPlan的需求;DayPlan在拍照後處理影象的過程中由於沒有使用多執行緒,阻塞了UI執行緒;DayPlan在載入圖片的過程中阻塞了UI執行緒;DayPlan的介面有待美化。
DayPlan這些不足有待後續完善。

相關推薦

開發時間管理應用DayPlay

需求分析: 日常生活中,人們常常會因為拖拉而無法按時完成任務。“你有多少時間,就會花多少時間做一件事”,似乎是常人的通病。也許你開始時躊躇滿志,目標明確,可是時間一長往往就會偏離目標,將時間浪費在一些無謂的事情上。缺乏適時的、足夠多的提醒是主因。 當前,

開發Java面試經歷

除了問專案經歷,一些技術性的問題如下: 記憶體回收機制(Garbage Collection,GC) 1. java的記憶體 內容來源 堆 (是gc的主要區域) 執行緒共享,主要是用於分配例項物件和陣列 棧 執行緒私有,它的生命週期和執行緒相同,又分成 虛擬機器

手把手教你入門

部落格 學院 下載 GitChat 論壇 寫部落格 發Chat

開發人臉識別相簿FaceMap

本篇主要講本科時做的一個應用,人臉識別相簿。主要包含JNI和業務邏輯。最終程式碼會公佈在github。 演算法部分 當時深度學習還沒有很火,所以用的是經典的PCA方法,降維之後直接作為特徵。人臉檢測部分用的也是Opencv的Haar特徵人臉檢測。現在來看效能

Tensorflow lite for 移動端開發——完整詳細過程訓練自己的模型

官方給的Tensorflow lite demo是ImageNet 中訓練的1000類物體識別,基於移動端的專案需要,現在要用模型訓練自己的資料,提供兩種訓練方法,這也是自己在摸索Tensorflow過程中,嘗試的兩種方法。 (一)利用examples中的re

Tensorflow lite for 移動端開發——移動端測試自己的模型

Tensorflow-lite官方給的應用是一個攝像頭demo,主要由ImageClassifier類和Camera2BasicFragment類構成,ImageClassifier類為一個抽象類,由浮點類和數字量化類兩類繼承,主要實現讀取,模型和預測的功能。C

Tv開發移動智慧電視之焦點控制觸控事件

      前言:移動智慧裝置的發展,推動了安卓另一個領域,包括智慧電視和智慧家居,以及可穿戴裝置的大量使用,但是這些裝置上的開發並不是和傳統手機開發一樣,特別是焦點控制和使用者操作體驗風格上有很大的區

Framework7 + cordova +AS 混合開發app

四、cordova建立專案 建立專案 cordova create hello com.example.hello HelloWorld 如果一切正常,本條命令將建立一名為hello的專案資料夾,com.example.hello是你的專案包名,它將生成一個

電商平臺搭建--商品管理功能模組開發

Hi,大家好,我們又見面了。相信通過前面幾篇博文的學習,大家已經對如何搭建一款屬於自己的電商平臺有了初步的瞭解,也大致懂了SSM框架的主要開發流程,那麼在接下來的幾篇博文中,我將帶領大家完成商品管理功能模組的開發,還在等什麼,直接進入正題吧!一、商品管理功能模組-概要   

學習1——搭建開發環境:Eclipse+ADT+Android SDK

安裝JDK 這裡可以參考我之前寫的一篇關於安裝JDK的教程, 請看下面連結吧。 安裝Eclipse Eclipse 是一個開放原始碼的、基於Java的可擴充套件開發平臺。就其本身而言,它只是一個框架和一組服務,用於通過外掛元件構建開發環境。幸運的是,Eclipse 附帶了一個標準的外掛集,包括Java開發工

MFC開發簡單同步時間應用程式

看了一個垃圾程式的架構,mmp真坑,自己費了一點功夫才搞定,就直接記錄下吧,這個是windows簡單的應用程式,但是裡面有點複雜,我們需要首先建立一個基於mfc的appwinzard程式,(憑記憶寫的,不知道單詞有沒有錯誤),然後我們直接在winmain類中新增下面的變數 # include<tim

Unity開發遊戲2:基於遊戲的優化方案總結!

最近專案進入收尾階段,之前對專案做了很多優化,mesh合併 ,減少DrawCall和模型骨骼以及物理計算,合併材質球,優化程式碼等等,在IOS上還好,但是Android上,試過幾款手機,從低端到高階,發現效能還是很差,所以又花了幾天來研究摸索,終於把遊戲效能搞定。記錄下來,留作以後參考。 1. 更新不透

Vue 2.x 實戰之後臺管理系統開發

1. 導語 該文章將從頭到尾梳理我是如何使用 Vue 2 開發一個後臺管理專案的,我會將自己遇到的問題貼出,希望可以幫助到其他人。 2. 開發前須知 我的後臺管理系統專案運用瞭如下框架/外掛: Vue 2.x —— 專案所使用的 js 框架

如何開發遊戲

如何開發安卓遊戲 如果你以前從沒寫過程式碼,在你前進路上還要學習很多,但彆氣餒。接下來便是開發遊戲的一些主要步驟,讓我們來學習一下:一、獲取tanjurd SDK新手上路的第一步便是獲取Android SDK(軟體開發工具包)。SDK裡有一個核心類庫,一個模擬器,一些工具和示例程式碼。我強烈建議使用Eclip

後端管理系統開發:登入篇

作為後端程式設計師,想寫一個數據展示的系統,主要用於資料查詢、資料展示,當然也有登入功能了,有沒有比較快的方式呢,於此,Vue-A

NIO原理剖析與Netty初步----淺談高性能服務器開發

返回 創建 基於 register 訪問 io操作 nbsp info class 除特別註明外,本站所有文章均為原創,轉載請註明地址 在博主不長的工作經歷中,NIO用的並不多,由於使用原生的Java NIO編程的復雜性,大多數時候我們會選擇Netty,m

淺談WebService開發

man att set style 訪問 row nag 序列 ros 一、什麽是WebService: 簡單通俗來說,就是企業之間、網站之間通過Internet來訪問並使用在線服務,一些數據,由於安全性問題,不能提供數據庫給其他單位使用,這時候可以使

微信公眾號開發

jpg 解壓 china arc 公眾平臺 開發 技術分享 更換 微信公眾號 4.1 示例代碼設置 首先下載此處的php接入代碼 ,在公眾號中 配置 url 地址指向 文件 代碼 只需更換 自定義的token 即可 這樣就完成最初的接入 微信公眾平臺提供了一個php示例

從零開始學習OpenCL開發架構

處理器 多媒體 c++ stl context 實驗 通用 必看 是你 同時存在 1 異構計算、GPGPU與OpenCL OpenCL是當前一個通用的由很多公司和組織共同發起的多CPU\GPU\其他芯片 異構計算(heterogeneous)的標準,它是跨平臺的。旨在充

基於itchat的微信群聊小助手基礎開發

log 表達式 數據包 gin 找到 ont 基本 時間 msg 前段時間由於要管理微信群,基於itchat開發了一個簡單的微信機器人 主要功能有: 圖靈機器人功能 群聊昵稱格式修改提示 消息防撤回功能 鬥圖功能 要開發一個基於itchat的最基本的聊天機器人,