Widget应用学习笔记是本文要介绍的内容,主要是来了解并学习Widget应用,Widget小组件可以放在android桌面上的小组件,其中的布局只支持ImageView TextView Button等简单组件。
下面以在桌面上显示Hello World!为例
首先建立自己Widget类 必须要继承AppWidgetProvider
然后重写onUpdate()方法
public class MyWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
//获得一个远程试图对象
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
//修改试图中的文本
views.setTextViewText(R.id.text, "Hello World!" );
//更新widget
appWidgetManager.updateAppWidget(appWidgetIds, views);
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
onUpdate方法中context参数是向widget发送更新请求的上下文环境,appWidgetmanager可以当作整个widget的管理者,它的updateAppWidget()方法可以更新指定wighet的view,appWidgetIds系统发出更新请求时更新的所有widget的ID集合,新建widget时整个数组中只有一个值就是当前widget的id,1.5版本后固定每30分钟系统会自动更新一次widget,系统自动更新,重启手机时都会执行onUpdate方法这时appWidgetIds就是桌面上所有widget的ID的集合。
写一个appwidget.xml文件设置widget的属性
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="144dip" android:minHeight="72dp"
android:configure="com.iee_2005.weather.WidgetConfigure"
android:initialLayout="@layout/main">
</appwidget-provider>
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
其中 minWidth属性是widget窗口最小宽度 minHeight属性是widget的最小高度initaialLayout是widgit的布局文件configure 属性是widget的配置activity的名称(注意:必须把包名也写全)这个属性可以没有,如果定义了这个属性那么添加widget的时候会先打开这里指定的activity用来配置这个widget 还有一个updatePeriodMillis属性是用来设置自动更新时间的但在1.5版本后已经废除改为固定30分钟
widget配置activity
public WidgetConfigure extends Activity
{
onCreate()...
.....
}
- 1.
- 2.
- 3.
- 4.
- 5.
注意这个activity在AndroidManiFest中注册时的写法
<activity android:name=".WidgetConfigure">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
然后再androidManiFest.xml中注册widget,这里可以看到widget其实一就是一个广播接收器
<receiver android:name=".MyWidget" android:label="时间">
<intent-filter >
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget"/>
</receiver>
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
应该是必须这么写 resource属性的值是widget配置文件的位置
然后运行 在手机桌面上长按或 点menu键->添加 添加小组件 找到我们写的widget就可以看到效果了
定时更新widget
从sdk1.5以后appwidget.xml文件中的updatePeriodMillis属性被废除了 所以不能用直接修改updatePeriodMillis属性来实现定时更新widget
想要定时更新widget就要用Service,创建一个Service用来计时并更新widget内容 在widget被调用时开启服务public class MyService extends Service implements Runnable{
private AppWidgetManager appWidgetManager;
private ComponentName componentName;
private Handler mHandler;
private int h,m,s;
private String text;
private SimpleDateFormat dateFormat;
/*
* 此方法为Service必须有的方法 此例中没有用到
*/
public IBinder onBind(Intent intent) {
return null;
}
/*
* 服务创建时执行整个方法 一般用来初始化
*/
public void onCreate() {
appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
componentName = new ComponentName(getApplicationContext(), MyWidget.class);
mHandler = new Handler();
dateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
}
/*
* 开始服务 ,如果服务已经存在 每次应用发送服务移动时执行一次onStart方法而不执行onCreate
这里使用Handler实例对象上传一个线程到UI线程列队中用来更新widget的UI即Views
*/
public void onStart(Intent intent, int startId) {
mHandler.post(this);
}
/*
* 服务被销毁时执行此方法,撤销更新线程
*/
public void onDestroy() {
Log.i("mylog","stop");
mHandler.removeCallbacks(this);
}
/*
*更新widget的views的线程
/
public void run() {
RemoteViews views = new RemoteViews(getApplicationContext().getPackageName(),R.layout.main);
views.setTextViewText(R.id.text, dateFormat.format(new Date()));
appWidgetManager.updateAppWidget(componentName, views);
mHandler.postDelayed(this, 1000);
Log.i("mylog", "update");
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
然后记得在AndroidManiFest文件中注册Service
<service android:name=".MyService">
<intent-filter >
<action android:name="com.UPDATE_TIME"/>
</intent-filter>
</service>
- 1.
- 2.
- 3.
- 4.
- 5.
这样service就创建完毕了,最后在widget中的onUpdate方法中开启服务
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Intent service = new Intent("com.UPDATE_TIME");
context.startService(service);
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
这就实现了一个可以显示系统时间并自动根新的widget。
小结:Widget应用学习笔记的内容介绍完了,希望通过Widget内容的学习能对你有所帮助!