android clockwidget

来源:互联网 发布:linux查看系统重启时间 编辑:程序博客网 时间:2024/05/18 00:30

有很多人写过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";@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {// TODO Auto-generated method stubsuper.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;}@Overridepublic void onChange(boolean selfChange) {// TODO Auto-generated method stubsuper.onChange(selfChange);Log.v(TAG, "-------DateFormatChangeObserver  onChange-------");UpdateHelper.updateTime(context, mAppWidgetIds);}}public class UpBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubLog.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 stubfinal 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);// 获取资源IDint 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上设置对应资源IDupdateViews.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);// 更新appwidgetAppWidgetManager manager = AppWidgetManager.getInstance(context);manager.updateAppWidget(appWidgetId, updateViews);}}private static int getTimeDrawable(int index) {// TODO Auto-generated method stubint 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>



原创粉丝点击