桌面小部件一般用于图库、音乐播放器、天气预报、日历、时钟等。尤其系统应用,其实可以长按手机桌面,底部会出现“桌面小工具”的图标,点击即可查看当前设备上的所有桌面小部件。那如何在自己的应用上实现小部件的功能呢?以下就从一个简单的demo介绍:
一、appwidgetprovider的使用:
public class appwidgetprovider extends broadcastReceiver { ...... }
查看源码可知,appwidgetprovider本身是一个广播接收者。
实现步骤:一些注意事项在代码中都有注释。
1、自定义一个Taskappwidgetprovider,继承自appwidgetprovider ;
1 public class Taskappwidgetprovider extends appwidgetprovider { 2 3 // appwidgetprovider:继承了broadcastReceiver 4 5 private final String TAG="Taskappwidgetprovider"; 6 private final String UPDATE_WIDGET_ACTION = "android.appwidget.action.APPWIDGET_UPDATE"; 7 8 @Override 9 public void onReceive(Context context, Intent intent) { 10 // Todo Auto-generated method stub 11 super.onReceive(context, intent); 12 Log.i(TAG, "onReceive() " + intent.getAction()); 13 } 14 15 16 @Override 17 public void onUpdate(Context context, AppWidgetManager appWidgetManager, 18 int[] appWidgetIds) { 19 // Todo Auto-generated method stub 20 super.onUpdate(context, appWidgetManager, appWidgetIds); 21 Log.i(TAG, "onUpdate() appWidgetIds.length: " + (appWidgetIds!=null?appWidgetIds.length:0)); 22 23 initWidget(context, appWidgetIds); 24 25 } 26 27 //初始化界面 28 private void initWidget(Context context, int[] appWidgetIds){ 29 RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.task_appwidget); 30 views.setTextViewText(R.id.change_text, "onUpdate中修改文本-"); 31 initListener(context, views); 32 33 update(context, appWidgetIds, views); //通知系统更新widget---否则,对界面的修改及设置的监听事件等均无效 34 } 35 //设置控件的点击事件 36 private void initListener(Context context,RemoteViews views){ 37 Intent intent; 38 PendingIntent pendingIntent; 39 40 intent = new Intent(context, MainActivity.class); 41 pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 42 views.setonClickPendingIntent(R.id.main_btn, pendingIntent); 43 44 intent = new Intent(context, SearchActivity.class); 45 pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 46 views.setonClickPendingIntent(R.id.search_btn, pendingIntent); 47 } 48 49 /** 50 * 更新Widget 51 * @param context 52 * @param appWidgetIds 当前桌面该应用部件的实例个数,简单理解:即在桌面添加了几个该部件 53 * @param views 54 */ 55 private void update(Context context,int[] appWidgetIds, RemoteViews views){ 56 AppWidgetManager widgetMng = AppWidgetManager.getInstance(context); 57 if(appWidgetIds != null){ 58 widgetMng.updateAppWidget(appWidgetIds, views); 59 }else{ 60 widgetMng.updateAppWidget(new ComponentName(context, getClass()), views); 61 } 62 } 63 64 }
2、在AndroidManifest.xml中注册,不同的是,此处要指定在桌面小部件列表中显示的布局;
<receiver android:name="com.test.appwidget.Taskappwidgetprovider" android:label="@string/widget_title" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <!-- 在添加小部件时,android系统发出的广播 与下面的Meta-data都是必须的,否则在小部件列表中不会显示 --> </intent-filter> <Meta-data android:name="android.appwidget.provider" android:resource="@xml/task_widget_info" /> <!-- name:必需是此名称 resource:在窗口小部件列表中显示的布局 --> </receiver>
3、定义xml文件<appwidget-provider/>,里面是关于小部件的配置信息及具体显示布局;
//task_widget_info.xml <?xml version="1.0" encoding="UTF-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/task_appwidget" android:minHeight="150dip" android:minWidth="200dip" android:previewImage="@drawable/local_search" android:updatePeriodMillis="86400" > </appwidget-provider>
android:initialLayout是具体显示布局:task_appwidget.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_horizontal" android:background="#afffffff" android:padding="10dp" > <LinearLayout android:id="@+id/linear_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试窗口小部件" android:textColor="#000" android:textSize="20sp" /> <TextView android:id="@+id/change_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="change-text" android:textColor="#000" android:textSize="18sp" /> </LinearLayout> <Button android:layout_below="@id/linear_layout" android:id="@+id/main_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="click-main" /> <Button android:id="@+id/search_btn" android:layout_toRightOf="@id/main_btn" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@id/main_btn" android:text="click-search" /> </RelativeLayout>View Code
上述完成后,运行程序;在手机桌面长按,观察在桌面小工具中是否存在,若存在则说明成功!
二、参考:
原文参考:http://www.cnblogs.com/TerryBlog/archive/2010/07/29/1788319.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。