第六部分 Widget日历
本例实现了Widget日历,用来显示当前的日期,时间等信息。要学习开发Widget开发,需要了解AppWidget的框架结构。基于该框架,开发者可以在Ophone及模拟器上开发"外形"
类似传统的Widget小应用程序,并将其嵌入到其他应用中。
注意:Widget设计好UI后根据需要来完成更新,如果程序不需要使用定时来更新AppWidget,则最好不要使用定时更新,因为它会增加电量和CUP资源的开销。我们可以定义一个线程,当需要
时才更新,这样可以让Widget达到最高效率
AppWidget框架主要包括以下类:
AppWidgetProvider: 该类继承自BroadcastReceiver,在AppWidget应用update、enable、disable、deleted时接受通知。其中,onUpdate、onReceive用来接收更新通知。
AppWidgetProviderInfo:该类主要用于AppWidget的大小、更新频率和初始界面等信息,以XML文件形式存在于res/xml目录下。
AppWidgetManager:该类负则管理AppWidget,及向AppWidgetProvider发送通知。
RemoteViews:一个可以在其他应用进程中运行的类,是构造AppWidget的核心。
Widget开发流程
res.layout.widget_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="
http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="146dp"
android:minWidth="146dp"
android:background="@drawable/bgblack"
android:id="@+id/Base"
>
<LinearLayout//需要3个TextView来显示日期
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center"
android:paddingTop="5dip"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/Month"
android:layout_gravity="center"
android:textStyle="bold"
android:textSize="18sp"
android:textColor="#FFFFFF"
></TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/Date"
android:textStyle="bold"
android:textSize="70sp"
android:textColor="#FFFFFF"
></TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/WeekDay"
android:layout_gravity="center"
android:textSize="15sp"
android:textStyle="bold"
android:textColor="#FFFFFF"
></TextView>
</LinearLayout>
</LinearLayout>
res.xml.widget.xml
<?xml version="1.0" encoding="utf-8"?>//一个能反映出AppWidgetProviderInfo信息的布局文件。AppWidget的像素大小取决于它所占方块多少(计算公式(块数*74)-2),因此
取高度为146像素,宽度是146像素
<appwidget-provider
xmlns:android="
http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/widget_layout" //设置AppWidget的布局文件为widget_layout布局
android:minWidth="146dip"
android:minHeight="146dip"
android:updatePeriodMillis="3600000">
</appwidget-provider>
//res.xml.widget_small.xml
//<?xml version="1.0" encoding="utf-8"?>
//<appwidget-provider
//xmlns:android="http://schemas.android.com/apk/res/android"
//android:initialLayout="@layout/widget_layout"
//android:minWidth="72dip"
//android:minHeight="72dip"
//android:updatePeriodMillis="3600000">
//</appwidget-provider>
//res.layout.widget_layout_small.xml
//<?xml version="1.0" encoding="utf-8"?>
//<LinearLayout
//xmlns:android="http://schemas.android.com/apk/res/android"
//android:orientation="vertical"
//android:layout_width="wrap_content"
//android:layout_height="wrap_content"
//android:minHeight="72dip"
//android:minWidth="72dip"
//android:background="@drawable/bgblacksmall"
//android:id="@+id/SmallBase"
//>
//<LinearLayout
//android:layout_width="wrap_content"
//android:layout_height="wrap_content"
//android:orientation="vertical"
//android:layout_gravity="center"
//android:paddingTop="5dip"
//>
//<TextView
//android:layout_width="wrap_content"
//android:layout_height="wrap_content"
//android:id="@+id/Month"
//android:layout_gravity="center"
//android:textStyle="bold"
//android:textSize="12sp"
//android:gravity="center"
//android:textColor="#FFFFFF"
//></TextView>
//<TextView
//android:layout_width="wrap_content"
//android:layout_height="wrap_content"
//android:layout_gravity="center"
//android:id="@+id/Date"
//android:textStyle="bold"
//android:textSize="30sp"
//android:textColor="#FFFFFF"
//></TextView>
//</LinearLayout>
//</LinearLayout>
public class TodayDate extends AppWidgetProvider{//当我们添加AppWidget应用或自动定时更新时,AppWidgetManager会广播动作名字是"android.appwidget.action.APPWIDGET_UPDATE"
的Intent,当onReceive()方法没有被重载时,onUpdate方法会接收到这些广播的Intent。类似BroadcastReceiver类,我们可以
重载AppWidgetProvider的onReceive方法,并在其中指定想要接收的Intent
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
RemoteViews updateView = buildUpdate(context);
appWidgetManager.updateAppWidget(appWidgetIds, updateView);
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
private String[] months = {"一月", "二月", "三月", "四月","五月", "六月", "七月", "八月","九月", "十月", "十一月", "十二月"};
private String[] days = {"星期日", "星期一", "星期二", "星期三","星期四", "星期五", "星期六"};
private RemoteViews buildUpdate(Context context){
RemoteViews updateView = null;
Time time = new Time();
time.setToNow();
String month = months[time.month] + " " + time.year;
updateView = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
updateView.setTextViewText(R.id.Date, new Integer(time.monthDay).toString());
updateView.setTextViewText(R.id.Month, month);
updateView.setTextViewText(R.id.WeekDay, days[time.weekDay]);
Intent launchIntent = new Intent();
launchIntent.setComponent(new ComponentName("com.android.calendar", "com.android.calendar.LaunchActivity"));
launchIntent.setAction(Intent.ACTION_MAIN);
launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
PendingIntent intent = PendingIntent.getActivity(context, 0, launchIntent, 0);
updateView.setOnClickPendingIntent(R.id.Base, intent);
return updateView;
}
}
//public class TodayDateSmall extends AppWidgetProvider{
//public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
//RemoteViews updateView = buildUpdate(context);
//appWidgetManager.updateAppWidget(appWidgetIds, updateView);
//super.onUpdate(context, appWidgetManager, appWidgetIds);
//}
//private String[] months = {"一月", "二月", "三月", "四月","五月", "六月", "七月", "八月","九月", "十月", "十一月", "十二月"};
//private RemoteViews buildUpdate(Context context) {
//RemoteViews updateView = null;
//Time time = new Time();
//time.setToNow();
//String month = months[time.month];
//updateView = new RemoteViews(context.getPackageName(), R.layout.widget_layout_small);
//updateView.setTextViewText(R.id.Date, new Integer(time.monthDay).toString());
//updateView.setTextViewText(R.id.Month, month);
//Intent launchIntent = new Intent();
//launchIntent.setComponent(new ComponentName("com.android.calendar", "com.android.calendar.LaunchActivity"));
//launchIntent.setAction(Intent.ACTION_MAIN);
//launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
//launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
//PendingIntent intent = PendingIntent.getActivity(context, 0, launchIntent, 0);
//updateView.setOnClickPendingIntent(R.id.SmallBase, intent);
//return updateView;
//}
//}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>//因为使用了receiver及"adroid.appwidget.action.APPWIDGET_UPDATE"所以需要声明权限
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yarin.android.TodayDate"
android:versionCode="1"
android:versionName="1.0">
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<receiver
android:label="@string/app_name"
android:name=".TodayDate">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget">
</meta-data>
</receiver>
<receiver
android:label="@string/app_name_small"
android:name=".TodayDateSmall">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_small">
</meta-data>
</receiver>
</application>
<uses-sdk android:minSdkVersion="5" />
</manifest>
续:
1、上例中只是更新显示了一个界面,在Widget中同样可以通过setOnClickPendingIntent方法来监听一个事件的处理,下面代码中当我们点击了"widget_button"按钮时,会弹出Toast提示
public class widget extends AppWidgetProvider{
public void onReceive(Context context, Intent intent){
super.onReceive(context,intent);
if(intent.getAction().equals("com.android.myapp.widget.CLICK")){
Toast.makeText(context ,"It works!!", Toast.LENGTH_SHORT).show();
}
}
public void onUpdate(Context context,AppWidgetManager mgr, int[] appWidgetIds){
final int N = appWidgetIds.length;
for(int i=0; i<N; i++){
int [] appWidgetId = appWidgetIds;
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
Intent clickintent = new Intent("com.android.myapp.widget.CLICK");
PendingIntent pendingIntentClick = PendingIntent.getBroadcast(context, 0,clickintent,0);
views.setOnClickPendingIntent(R.id.widget_butt,PendingIntentClick);
mrg.updateAppWidget(appWidgetId,views);
}
}
}
2、在Widget中启动一个Activity,
RemoteViews rv = new RemoteViews(context.getPackageName(),R.layout.mywidget);
Intent intentActivity = new Intent(context, MusicPlayer.class);//此处启动一个音乐播放界面
PendingIntent pendingIntentActivity = PendingIntent.getActivity(context,0,intentActivity,0);
rv.setOnClickPendingIntent(R.id.button,pendingIntentActivity);
appWidgetManager.updateAppWidget(appWidgetId,rv);
context.startActivity(intentActivity);//当点击"button"按钮时启动自动Activity
3、Wdiget启动Service
RemoteViews rv = new RemoteViews(context.getPackageName(),R.layout.mywidget);
Intent intentService = new Intent("Service名字");
context.startService(intentService);
appWidgetManager.updateAppWidget(appWdigetgetId,rv);
分享到:
相关推荐
以上就是Android日历示例中的主要技术点,通过理解和实践这些知识点,开发者能够构建出功能完善的日历应用,满足用户对时间管理的需求。在实际开发中,还需要根据具体需求进行定制化调整,例如添加多语言支持、事件...
本项目是针对Android Widget小组件开发的一个毕业设计示例,适合学习和理解Android应用的源码实现。在这个压缩包中,包含了一个完整的Android应用源码,可以作为深入理解Android Widget开发的参考资料。 1. **...
【Android 最全日历 Demo】是一个基于 Eclipse 开发的 Android 工程示例,它提供了全面的日历功能展示,旨在帮助开发者理解和实现 Android 平台上日历应用的各种功能。这个 Demo 涵盖了日历视图的显示、事件添加、...
Android系统提供了`java.util.Calendar`类来处理日期和时间,而`android.widget.CalendarView`是内置的日历控件,但它的功能相对有限。为了创建更复杂的日历交互,我们通常需要自定义控件。 1. **自定义控件设计**...
Android App Widget是Android系统提供的一种轻量级的UI组件,允许开发者在用户的主屏幕上放置一些交互式的快捷方式或小部件,提供类似于桌面小工具的功能。这些小部件可以显示实时信息,如天气、日历事件、音乐播放...
App Widget是Android平台上的一种轻量级UI组件,它可以被添加到用户的主屏幕,提供诸如天气预报、日历事件、音乐控制等实用功能。它们通过App Widget Provider组件与应用程序交互,并且可以通过BroadcastReceiver...
在Android系统中,`Widget`是Home屏幕上的小部件,可以实时显示信息,如天气、时钟、日历事件等。开发者可以通过创建`AppWidgetProvider`类的子类,并在XML布局文件中定义Widget的外观和行为,来实现自定义Widget。 ...
这份"Android Widget相关实例源代码"来自eoemobile,它包含了多个关于Android Widget设计和实现的示例。由于压缩包大小超过1MB,因此包含了相当丰富的源码,这对于深入理解和学习Android Widget的使用非常有帮助。 ...
【eoeAndroid特刊】第五期专注于Android小部件(Widget)的开发,这是一期集教程、示例、文档和学习资源于一体的综合资料。在Android平台上,Widget是应用程序与用户交互的一种方式,允许用户在主屏幕上看到应用的...
日历桌面组件是这种功能的一个典型示例,它使用户无需打开完整的日历应用就能查看和管理日程。下面将详细探讨安卓日历桌面组件的实现、功能和相关知识点。 1. **桌面组件(Widget)的概念** 安卓桌面组件是Android...
本篇文章将详细介绍如何在Android中实现一个自定义的日历控件,并提供相关的代码示例。 首先,我们需要创建布局XML文件来设计用户界面。在提供的代码片段中,可以看到一个简单的布局结构,包括一个`ScrollView`,...
在Android平台上,Calendar API是开发者用来管理用户日历事件的关键工具。这个API允许应用程序与系统日历进行交互,包括添加新的事件、更新现有事件以及删除不再需要的事件。以下是对这些操作的详细解释: **一、...
在这个名为"AppWidget-master"的压缩包中,我们很可能是得到了一个示例项目,用于演示如何创建一个能够显示列表并支持刷新功能的Android App Widget。 首先,我们需要理解App Widget的基本架构。App Widget由XML...
### Android Widget 深度解析 #### 一、引言 随着 Android 1.5 SDK 的发布,一系列新功能和 API 更新为开发者带来了前所未有的机遇。这其中,最令人瞩目的特性之一便是 AppWidget 框架。AppWidget 框架允许开发者...
在实际开发中,可以结合开源库如`androidx.core.widget.CalendarView`或第三方库如`android-week-view`,这些库已经实现了基本的日历功能,可以作为自定义日历的基础,减少重复工作。 总之,自定义Android日历是一...
要深入了解Android日历源码,我们需要分析其工作原理、涉及到的关键类以及如何进行自定义和集成。以下是一些关于Android日历源码的核心知识点: 1. **Android日历API**: Android提供了`CalendarContract`类,它是...
此外,对于日历的展示,我们可以利用开源库,如`androidx.core.widget.CalendarView`或第三方库如` Caldroid`,它们提供了丰富的日历操作和自定义功能。对于时间选择,Android系统自带的`TimePicker`可以满足基本...
本资源“Android应用源码之Calendar.zip”提供了一个关于Android日历应用的源代码示例,对于开发者来说,这是一个很好的学习和参考资源。下面我们将深入探讨Android日历API的使用以及源码中可能涉及的关键技术点。 ...
这份"安卓Android源码——系统日历日程操作.zip"压缩包显然包含了关于如何与Android系统的日历API交互的示例代码。接下来,我们将深入探讨Android系统日历操作的相关知识点。 1. **Android日历权限** 在Android ...
在Android的`android.widget`包中,`DatePicker`类提供了创建和配置日期选择器的功能。通过设置`DatePicker`的年、月、日属性,我们可以定制其初始显示的日期。此外,还可以监听日期变化事件,当用户选择新日期时,...