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);
- }
- }
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>
其中 minWidth属性是widget窗口最小宽度 minHeight属性是widget的最小高度initaialLayout是widgit的布局文件configure 属性是widget的配置activity的名称(注意:必须把包名也写全)这个属性可以没有,如果定义了这个属性那么添加widget的时候会先打开这里指定的activity用来配置这个widget 还有一个updatePeriodMillis属性是用来设置自动更新时间的但在1.5版本后已经废除改为固定30分钟
widget配置activity
- public WidgetConfigure extends Activity
- {
- onCreate()...
- .....
- }
注意这个activity在AndroidManiFest中注册时的写法
- <activity android:name=".WidgetConfigure">
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
- </intent-filter>
- </activity>
然后再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>
应该是必须这么写 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");
- }
然后记得在AndroidManiFest文件中注册Service
- <service android:name=".MyService">
- <intent-filter >
- <action android:name="com.UPDATE_TIME"/>
- </intent-filter>
- </service>
这样service就创建完毕了,最后在widget中的onUpdate方法中开启服务
- public void onUpdate(Context context, AppWidgetManager appWidgetManager,
- int[] appWidgetIds) {
- Intent service = new Intent("com.UPDATE_TIME");
- context.startService(service);
- }
这就实现了一个可以显示系统时间并自动根新的widget。
小结:Widget应用学习笔记的内容介绍完了,希望通过Widget内容的学习能对你有所帮助!