建立appwidget
做过了appwidget但是貌似心里还是不是很清楚整过过程,话说当初觉得android很简单,现在看来太高估自己了。android里面的东西还是又很多要学习的!
好了就说说我们这里的widget吧,我将详细的介绍建立widget的每一个步骤可能我的话我会自己写一个demo上传(当然得时间允许)
-------------------------------------------------------------------------------------
第一步:建立AppWidgetProviderInfo这个xml文件
建立目的:这里我们要定义wideget的大小更新时间等等
google的原文如下:
AppWidgetProviderInfoobject
DescribesthemetadataforanAppWidget,suchastheAppWidget'slayout,updatefrequency,andtheAppWidgetProviderclass.ThisshouldbedefinedinXML.
AppWidgetProviderInfo对象
为这个widget提供元数据,例如widget的布局,更新频率,和AppWidgetProvider类,这些事必须定义在xml中的我们在res下建立xml文件夹然后建立your_name_provider.xml(名字自己定义吧)
google-androidcode
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="294dp" android:minHeight="72dp" android:updatePeriodMillis="86400000" android:previewImage="@drawable/preview" android:initialLayout="@layout/example_appwidget" android:configure="com.example.android.ExampleAppWidgetConfigure" android:resizeMode="horizontal|vertical"> </appwidget-provider>
android:minwidth="294dp"android:minheight="72dp"定义宽和高
android:updatePeriodMillis="86400000"定义更新频率
android:previewImage="@drawable/preview"定义预览图片
android:initialLayout="@layout/example_appwidget"定义初始化布局
android:configure="com.example.android.ExampleAppWidgetConfigure"这是一个可选的参数这里之所以这么定义是让我们自己选择是否在启动这个widget之前先启动一个activity
android:resizeMode="horizontal|vertical"定义在桌面可以上下或者左右调整大小
第二步:
上面第一步的工作就是为了第二步用,我们在定义AppWidgetProvider了
在mainfest.xml中定义自己的AppWidgetProvider
google----anroidcode
<receiver android:name="ExampleAppWidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info" /> </receiver>
<actionandroid:name="android.appwidget.action.APPWIDGET_UPDATE"/>定义了系统发出APPWIDGET_UPDATE通知这个receiver
meta-data定义了元数据,通过resource指定AppWidgetProvider的相关属性(包括了大小更新频率等等)
这些设置好之后就是设置我们的layout了因为现在widget虽然产生了但是widget中的view我们还没有定义出来,接下来就是要定义我们的layout了
但是请注意在定义view的时候有些组件我们是不能使用的,因为widget不支持这些组件
google--android:
ARemoteViewsobject(and,consequently,anAppWidget)cansupportthefollowinglayoutclasses:
FrameLayout
LinearLayout
RelativeLayout
Andthefollowingwidgetclasses:
AnalogClock
Button
Chronometer
ImageButton
ImageView
ProgressBar
TextView
ViewFlipper
布局就支持以上三种,组件也就那么多!所以使用的时候要注意
完成AppWidgetProvider的工作之后我们的widget就算是完成了80%了,剩下的事情就是怎么让你定义好的layout显示在屏幕上了,上面我们看到了RemoteViews就是它了,
我们剩下的显示的事情可以放在service里面处理利用remoteview对象
RemoteViews views = new RemoteViews(getPackageName(),R.layout.yourlayoutname);
在remoteview上处理了之后我们要做的就是更新widget(也就是通知AppWidgetProvider刷新界面了)这时我们使用
ComponentNamewidget=newComponentName(Context,AppWidgetProvider.class);
AppWidgetManagermanager=AppWidgetManager.getInstance(this);manager.updateAppWidget(widget,views);
这样的话我们就更新了界面(使用updateAppWidget(ComponentNameprovider,RemoteViewsviews)android源码里这么写着注释
Itisokaytocallthismethodbothinsidean{@link#ACTION_APPWIDGET_UPDATE}broadcast,*andoutsideofthehandler.我理解的意思就是如果能成功调用这个updateAppWidget方法就是类似于系统发出了。。。android.appwidget.action.APPWIDGET_UPDATE广播mainfest.xml中已经定义了)
到这里为止我们的一个widget已经可以说完成了!