Widget基本使用详细说明:
http://blog.csdn.net/sasoritattoo/article/details/17616597
Widget的基本使用:
- 在工程res/layout目录下创建一个widget的layout(widget.xml)
- 在工程res/xml目录下创建资源文件appwidget-provider,一般设置常用属性:
<appwidget-provider xmlns:android=“http://schemas.android.com/apk/res/android”
android:minWidth=“100dp”
android:minHeight=”100dp”
android:updatePeriodMillis=“10000”
android:initialLayout=“@layout/widget”/>
minWidth:指定widget最小宽度
minHeight:指定widget最小高度
updatePeriodMillis:指定更新时间频率,默认30分钟,若指定的时间小于默认时间,也会被自动指定为30分钟
initialLayout:widget控件的布局
-
创建一个类继承AppWidgetProvider(AppWidgetProvider是BroadcastReceiver的子类),一般会重写以下几个方法:
-
onDeleted():widget被删除的时候触发该方法
-
onDisabled():最后一个widget被删除的时候触发
-
onEnabled():第一次添加widget的时候触发,如果再此添加widget,不会触发该方法
-
onReceive():接收到任意广播的时候触发,会比以上的几个方法先执行
-
AppWidgetProvider案例:
public class WidgetProvider extends AppWidgetProvider {
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
//在删除widget的时候停止服务
context.stopService(new Intent(context, WidgetService.class));
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
//在第一个执行创建widget的时候开启服务
context.startService(new Intent(context, WidgetService.class));
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}
- 创建一个类继承Service,通过Timer等控件定期更新widget
Service更新widget案例(一个TextView显示时间):
public class WidgetService extends Service {
private Timer timer;
private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
updateWidgetView();
}
}, 0, 1000);
}
private void updateWidgetView() {
String time = format.format(new Date());
RemoteViews remoteViews = new RemoteViews(getPackageName(),
R.layout.widget);
remoteViews.setTextViewText(R.id.timeTv, time);
AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
ComponentName componentName = new ComponentName(getApplicationContext(), WidgetProvider.class);
manager.updateAppWidget(componentName, remoteViews);
}
@Override
public void onDestroy() {
super.onDestroy();
timer = null;
}
}
- 在清单文件AndroidManifest.xml配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.exmaple.widget">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=“.WidgetService"/>
<receiver android:name=".WidgetProvider">
<intent-filter>
<action android:name=“android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_config"/>
</receiver>
</application>
</manifest>