用法步骤:
1.绘制Widget布局
2.配置Widget的基本属性
3.定义AppWidgetProvider类似于android中的广播
4.提供Configuration Acivity
学习一个小案例:时钟小组件
效果:可以自动更新时间,可以添加和删除时钟Widget
第一步:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="时间显示" /> </LinearLayout>
第二步
在res文件夹下创建文件夹xml
在xml文件夹里创建配置文件
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget" android:minHeight="40dp" android:minWidth="100dp" android:updatePeriodMillis="800000" > <!-- 配置文件。设置最小宽度,最小高度,加载布局,设置刷新频率毫秒数(最小是30分钟) --> </appwidget-provider>
package com.example.widgettest; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; public class WidgetProvider extends AppWidgetProvider { @Override public void onDeleted(Context context, int[] appWidgetIds) { // TODO Auto-generated method stub super.onDeleted(context, appWidgetIds); //被从屏幕移除 } @Override public void onDisabled(Context context) { // TODO Auto-generated method stub super.onDisabled(context); //最后一个widget被从屏幕移除执行 context.stopService(new Intent(context,TimerService.class)); } @Override public void onEnabled(Context context) { // TODO Auto-generated method stub super.onEnabled(context); //第一个Widget被添加到屏幕时执行, //启动service context.startService(new Intent(context,TimerService.class)); } @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub super.onReceive(context, intent); //在其他方法被调用时被其他方法默认调用 } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // TODO Auto-generated method stub super.onUpdate(context, appWidgetManager, appWidgetIds); //刷新widget时,通过remoteView和AppWidgetManager } }
public class TimerService extends Service { private Timer timer;//定时器 private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//格式化日期 @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { // TODO Auto-generated method stub updateViews(); } }, 0, 1000);//参数三每1秒更新一次,参数二延迟是0; } /** * 更新widget操作 */ private void updateViews(){ String time = sdf.format(new Date()); RemoteViews rv = new RemoteViews(getPackageName(),R.layout.widget); rv.setTextViewText(R.id.textview, time); AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext()); ComponentName cn = new ComponentName(getApplicationContext(),WidgetProvider.class); manager.updateAppWidget(cn, rv); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); //被销毁时停止 timer = null; } }
<service android:name="com.example.widgettest.TimerService" > </service> <receiver android:name="com.example.widgettest.WidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widgetconfig" /> </receiver>
在AndriodManifest.xml中配置receiver的meta-date中android:name应该是android.appwidget.provider而不是android.widget.provider
不然会找不到这个小控件