最近在完成实验室的项目之后花了一点时间弄了一个小应用。因为自己也算是手机重度手机依赖患者,平时虽然玩手机时间不长,但是很频繁,所以一直想要知道自己每天打开手机多少次,用了哪些应用,以及每个应用花了多少时间。加上刚刚看了一本时间管理的书《奇特的一生》,所以就简单的设计了一下主要功能,然后开始做了。比较简单的应用,主要是代码的逻辑。
描述
设计的想法来自于《奇特的一生》中主人公柳比歇夫的时间统计法,应用的名字也是来自于该书第8章”时间之镜”。整本书都在说的一个主题就是时间统计法是如何有效以及如何帮助主人公在有限的人生中作出令人惊叹的成就。同时对比于当下人们花在智能手机上的时间越来愈多,所以就像做一款可以帮助人们记录自己在这些设备上花费了多少精力(开启应用的次数和开启应用的时间等信息),然而实际上大家对自己究竟花了多少时间是毫无概念的,所以这款App的目的就是来提醒用户,每天的碎片时间累积起来也是很多很让人惊奇的。所以适时的放下手机,把这些碎片时间累积起来做一些有更有意义的事情,更好的管理自己的时间和精力,虽然不能像柳比歇夫那样成为达人,但是至少可以更加有效的利用时间。
基于这样的想法,应用开发的主要任务就是统计时间了。统计内容包括:每个应用的开启次数和开启时间,每天自己打开了多少个App和使用了多少次,每周自己使用了多少个App和使用了多少次。当然应用附加的提供了一些应用管理功能:包括区分应用类型(系统应用还是第三方应用)以及打开和卸载功能,浮窗快捷开启功能。
主要功能
基本功能如下:
1)统计系统中所有安装应用的使用频率以及累计使用时间长度
2)列出每天以及每周使用应用的次数,花费的时间,启动应用的个数
3)标识出使用最频繁花费最多的应用
4)基本的应用管理功能,如软件卸载及应用类别区分
5)设置快速访问功能,列出最常使用的6款应用并添加快捷访问
6)其他基本管理及更新功能
关键模块逻辑
关键部分就是如何实现应用的使用时间统计了。实际实现的时候采用的是一个后台服务不断的检测当前桌面顶端的Activity栈,判断栈顶界面属于哪个应用的,每一秒检查一次。栈顶Activity的切换有四种情形:1,桌面-桌面;2,桌面-应用;3,应用-应用;4,应用-桌面。
第一种情形,不做任何动作。
第二种情形,说明用户从桌面开启了一个应用,那么需要做的就是开始对该应用启动计时操作。
第三种情形,还存在两种子情况,本应用-本应用,本应用-其他应用。前者直接对计数器加1,后者则结束本应用的计时,将计时数据持久化,同时开始后一个应用的计时逻辑。
第四种情形,说明应用退出回到桌面了,那么直接结束当前应用的计时,并将数据持久化即可。
计时的服务并不是一直都在运行的,毕竟也没有必要一直运行。采用的方法是添加对解锁的广播监听事件,如果当前用户解锁,那么开启服务检测桌面应用栈的变化情况,锁屏之后关闭服务,减少对资源的消耗。一开始也没有想这么多,直接使用了一个服务运行在后台,而且关机也一直运行,在测试的时候,用自己的三星机子测试,由于三星系统接近原生,而且用的系统版本4.3也比较旧,对后台服务其实没有做过多的管理,除非是内存不足才会去关闭一些无关进程,但是这种情况很少发生,毕竟服务进程的的优先级还是比较高的。就算在资源紧缺的时候被系统关闭,也只是暂时的,后边还是会被系统开启。这样就造成了大量的资源浪费,所以为了减少不必要的浪费,就采用这种动态开启的方式运行。
另外一个关键的模块是悬浮窗体的设计。一开始是没有这个功能的,但是毕竟是统计了应用使用频率,所以就想可不可以实现一个快速访问的功能,直接按用户使用平率和时间给这些应用附加权重,然后排序。当用户打开悬浮窗的时候,可以直接快速的打开自己最常使用的6款应用。这个浮动窗体的实现了两个,大悬浮窗用来显示常用应用,小悬浮窗作为一个快捷方式。只有当用户点击小悬浮窗的时候才可以打开大悬浮窗体。另外小悬浮窗体的实现借鉴了某数字公司的桌面悬浮的思路,就是即使应用退出,小悬浮窗也可以显示在桌面上,而且还可以拖动到任意位置。当用户打开其他应用的时候,小悬浮窗还可以自动的隐藏。这一块主要是通过WindowsManager来实现的,通过WindowsManager把自定义布局的窗体add到桌面即可。主要部分在于对这两个窗体的管理上面。
应用截图
两个同类型的应用
24PI:
UI很赞,功能及其强大。做到一半发现有这么个应用,可能TimeMirror相比于24PI的仅有的两个优点是消耗资源少和可以代码开放。很不错的应用,不过不知道这款应用的盈利点在哪里?似乎是一款很注重情怀的应用
http://www.wandoujia.com/apps/com.dlj24pi.android
拾光:
自己学校的一个学生创业团队的作品,已经天使轮近百万了
UI做的挺不错的,毕竟有一个有激情的团队
http://www.wandoujia.com/apps/net.keshile.mykeyguard