本文总结widget的制作方法 以iper为例
1. widget界面的layout 定义 存放路径 /res/layout/iper_widget.xml.  这里要注意 制作widget与其他不同, 最好在layout中设置好固定设备元素大小. 
 标记定义了Widget的大小,默认布局和创建Widget实例时的启动行为配置,为了让Widget在主屏幕上更好地显示,Widget必须保持一定的大小,主屏幕分为特定大小的单元格,Google提供的基本原则是用你想占用的单元格数量乘以74,再减去2。在这个例子中,Widget应该是一个正方形,长和宽都各占两个单元格,因此大小就是74*2-2=146.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  
xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation
="horizontal" android:layout_width="294dp" android:layout_height="72dp" android:background="@drawable/iper_shape" android:gravity="left|center_vertical">
  
<TextView android:layout_width="wrap_content" android:text="IP:" android:layout_weight="1" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="fill_parent" android:gravity="left"></TextView>
<TextView android:layout_width="wrap_content" android:id="@+id/tvIp" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="fill_parent" android:gravity="left"></TextView>
</LinearLayout>
其中 iper_shape 是一个控制显示效果的渐变器 /res/drawable/iper_shape.xml 代码:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    
<gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF" 
            android:angle
="270"/> 
    
<padding android:left="50dp" android:top="20dp" 
            android:right
="7dp" android:bottom="7dp" /> 
    
<corners android:radius="8dp" /> 
    
</shape> 
2. appwidget-provider 这里定义了widget的大小,更新速度, 以及widget界面layout文件  文件存放地址 /res/xml/iper_info.xml
<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider
    
android:minWidth="294dp" 
    android:minHeight
="72dip" 
    android:updatePeriodMillis
="600000" 
    android:initialLayout
="@layout/iper_widget"
    xmlns:android
="http://schemas.android.com/apk/res/android" />
3. 最后在AndroidManifest.xml 中添加 
<receiver android:name="IperWidget">
            
<intent-filter>
                
<action android:name = "android.appwidget.action.APPWIDGET_UPDATE"></action>
                
</intent-filter>
            
<meta-data android:name ="android.appwidget.provider" android:resource="@xml/iper_info">
            
</meta-data>
        
</receiver>
    
</application>
4. 当然要建立一个继承于AppWidgetProvider 的类 IperWidget
package com.iper;


import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.widget.RemoteViews;

public class IperWidget extends AppWidgetProvider {

    @Override
    
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            
int[] appWidgetIds) {
        
        RemoteViews remoteView 
= new RemoteViews(context.getPackageName(), R.layout.iper_widget);
        String ip 
= getIp(context);
        remoteView.setTextViewText(R.id.tvIp, ip);
        appWidgetManager.updateAppWidget(appWidgetIds, remoteView);
        
//super.onUpdate(context, appWidgetManager, appWidgetIds);
    }
    
private String getIp(Context context){
        
if(Utils.isNetAvailable(context)){
            
return Utils.getWifiIpAddress(context);
        } 
else {
            
return "INTNET failure";
        }
    }
}
这样一个显示ip地址的widget就完成了