做过了appwidget但是貌似心里还是不是很清楚整过过程,话说当初觉得android 很简单,现在看来太高估自己了。android 里面的东西还是又很多要学习的!
好了就说说我们这里的widget吧,我将详细的介绍建立widget 的每一个步骤可能我的话我会自己写一个demo上传(当然得时间允许)
-------------------------------------------------------------------------------------
第一步:建立 AppWidgetProviderInfo这个xml文件
建立目的:这里我们要定义wideget的大小更新时间等等
google的原文如下:
AppWidgetProviderInfo object
Describes the metadata for an App Widget, such as the App Widget's layout, update frequency, and the AppWidgetProvider class. This should be defined in XML.
AppWidgetProviderInfo 对象
为这个widget提供元数据,例如 widget 的布局,更新频率,和 AppWidgetProvider 类,这些事必须定义在xml中的 我们在res下建立 xml文件夹 然后建立 your_name_provider.xml(名字自己定义吧)
google-android code
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----anroid code
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 定义了系统发出APPWIDGET_UPDATE 通知这个 receiver
meta-data 定义了元数据,通过resource 指定 AppWidgetProvider的相关属性(包括了大小 更新频率 等等)
这些设置好之后就是设置我们的layout 了因为现在widget虽然产生了 但是widget中的 view 我们还没有定义出来,接下来就是要定义我们的layout 了
但是请注意在定义view 的时候有些组件我们是不能使用的,因为widget不支持这些组件
google--android:
A RemoteViews object (and, consequently, an App Widget) can support the following layout classes:
FrameLayout
LinearLayout
RelativeLayout
And the following widget classes:
AnalogClock
Button
Chronometer
ImageButton
ImageView
ProgressBar
TextView
ViewFlipper
布局就支持以上三种,组件也就那么多!所以使用的时候要注意
完成AppWidgetProvider 的工作之后我们的widget就算是完成了80%了,剩下的事情就是怎么让你定义好的layout显示在屏幕上了,上面我们看到了 RemoteViews 就是它了,
我们剩下的显示的事情 可以放在service里面处理 利用remoteview 对象
在remoteview上处理了之后我们要做的就是 更新widget(也就是通知AppWidgetProvider 刷新界面了) 这时我们使用
ComponentName widget = new ComponentName(Context, AppWidgetProvider.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this); manager.updateAppWidget(widget, views);
这样的话我们就更新了界面(使用updateAppWidget(ComponentName provider, RemoteViews views) android 源码里这么写着注释
It is okay to call this method both inside an {@link #ACTION_APPWIDGET_UPDATE} broadcast, * and outside of the handler.我理解的意思就是 如果能成功调用这个 updateAppWidget方法 就是类似于系统发出了。。。android.appwidget.action.APPWIDGET_UPDATE 广播 mainfest.xml中已经定义了)
到这里为止我们的一个widget已经可以说完成了!
好了就说说我们这里的widget吧,我将详细的介绍建立widget 的每一个步骤可能我的话我会自己写一个demo上传(当然得时间允许)
-------------------------------------------------------------------------------------
第一步:建立 AppWidgetProviderInfo这个xml文件
建立目的:这里我们要定义wideget的大小更新时间等等
google的原文如下:
AppWidgetProviderInfo object
Describes the metadata for an App Widget, such as the App Widget's layout, update frequency, and the AppWidgetProvider class. This should be defined in XML.
AppWidgetProviderInfo 对象
为这个widget提供元数据,例如 widget 的布局,更新频率,和 AppWidgetProvider 类,这些事必须定义在xml中的 我们在res下建立 xml文件夹 然后建立 your_name_provider.xml(名字自己定义吧)
google-android code
<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----anroid code
<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>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 定义了系统发出APPWIDGET_UPDATE 通知这个 receiver
meta-data 定义了元数据,通过resource 指定 AppWidgetProvider的相关属性(包括了大小 更新频率 等等)
这些设置好之后就是设置我们的layout 了因为现在widget虽然产生了 但是widget中的 view 我们还没有定义出来,接下来就是要定义我们的layout 了
但是请注意在定义view 的时候有些组件我们是不能使用的,因为widget不支持这些组件
google--android:
A RemoteViews object (and, consequently, an App Widget) can support the following layout classes:
FrameLayout
LinearLayout
RelativeLayout
And the following widget classes:
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 刷新界面了) 这时我们使用
ComponentName widget = new ComponentName(Context, AppWidgetProvider.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this); manager.updateAppWidget(widget, views);
这样的话我们就更新了界面(使用updateAppWidget(ComponentName provider, RemoteViews views) android 源码里这么写着注释
It is okay to call this method both inside an {@link #ACTION_APPWIDGET_UPDATE} broadcast, * and outside of the handler.我理解的意思就是 如果能成功调用这个 updateAppWidget方法 就是类似于系统发出了。。。android.appwidget.action.APPWIDGET_UPDATE 广播 mainfest.xml中已经定义了)
到这里为止我们的一个widget已经可以说完成了!