放假回家后着实无聊了点,刚好小米到手就学了下android开发,做点自己需要的应用,纯Android新人,还请高手指点。
学习加上开发这个widget前后算起来也快半个月了,目前已有一个比较完整的功能,不过还有待增加功能与代码重构等,现在先放出这个版本与朋友们交流。
效果图、源码与apk文件放在最下面,有需要的朋友自行下载。
这次做的主要一个功能是用appWidget展示一个英语、日语的每日一句,并可以发
音阅读, 数据来源为沪江(本文仅为学习所用,任何人不得以本文及所含代码用作
商业用途,违者责任自负)。
沪江已经有了一个每日一句的,但是是Activity,个人感觉麻烦,便做了个widget的。
其中使用到的包括:app widget的布局以及开发,广播,sqlite数据库,服务的使用,
以及沪江提供的每日一句服务等。
下面就遇到的些问题做个记录以便以后有机会深入研究android再回来查看,有高手愿
意解答也万分感激。
1.appWidget的更新是通过接收广播完成好还是通过AppWidgetManager在服务中
直接更新好
个人感觉服务仅仅用来做数据处理就行,处理完数据将结果广播出去,谁要数据谁接收
便是,但不知道在服务中调用AppWidgetManager进行更新widget有无什么好处?
2.intent的extras出现数据混乱的问题,最后改用data uri
这个问题不止一次出现,是bug问题还是我没用好..应该是没用好
大致问题就是,可以看到下面效果图中有一个英语日语切换点击,和一个上下翻页的东
西,点击事件Intent中带extras都出现数据不对的问题
比如,英语注册切换到英语的事件,日语注册切换到日语的事件
都new出来的Intent放入PendingIntent.getService,都带有不同的extras,但是第一次促发
英语事件以后即使以后促发日语的事件也传的英语的数据,第一次促发日语事件以后也是
日语的,实在没找出原因,跟进源码跟到第一步就找不到源码了...先记下来,以后再解决。
出现后弄了很久没解决,只好去搜了下,有个老外也遇到类似的问题,改用data uri解决的
http://stackoverflow.com/questions/4064937/remoteviews-and-setonclickpendingintent
我也试了下,放在data uri后面都可以正确解析到
3.appWidget的textView滚动效果(如果开启服务更新是否开销过大)
因为一个页面放不下太多内容,想弄个scroll,但是不支持额。。有说开个定时任务让他自动
滚动,也可以开个服务更新,都是一个原理,而且要不停更新,不知道吃电量大不大,毕竟手
机上考虑的最起码的吃电和流量。最后还是决定给个上下翻页的按钮了,见效果图。
4.sqlite有无ORM框架
这个对象属性一多,写起DAO真麻烦,无论查询还是插入,求个好用的框架。。。
5.appWidget的布局宽高问题
http://www.eoeandroid.com/sdk/api/guide/practices/ui_guidelines/widget_design.html
http://www.eoeandroid.com/sdk/api/guide/topics/appwidgets/index.html
看这两篇guide吧 6种widget布局,做界面真心不会,这里也不多说了。。看我那效果图,好听
点说干净朴实啊
6.appWidget启动服务时,如果服务未结束时再启动同一个服务,这两个服务为同一个对
象 startId不同 可以利用
服务不结束再请求该服务都不会再新建对象了,好像eoe特刊里面有一期提到了服务的生命周
期,只是扫了下没仔细看,刚开始写服务时不知道会使用同一个对象,都写的私有成员,吃了
不少亏,这个地方代码中还是用的私有成员,没有改过来,先记下有时间再说。
7.分层问题 数据层中分页数据时考虑了显示宽度问题 服务层中考虑了appWidget更新
刚开始准备着手做这个东西时还各种层都考虑了怎么分,虽然最后做出来的还是有层次结构,
比如service、数据以及显示,但是功底不够,一个不知道分的对不对,二个即使按照自己分的
是对的,在数据层还是参进去了界面(比如分页显示要根据字体宽度判断,这个给写在分页的
数据层了- -),还有许多其他问题有待改进。
8.关于LocalBroadcastManager的使用
什么作用查API吧,这里记下我的问题,用LocalBroadcastManager发广播时必须得注册接收者
仅仅使用intent-filter貌似不起作用?
可以从SDK上的extras下找到android support package,maven库上好像没有android-support-v4.jar包。。
9.关于网络是否存在的判断
网上大多都如下判断网络是否存在,不知道是否有人验证过是否一定准确
public static boolean checkInternet(Context paramContext)
{
NetworkInfo localNetworkInfo = ((ConnectivityManager) paramContext
.getSystemService(Context.CONNECTIVITY_SERVICE))
.getActiveNetworkInfo();
if (localNetworkInfo != null)
{
boolean hasNet = localNetworkInfo.isAvailable();
return hasNet;
}
return false;
}
今天无聊测试了下用USB绑定电脑共享网络,用上面的方法是验证无
网络,目前的android API貌似获取不到USB共享网络的信息...用java
API判断是否能连上host也许可以吧,没有尝试
10.还有许多可以增加的功能和改进的地方
比如添加一个Activity读取以前已更新过的数据,清除已更新下来的数据,下载时弄个进度条提
示等等,不一一列举,有兴趣在这代码上修改的请随意,如果可以,改完发我一份一起学习交
流~以后我有时间对这个代码有功能改进也会在这里更新
模拟器上的效果:
这个是APP WIDGET的添加界面
初始状态
点击英语获取到英语的当天数据
点击日语获取到日语的当天数据,并做了分页
正在播放发音
两张小米上的截图:
PS:由于本身写给自己用的,界面上没做太多,但是极力的在电量和流量的控制上做了许多工作,
比如服务的开关,下载后存储到数据库等,测试了下,一天的英语加日语加上对应的MP3耗流量106K,
如果不点击播放不会下载MP3。下载没有提示的,如果要使用的话这个地方也需要注意。
当天数据如果没更新过,没有网络时点击没有任何效果。然后目前的版本放到真机后,屏幕比电脑小多,
在一块小区域内要放入很多元素,在点击英语和日语时可能出现没点击到对应的textview导致没有反应- -
有待改进,自己拿去改也行。
源码,eclipse工程:
http://download.csdn.net/detail/zhouyuqwert/4024341单独APK文件:
http://download.csdn.net/detail/zhouyuqwert/4024342 其实源码bin/下面有了
修正1.修正一处,由于真机上点击着实麻烦,范围过小,
现在增加了点击范围,将选择语言换成Activity透明背景选择,现在在真机上
点击下图所示区域都可,非常容易点击到
修正1(点击区域的修改).源码。APK下载地址:
http://download.csdn.net/detail/zhouyuqwert/4024728
另外再记录下关于maven的android工程,先前看有人在java区问到过,一起
在这里聊下:maven库里面提供了三个工程,如下介绍,用介绍的创建工程后
eclipse:eclipse再导入到eclipse用吧
https://github.com/akquinet/android-archetypes/wiki
部署也简单,install 打包apk android:redeploy卸载再部署 android:deploy部署
clean install android:redeploy一起用便是,自动重新部署上去了
http://mvnrepository.com/这里是maven的所有库,可以从这里查询你要的