Android桌面联系人的实现

contact1如图即为要实现的效果,在Launcher上第一页显示常用联系人,从一个到六个不等。并且长按实现删除功能,所有图标缩小,左上角出现X号,点击删除。

开始尝试在Launcher中直接实现,计划把原有的celllayout换成relativelayout,但Launcher会判断,加载的WorkSpace是否是celllayout,不是,不能编译通过。

往下有两条路,之一,继续修改Launcher源码,使其可以加载relativelayout,之二,把celllayout划分到无限细的格,这样也可以放下不规则的布局。但初步分析这两种都方法都比较困难。

突然有人提到了Widget,灵光一现,在Widget的范围内,可以自定义布局,这样基本显示应该没有问题,接下来就是布局的变换到按键事件的响应。因为有六种布局,之间还需要有动画过渡,之前是在一个Layout上,同时有六种布局,只显示一种,其它为gone,但Widget限制Layout只在第一次加载时会有动画效果,所以之后分别用了六个Layout来分别显示不同个数的联系人布局,这样动画问题解决了。

最复杂的是数据的加载过程,第一,需要与联系人模块沟通,指定联系人添加,删除反应到桌面。第二,会从联系人数据库中得到原始头像,自动生成8类大小不一的头像。在联系人数量变化时,自动切换到相应布局,加载对应的头像。第三,桌面联系人与联系人模块分别维护了常用联系人的状态,容错处理也是一块,否则会出现桌面为空,但联系人确认为己经有满6人,无法添加的问题。contacts

第一,与联系人的沟通,点击添加会弹出联系人的“添加新联系人界面”,在列表中勾选想添加的联系人后,会发Broadcast给桌面联系人(StartActivityForResult不能在Widget中使用),Intent中封装的是一HashMap<Integer, String[]>,Integer记录的联系人的ID, String[]包含姓名,电话号码等。获取这些信息会在桌面联系人模块中备份一份。

第二,由ID从数据库中读取联系人的头像,按照定义的规则对头像进行截取,缩放,修圆角等处理,并存储到数据库。由于操作比较费时,会先计算出要显示某张图,其余的会在后台线程中处理后添加数据库。

第三,容错处理,在每次开机是即onEnable函数中,会列出桌面联系人的所有ID,判断此ID是否在联系人模块当中,若不再,就从桌面删除此人,若在,判断此人桌面联系人的标志位是否正确,不正确,同样会从桌面删除。之后会列出联系人数据库中所有标志位为1即在桌面显示的联系人的ID,判断此ID是否在桌面联系人当中,不在,则把标标位置为0.

其它方面包括界面显示时数据的Load过程,添加,删除联系人时,布局的切换过程,正常,编辑模块的状态维护等,细节比较多,整个工程耗时近一个月,2000行左右代码。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.