以在桌面上显示时间为例
继承自 AppWidgetProvider 并且间接父类是广播 BroadCastReceive
可以配置文件中的action----------------->android.appwidget.action.APPWIDGET_UPDATE 用于广播系统对widget的添加和删除等操作
需要在res/xml文件夹下写关于小部件的一些属性
<?xml version="1.0"encoding="utf-8"?>
<!-- initialLayout表示 weiget的布局文件是哪一个 minHeight 最小高度 minWidth最小宽度 updatePeriodMillis 刷新频率 默认30分钟单位为毫秒 -->
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/mywidget"
android:minHeight="144dp"
android:minWidth="288dp"
android:updatePeriodMillis="0" >
</appwidget-provider>
AppWidgetProvider有多个生命周期的方法
常用的有
onUpdate当小部件被更新时调用的方法
onDisabled当小部件被移除时调用的方法
onEnabled 当小部件被添加时 调用的方法
onReceive 接受广播时 调用的方法
整体思路为:
当有部件被添加时 开启一个服务用Timer类 每一秒钟获取一次系统时间 并且用RemoteViews来改变小部件(TextView)的内容 .具体代码实例如下:
MyService:
package com.redwolf.mywidget;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent;
import android.os.IBinder;
import android.widget.RemoteViews;
public class MyService extends Service {
// 当启动服务的时候就应该起一个线程来
privateRemoteViews rv;
privateSimpleDateFormat sdf;
privateAppWidgetManager manager;
privateComponentName provider;
privateTimer time;
publicvoid onCreate() {
time= new Timer();
sdf= new SimpleDateFormat("yyyy年MM月dd HH:mm:ss");
//一个管理者
manager= AppWidgetManager.getInstance(getApplicationContext());
provider= new ComponentName(getApplicationContext(),
MyWidgetProvider.class);
//每1秒执行一次
time.schedule(newMyTask(), 0, 1000);
}
publicIBinder onBind(Intent arg0) {
returnnull;
}
@Override
publicvoid onDestroy() {
//TODO Auto-generated method stub
super.onDestroy();
time.cancel();
time= null;
}
classMyTask extends TimerTask {
//自定义的计时器
publicvoid run() {
//每次循环过来都要更改一次
rv= new RemoteViews(getPackageName(), R.layout.mywidget);
rv.setTextViewText(R.id.tv_time,sdf.format(new Date()));
manager.updateAppWidget(provider,rv);
}
}
}
MyWidgetProvider:
package com.redwolf.mywidget;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
/**
*Widget桌面小控件 继承自AppWidgetProvider 并且间接父类是广播BroadCastReceive 配置文件中的action
*android.appwidget.action.APPWIDGET_UPDATE 用于广播系统对widget的添加和删除等操作
* 需要在res/xml文件夹下 写一些配置
*
* @作者 RedWolf
*
* @时间 2015年12月16日上午11:20:06
*/
public class MyWidgetProvider extendsAppWidgetProvider {
privateIntent intent;
// 当控件被更新时调用的方法
// public void onUpdate(Context context, AppWidgetManager appWidgetManager,
//int[] appWidgetIds) {
//super.onUpdate(context, appWidgetManager, appWidgetIds);
//
// }
// 当控件被移除时调用的方法
publicvoid onDisabled(Context context) {
super.onDisabled(context);
intent= new Intent(context, MyService.class);
context.stopService(intent);
}
// 当控件被添加时调用的方法
publicvoid onEnabled(Context context) {
super.onEnabled(context);
//在控件被添加到桌面的时候启动一个服务
intent= new Intent(context, MyService.class);
context.startService(intent);
}
// 当接收到广播时被调用
// public void onReceive(Context context, Intent intent) {
// //TODO Auto-generated method stub
//super.onReceive(context, intent);
//switch (intent.getAction()) {
//case "android.intent.action.TIME_SET":
//
//break;
//
//default:
//break;
// }
// }
}
小部件的Layout:
<?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="100dp"
android:gravity="center"
android:orientation="vertical" >
<!-- 这个就是小组件的布局 只需要一个TextView就是了-->
<TextView android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:gravity="center"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="我是要显示的时间"/>
</LinearLayout>
清单文件:
<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.redwolf.mywidget"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="20" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 注册widget对应的WidgetProvider -->
<receiver android:name="com.redwolf.mywidget.MyWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/appwidget_peizhi"/>
</receiver>
<!-- 注册Service -->
<service android:name="com.redwolf.mywidget.MyService">
</service>
</application>
</manifest>