之前一直做平台管理工作,没有多少机会写代码,但自己又对这方面比较感兴趣,所以平时无聊时也学学,刚开始看的是普通的应用开发,后来投了一家公司的简历,要求我模仿新浪微博的widget写个功能类似的小部件,这玩意没玩过,不懂,上网找了下结果没找到,由于时间问题,上网问题,最后放弃了。。。蛋疼,废话。下面主要介绍一下小部件的用法。
小部件可以看成是一个微型的view,和activity不同的是activity同时只能显示一个而小部件可以显示多个。
通过继承AppWidgetProvider来发布自己的小部件,而容纳widget的叫做AppWidgetHost,比如桌面,下面开始小白式开发
1.新建一个android工程,去掉前面的Create activity勾勾,然后在当前包下新建一个class,继承自AppWidgetProvider,取名为ShowTimer.
2.修改AndroidManifest.xml,代码如下
其中用到一个receive组件,这是因为我们的程序是继承AppWidgetProvider而不是activity,而后者又是继承自BroadcastReceive.
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>因为我们的小部件要定期更新
重要一行
<meta-data android:name="android.appwidget.provider" android:resource="@xml/provider"></meta-data>
其中的xml/provider是我们自己定义的一个xml,用于描述小部件的位置,布局和更新时间等,代码如下
其中的布局main就是一个普通的布局文件(小部件使用的布局组件有限制,不是什么都能用,具体google),
android:updatePeriodMillis="5"更新周期,我在模拟器上好像这个周期不管用,不知道为什么
其中main的布局如下,简单的text+button
普通的布局文件,不解释
下面就是主代码了,上代码如下:
其中的onUpdate()函数是主要函数,每次接受更新时这个函数都会调用,不过我自己试了只有在把小部件添加到桌面的时候会调用一次。。
还有几个callback这里就不说了,看名字就知道什么意思。onDelete(Context,int []),onEnable(),onDisable(Context),onReceive(Context,Intent)....
下面简单解释一下代码,int[] appWidgetIds存放了该小部件的实例id,因为一个小部件可以有多个实例。由于xml中定义的更新不管用,所以我自己开了个线程来更新,每隔一秒钟data加1,然后显示出来。
RemoteViews updateView = buildUpdate(mContext); //更新试图,看下函数代码就明白了
appWidgetManager.updateAppWidget(appWidgets, updateView);
由于widget是间接继承自BroadcastReceive的,并没有显示view的能力,所以显示需要有小部件Host(宿主)来处理。这之间的通讯
是通过RemoteViews来完成的传递的(IPC).
OK了,终于完成处女作了,简单的不能再简单,不过总是一个开始。。。继续开荒!!