基于Android AppWidgetProvider的使用介绍
appwidgetprovider 用来在home页面显示插件
实现步骤:
1、为appwidget提供一个元布局文件appwigdetprovider_provider.xml,用来显示widget的界面。
2、创建一个类继承自appwidgetprovider,并覆写里面的相关的方法。
3、为widgetprovider创建一个引用的布局文件,或者直接用main.xml。
4、在程序中注册manifest.xml。
代码如下:
1、在res/xml/文件夹下创建appwigdetprovider_provider.xml文件
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initiallayout="@layout/main" <!-- android:initiallayout 设置引用的布局文件 -->
android:minheight="50dip"
android:minwidth="50dip"
android:updateperiodmillis="5000" > <!-- 设置更新时间,单位为毫秒 -->
</appwidget-provider>
2、修改mainactivity继承自appwidgetprovider并覆写里面的一些方法
@override private class lytimetask extends timertask { @override public lytimetask(context context, appwidgetmanager appwidgetmanger) {
public class mainactivity extends appwidgetprovider {
public void onupdate(context context, appwidgetmanager appwidgetmanager, int[] appwidgetids) {
super.onupdate(context, appwidgetmanager, appwidgetids);
timer timer = new timer();
timer.scheduleatfixedrate(new lytimetask(context, appwidgetmanager), 1, 50000);
}
remoteviews remoteviews;
appwidgetmanager appwidgetmanager;
componentname widget;
public void run() {
date date = new date();
calendar calendar = new gregoriancalendar(2013, 07, 24);
long days = (calendar.gettimeinmillis() - date.gettime()) / 1000 / 86400;
remoteviews.settextviewtext(r.id.worldcup, "距离宝贝生日" + days + "天");
appwidgetmanager.updateappwidget(widget, remoteviews);
}
super();
this.appwidgetmanager = appwidgetmanger;
remoteviews = new remoteviews(context.getpackagename(), r.layout.activity_main);
widget = new componentname(context, mainactivity.class);
}
};
}
3、为widget创建一个显示用的布局文件:main.xml
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/worldcup"
android:orientation="vertical" >
<textview
android:id="@+id/babybirthday"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/message"
android:textsize="12px"
android:textcolor="#ff0000" />
</linearlayout>
4、修改程序自动生成的清单文件。在androidmanifest.xml中,声明上述的appwidgetprovider的子类是一个receiver,并且:
(1)、该receiver的intent-filter的action必须包含“android.appwidget.action.appwidget_update”;
(2)、该receiver的meta-data为“android.appwidget.provider”,并用一个xml文件来描述布局属性。
<application
android:allowbackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/apptheme" >
<receiver
android:name=".mainactivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.appwidget.action.appwidget_update" /><!--广播接收过滤器-->
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/appwigdetprovider_provider" /><!--appwidgetprovider引用的provider文件-->
</receiver>
</application>
运行程序:进入widgets页面,可将widget添加到home页
在appwidgetprovider类中,还有其它相关的方法
复制代码 代码如下:
public class widgetprovider extends appwidgetprovider {// 每接收一次广播消息就调用一次,使用频繁
public void onreceive(context context, intent intent) {
super.onreceive(context, intent);
}// 每次更新都调用一次该方法,使用频繁
public void onupdate(context context, appwidgetmanager appwidgetmanager, int[] appwidgetids) {
super.onupdate(context, appwidgetmanager, appwidgetids);
}
// 每删除一个就调用一次
public void ondeleted(context context, int[] appwidgetids) {
super.ondeleted(context, appwidgetids);
}
// 当该widget第一次添加到桌面是调用该方法,可添加多次但只第一次调用
public void onenabled(context context) {
super.onenabled(context);
}
// 当最后一个该widget删除是调用该方法,注意是最后一个
public void ondisabled(context context) {
super.ondisabled(context);
}
}