Widget 详解

AppWidget 详解

    最近又写了一个Widget,第二次写了,许多之前没有搞清楚的东西,这次更加清楚了一些。首先记录一下AppWidget的基本框架,Widget更新条件,然后把两次写Widget的基本流程记录下来供今后查阅。

    先说几句题外话,首先是觉得,总是周而复始的重复一件工作,比如修改程序bug,真累,觉得总在打酱油,自己也难受,到不如动手写程序,我知道,这是耐心不够的表现。另外,刚看到了一篇将程序员经验的文章,一会儿转过来。
    今天还知道了,打更的更念geng(一声),这个拼音音调不会打,自己之前想到的要把uft8啦gbk啦的编码弄清楚也没有弄清楚。从以往的表现来看,脑袋里的想法付诸于时间,基本最短还要两个月的时间,这样也就错过了很多机会。


    AppWidget的基本框架是,手边没书,靠记忆说了,桌面launcher里面有一个AppWidgetHost,用来支持桌面上放置的 Widget,这个如果不动launcher的话,一般不会用到。据说下一代系统支持在Activity中调用Host,也就自然可以在Activity 里防止Widget,具体不知,或许现在就可以。
    接下来是AppWidgetInfo,通常就是res/xml里面的widget.xml,xml的命名貌似只能用小写,也可以在.java里面实现这个Info,不过一般xml里更加简单,所以就都写在这里了。
    下面就是真正的AppWidget,由它来控制整个Widget,但是有很大的局限性,不仅可以实现的布局很少,只有3类布局,7种还是9种控件,发挥的余地就很小,当然也不是完全不能发挥,只是都要自己动手写,比较麻烦。  AppWidgetProvider中继承几个on方法,可以在对应时间的时候自动调用,一般用到的就是onUpdate,用来更新UI。其次 AppWidgetProvider内不支持线程,线程需要在另外启动的支持的类里使用,如Activity or Service。最后,听说AppWidget不支持animation,我想写至今还没有来得及实现,不行就只能连续的刷新图片咯。
  

    关于AppWidget,或者说是刷新UI的条件,更新Widget UI的条件有三个:
1,每生成一个Widget都对应一个AppWidgetId,需要对这个Id进行刷新,这也是onUpdate函数中对这个Id数组遍历for的含义。
2,Widget中的UI是通过一个RemoteView类实现的,根据字面含义,这个View是允许其他远端程序调用并更新的,此为 remote的含义。RemoteView支持的组件很少,刚才说过。在程序中,我好像看到了,这个RemoteView的实例必须只有一个,就是必须是同一个,否则更新无效,这个还需要进一步验证。貌似别人也没怎么说。
3,AppWidgetManager,由它的update方法加参数实现当前的Widget视图更新。
    有了这3个条件,可以在任何的Activity或是Service里面更新Widget的UI。


    我又想说说看代码的问题,看了一个代码,每个函数都在一屏以内,符合经常听到的优秀代码的样式,比较牛。看别人的代码怎么就那么累呢?看不懂,变量名记不住。但是,在实际的开发中,多看代码无疑是有好处的,今天就体会到了两处。稍后奉上。


  
    我建立一个新的AppWidget骨架的流程是:

1,建立工程,修改Manifest,AppWidget实际继承的是Broadcast,所以标签是<receiver>,重要的是在其中加上meta-data信息,表示它是一个Widget。关于其他用到的,activity什么的,可以修改category让它不显示出来,category的东西有空我还要查查。
记得添加必要的permission。

2,添加java文件,传说中的AppWidgetProvider,自动添加里面的几个on回调函数。实现自己的逻辑。
在AppWidgetProvider中,利用intent,可以启动3个类,分别是(send)Broadcast,Activity和Service。其中Service可以绑定Broadcast receiver,这个比较有用。
既然Widget什么都不支持,很多东西可以用广播通知Service去做!

3,添加AppWidgetInfo,就是res/xml下的文件,是对Widget的说明文件,定义宽高什么的,定义自动刷新时间,据说这个功能在最近的版本中已经取消了,定时刷新现在都是用Service + 定时实现的,实际程序中也确实没用,不知道为什么。
    这里另外一个要说明的就是configure,今天刚刚实现。它是一个activity,可以在加载Widget到屏幕之前进行一些必要的设置,可选。需要注意的是,configure要负责第一次更新Widget的UI,否则Widget无法画到屏幕上去。

4,最后在AppWidgetProvider中,启动的Activity或者Service中,完成逻辑操作。修改必要的关联名称,就可以实现一个简单的Widget啦。



    今天从菜市口下了几个Widget应用,发现有许多做的相当不错,自己做的东西虽然只有雏形,就已经显示出了落后。看来,在软件写好,到一定阶段,必要的重构是必不可少的,一定不要舍不得!删掉冗余代码的时候,不要舍不得。

今天话怎么这么多这么啰嗦。代码例子有机会再来补上。

你可能感兴趣的:(多线程,UI,框架,xml)