Appwidget就是手机应用中常常放在桌面(即home)上的一些应用程序,比如说闹钟等。这种应用程序的特点是它上面显示的内容能够根据系统内部的数据进行更新,不需要我们进入到程序的内部去,比如说闹钟指针的摆动等。
1、widget类的定义
首先,在res目录下新建一个名为xml的文件夹,在该文件夹下新建一个xml文件,例如example_appwidget_info.xml,该xml文件的根标签为appwidget-provider. 该xml文件主要是对所建立的appwidget的一个属性设置,其中比较常见的属性有appwidget更新的时间,其初始的布局文件等等。
res/xml/example_appwidget_info下内容如:
<appwidget-providerxmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="40dp" <!-- 最小宽度 -->android:minHeight="40dp" <!-- 最小高度 -->
android:updatePeriodMillis="86400000" <!-- 更新间隔时间,最短也得设置半个小时 -->
android:previewImage="@drawable/preview" <!-- 预览的样子图片,可以不需要,默认为应用logo -->
android:initialLayout="@layout/example_appwidget" <!-- 布局文件 -->
android:configure="com.example.android.ExampleAppWidgetConfigure" <!-- 配置页面是一个Activity,有些应用在添加widget后需要跳转页面进行配置 -->
android:resizeMode="horizontal|vertical" <!-- 缩放模式,水平方向竖直方向都支持缩放 -->
android:widgetCategory="home_screen|keyguard"> <!-- 4.2+以上支持锁屏页展示widget, home_screen普通类型-->
<!-- 4.2+系统的锁屏页添加widget: android:widgetCategory="keyguard|home_screen"-->
</appwidget-provider>
系统自带的更新设置最短也得半个小时才会更新一次,而如果我们需要更短时间更新时,可以把android:updatePeriodMillis="0"置为0,然后自定义一个Service在onCreate方法中定义一个定时器Timer去实现更新;而在自定义的widget的AppWidgetProvider
类型java类中的onEnabled和onUpdate方法中开启Service,在onDisabled方法中结束Service。
其次, 定义一个类,例如ExampleAppWidgetProvider.java继承AppWidgetProvider,同时要在清单文件
AndroidManifest.xml中进行配置。配置如下所示
<receiver android:name="ExampleAppWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
</receiver>
android:resource
- 详述AppWidgetProviderInfo
资源的位置,在res目录下新建一个文件xml,在xml文件夹下自定义一个widget属性集的xml文件,
该类能实现所建立的widget的全部功能,其中比较重要的功能是接收广播消息来更新widget的内容。该类能复写父类的所有方法,例如onReceive方法,但widget还具备自身的方法,例如onEnabled,onUpdate,onDeleted,onDisabled等方法。
其中onDeleted()方法是当appwidget删除时被执行,
onDisabled()是当最后一个appwidget被删除时执行,
onEnabled()为当第一个appwidget被建立时执行,
onReceive()为当接收到了相应的广播信息后被执行(在每次添加或者删除widget时都会执行,且在其它方法执行的前面该方法也会被执行,其实本质上该方法不是AppWidgetProvider这个类的生命周期函数),
onUpdate()为到达了appwidget的更新时间或者一个appwidget被建立时执行。
appwidget中本身里面就有程序(有activity),但是在桌面上添加一个appwidget后也相当于一个程序,这2个程序本身不是在同一个进程当中,而是在各自单独的进程中。
widget本质上是一个BroadcastReceiver,所以Receiver有的方法widget都有例如OnReceiver方,widget还有自身具备的方法:
//第一次添加widget时调用此方法@Override
public void onEnabled(Context context) {
// TODO Auto-generated method stub
super.onEnabled(context);
}
//widget被更新时调用此方法
//更新的情况有两种:
//1、桌面新增widget,例如:桌面原来没有widget,现在增加一个
//2、widget间隔一定时间更新,xml文件中配置的
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
//widget被移除时调用此方法,例如桌面原来有两个widget,现在删除一个
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onDeleted(context, appWidgetIds);
}
//最后一个widget被移除的时候调用此方法
@Override
public void onDisabled(Context context) {
// TODO Auto-generated method stub
super.onDisabled(context);
}
2、widget生命周期及相关实验
例一:
实验说明:
这个例子实现一个最简单的appwidget,即我们的appwidget只有一个按钮,按钮上面写着“我的常用密码字样”,没有其它功能,呵呵。然后我们在appwidget的java类的程序中,每个生命周期函数都在后台打印出一句话,内容是与该生命周期函数名相对应的。
实验结果:
往桌面添加自己创建的一个appwidget效果如下所示:
该实验室先后在桌面上放2个appwidget,然后依次删除2个appwidget,则程序后台的输出结果如下所示:
实验主要代码及注释(附录有实验工程code下载链接):
MainActivity.java不用更改任何代码,采用默认的就行了,这里就不贴出来了。
my_passward_provider.java(Appwidget功能实现):
package com.example.appwidget1; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; public class my_password_provider extends AppWidgetProvider { @Override public void onDeleted(Context context, int[] appWidgetIds) { // TODO Auto-generated method stub System.out.println("appwidget--->onDeleted()"); super.onDeleted(context, appWidgetIds); } @Override public void onDisab