android clockwidget

本文详细介绍了如何使用Android开发时钟AppWidget小部件,并提供了完整的源码,包括ClockWidgetProvider类、UpdateHelper类以及布局XML文件。通过注册广播接收器和内容观察者来响应系统事件并更新时钟显示。

有很多人写过appwidget,我也小试了一下,写了一个clockwidget:

不多说了,上源码:

代码路径:

上到下依次上源码:ClockWidgetProvider.java

package com.example.clockwidget2;

import android.appwidget.AppWidgetManager;

import android.appwidget.AppWidgetProvider;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.os.Handler;
import android.provider.Settings;
import android.util.Log;

/**
 * AppWidgetProvider 继承自BroadcastReceiver,在AppWidget应用 update . enable . disable
 * 和delete时接收通知,其中,onUpdate onReceive是最常用到的方法 它们接收更新通知 AppWidgetProviderInfo
 * 描述AppWidget的大小,更新频率和初始界面等信息,以XML文件形式在于应用的res/xml目录下 AppWidgetManager
 * 负责管理AppWidget ,向AppWidgetProvider发送通知 RemoteViews 一个可以在其他应用进程
 * 中运行的类,向AppWidgetProvider发送通知
 * 
 * @author Administrator
 * 
 */

public class ClockWidgetProvider extends AppWidgetProvider {

	private int[] mAppWidgetIds;
	private UpBroadcastReceiver mBroadbastReceiver;
	private Context mApplicationContext;
	private final static String TAG = "ClockWidgetProvider";

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		// TODO Auto-generated method stub
		super.onUpdate(context, appWidgetManager, appWidgetIds);
		mAppWidgetIds = appWidgetIds;
		Log.v(TAG, "-------onUpdate-------");

		IntentFilter filter = new IntentFilter();
		filter.addAction(Intent.ACTION_TIME_CHANGED);
		filter.addAction(Intent.ACTION_TIME_TICK);
		filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
		filter.addAction(Intent.ACTION_LOCALE_CHANGED);
		filter.addAction(Intent.ACTION_DATE_CHANGED);
		// 实例化一个广播接收器
		mBroadbastReceiver = new UpBroadcastReceiver();
		Log.v(TAG, "-------mBroadbastReceiver-------");
		mApplicationContext = context.getApplicationContext();
		mApplicationContext.registerReceiver(mBroadbastReceiver, filter);
		mApplicationContext.getContentResolver().registerContentObserver(
				Settings.System.CONTENT_URI, true,
				new DateFormatChangeObserver(mApplicationContext));

	}

	private class DateFormatChangeObserver extends ContentObserver {
		private Context context;

		public DateFormatChangeObserver(Context context) {
			super(new Handler());
			this.context = context;
		}

		@Override
		public void onChange(boolean selfChange) {
			// TODO Auto-generated method stub
			super.onChange(selfChange);
			Log.v(TAG, "-------DateFormatChangeObserver  onChange-------");
			UpdateHelper.updateTime(context, mAppWidgetIds);

		}

	}

	public class UpBroadcastReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			Log.v(TAG, "-------UpBroadcastReceiver  onReceive-------");
			UpdateHelper.updateTime(context, mAppWidgetIds);
		}

	}

}
 

UpdateHelper.java

package com.example.clockwidget2;

import java.util.Calendar;

import android.app.ActivityManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.util.Log;
import android.widget.RemoteViews;

public class UpdateHelper {
	private final static String TAG = "updatehelper";
	private final static String M12 = "hh:mm";
	private final static String M24 = "kk:mm";
	private final static String WEEK_OF_DAY_FORMAT = "EEEE";

	public static void updateTime(Context context, int[] appWidgetIds) {
		// TODO Auto-generated method stub
		final int N = appWidgetIds.length;
		Log.d(TAG, "N = " + N);
		for (int i = 0; i < N; i++) {
			int appWidgetId = appWidgetIds[i];
			RemoteViews updateViews = new RemoteViews(context.getPackageName(),
					R.layout.main);
			Intent openApp = new Intent();
			openApp.setClassName("com.android.settings",
					"com.android.settings.DateTimeSettings");
			openApp.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
					openApp, PendingIntent.FLAG_UPDATE_CURRENT);
			Log.d(TAG, "---PendingIntent---");
			updateViews.setOnClickPendingIntent(R.id.timeprovider,
					pendingIntent);

			Calendar calendar = Calendar.getInstance();
			calendar.setTimeInMillis(System.currentTimeMillis());
			boolean is24HourFormat = android.text.format.DateFormat
					.is24HourFormat(context);// 得到是否是24小时制
			String timeFormat = is24HourFormat ? M24 : M12;
			CharSequence newTime = DateFormat.format(timeFormat, calendar);
			Log.d(TAG, "---dateStr---" + Calendar.getInstance().getTime());
			String dateStr = android.text.format.DateFormat
					.getDateFormat(context)
					.format(Calendar.getInstance().getTime()).replace("/", "-");
			if (!is24HourFormat) {
				String replacement = DateUtils.getAMPMString(calendar
						.get(Calendar.AM_PM));
				dateStr = dateStr + " " + replacement;
			}

			CharSequence dayStr = DateFormat.format(WEEK_OF_DAY_FORMAT,
					calendar);

			// 获取资源ID
			int resHourtenId = getTimeDrawable(newTime.charAt(0) - '0');
			int resHouroneId = getTimeDrawable(newTime.charAt(1) - '0');
			int resMintenId = getTimeDrawable(newTime.charAt(3) - '0');
			int resMinoneId = getTimeDrawable(newTime.charAt(4) - '0');
			// 在VIew上设置对应资源ID
			updateViews.setImageViewResource(R.id.time_hour_ten, resHourtenId);
			updateViews.setImageViewResource(R.id.time_hour_one, resHouroneId);
			updateViews.setImageViewResource(R.id.time_min_ten, resMintenId);
			updateViews.setImageViewResource(R.id.time_min_one, resMinoneId);

			updateViews.setTextViewText(R.id.tv_date, dateStr);
			updateViews.setTextViewText(R.id.tv_week, dayStr);
			// 更新appwidget
			AppWidgetManager manager = AppWidgetManager.getInstance(context);
			manager.updateAppWidget(appWidgetId, updateViews);

		}
	}

	private static int getTimeDrawable(int index) {
		// TODO Auto-generated method stub
		int drawableId = -1;
		switch (index) {
		case 0:
			drawableId = R.drawable.time0;
			break;
		case 1:
			drawableId = R.drawable.time1;
			break;
		case 2:
			drawableId = R.drawable.time2;
			break;
		case 3:
			drawableId = R.drawable.time3;
			break;
		case 4:
			drawableId = R.drawable.time4;
			break;
		case 5:
			drawableId = R.drawable.time5;
			break;
		case 6:
			drawableId = R.drawable.time6;
			break;
		case 7:
			drawableId = R.drawable.time7;
			break;
		case 8:
			drawableId = R.drawable.time8;
			break;
		case 9:
			drawableId = R.drawable.time9;
			break;

		}
		return drawableId;
	}

}


main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/timeprovider"
    android:layout_width="320.0dip"
    android:layout_height="147.0dip"
    android:background="@drawable/bg"
    android:orientation="vertical">

	<RelativeLayout 
	    android:id="@+id/timelayout"
	    android:layout_width="fill_parent"
	    android:layout_height="58.0dip"
	    android:layout_marginTop="30.0dip"
	    >
	    
	    <ImageView 
	        android:id="@+id/time_hour_ten"
	        android:layout_width="40.0dip"
	        android:layout_height="58.0dip"
	        android:layout_marginLeft="56.0dip"
	        android:src="@drawable/time_8"
	        />
	    
	    <ImageView 
	        android:id="@+id/time_hour_one"
	        android:layout_width="40.0dip"
	        android:layout_height="58.0dip"
	        android:layout_alignTop="@id/time_hour_ten"
	        android:layout_marginLeft="8.0dip"
	        android:layout_toRightOf="@id/time_hour_ten"
	        android:src="@drawable/time_8"
	        />
	    
	    <ImageView 
	        android:id="@+id/time_min_ten"
	        android:layout_width="40.0dip"
	        android:layout_height="58.0dip"
	        android:layout_alignTop="@id/time_hour_one"
	        android:layout_marginLeft="34.0dip"
	        android:layout_toRightOf="@id/time_hour_one"
	        android:src="@drawable/time_8"
	        />
	    
	    <ImageView 
	        android:id="@+id/time_min_one"
	        android:layout_width="40.0dip"
	        android:layout_height="58.0dip"
	        android:layout_alignTop="@id/time_min_ten"
	        android:layout_marginLeft="8.0dip"
	        android:layout_toRightOf="@id/time_min_ten"
	        android:baselineAlignBottom="true"
	        android:src="@drawable/time_8"
	        />
	</RelativeLayout>
	
	<LinearLayout 
	    android:layout_width="fill_parent"
	    android:layout_height="match_parent"
	    android:orientation="horizontal"
	    >
	    
	    <TextView 
	        android:id="@+id/tv_date"
	        android:layout_width="1.0dip"
	        android:layout_height="fill_parent"
	        android:layout_weight="1.0"
	        android:ellipsize="none"
	        android:gravity="bottom"
	        android:paddingBottom="7.0dip"
	        android:paddingLeft="40.0dip"
	        android:singleLine="true"
	        android:textColor="#ff00c0ff"
	        android:textSize="16.0sp"
	        />
	    
	    <TextView 
	        android:id="@+id/tv_week"
	        android:layout_width="1.0dip"
	        android:layout_height="fill_parent"
	        android:layout_weight="1.0"
	        android:ellipsize="none"
	        android:gravity="right"
	        android:paddingRight="40.0dip"
	        android:paddingTop="28.0dip"
	        android:singleLine="true"
	        android:textColor="#ff00c0ff"
	        android:textSize="16.0sp"
	        />
	</LinearLayout>

</LinearLayout>

appwidget-provider.xml

<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="250.0dip"
    android:minHeight="110.0dip"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/main"
    ></appwidget-provider>

androidmanifast.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.clockwidget2"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
      <!--   <activity
            android:name="com.example.clockwidget2.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity> -->
        <receiver 
            android:name="com.example.clockwidget2.ClockWidgetProvider"
            >
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/appwidget_provider"
                ></meta-data>
            <intent-filter >
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值