Android Widget小组件开发

用法步骤:

1.绘制Widget布局

2.配置Widget的基本属性

3.定义AppWidgetProvider类似于android中的广播

4.提供Configuration Acivity

学习一个小案例:时钟小组件

效果:可以自动更新时间,可以添加和删除时钟Widget


第一步:

<?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="match_parent"
    android:orientation="vertical" >


    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="时间显示" />


</LinearLayout>

第二步

在res文件夹下创建文件夹xml

在xml文件夹里创建配置文件

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/widget"
    android:minHeight="40dp"
    android:minWidth="100dp"
    android:updatePeriodMillis="800000" >

    <!-- 配置文件。设置最小宽度,最小高度,加载布局,设置刷新频率毫秒数(最小是30分钟) -->

</appwidget-provider>

第三步广播:

package com.example.widgettest;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;

public class WidgetProvider extends AppWidgetProvider {

	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
		// TODO Auto-generated method stub
		super.onDeleted(context, appWidgetIds);
		//被从屏幕移除
	}
	@Override
	public void onDisabled(Context context) {
		// TODO Auto-generated method stub
		super.onDisabled(context);
		//最后一个widget被从屏幕移除执行
		context.stopService(new Intent(context,TimerService.class));
	}
	@Override
	public void onEnabled(Context context) {
		// TODO Auto-generated method stub
		super.onEnabled(context);
		//第一个Widget被添加到屏幕时执行,
		//启动service
		context.startService(new Intent(context,TimerService.class));

	}
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		super.onReceive(context, intent);
		//在其他方法被调用时被其他方法默认调用
	}
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		// TODO Auto-generated method stub
		super.onUpdate(context, appWidgetManager, appWidgetIds);
		//刷新widget时,通过remoteView和AppWidgetManager

	}
}

第四步:创建服务

public class TimerService extends Service {

	private Timer timer;//定时器
	private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//格式化日期
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		timer = new Timer();
		timer.schedule(new TimerTask() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				updateViews();
			}
		}, 0, 1000);//参数三每1秒更新一次,参数二延迟是0;

	}
	/**
	 * 更新widget操作
	 */
	private void updateViews(){
		String time = sdf.format(new Date());
		RemoteViews rv = new RemoteViews(getPackageName(),R.layout.widget);
		rv.setTextViewText(R.id.textview, time);
		AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
		ComponentName cn = new ComponentName(getApplicationContext(),WidgetProvider.class);
		manager.updateAppWidget(cn, rv);
	}
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		//被销毁时停止
		timer = null;
	}

}


第五步配置文件中声明。服务和广播

  <service android:name="com.example.widgettest.TimerService" >
        </service>

        <receiver android:name="com.example.widgettest.WidgetProvider" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widgetconfig" />
        </receiver>

注意:

在AndriodManifest.xml中配置receiver的meta-date中android:name应该是android.appwidget.provider而不是android.widget.provider
不然会找不到这个小控件



你可能感兴趣的:(android)