有很多人写过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>