Android平台的一大特色就是支持桌面插件——AppWidget。

且不说,AppWidget是否会影响系统的流畅性,AppWidget确实是满足了用户个性化和快捷操作的需要。

常见的AppWidget有四种基本形态:

信息型:

想当年HTC的翻页时钟就大红大紫过好长一阵子。

控制型:

集合型:

混合型:

其实大部分的AppWidget都是属于这个类型的,即能够显示信息,又提供控制功能。

总结一下:

AppWidget提供了一个快速的途径去获得我们想要的信息

提供一个快捷的手段去控制应用

一些设计良好的AppWidget确实可以为手机增色不少

本人有一定的“应用洁癖”,一般只用那些没有太多乱七八糟功能的应用。一直在找一款简单实用的便签应用。对于我个人而言,语音记录、云同步之类的功能都是比较鸡肋的。我之前用过两款:OPPO的NearMe笔记和小米便签。都还可以,至少,没有太多没用的功能。

其中小米便签还是开源的:https://github.com/MiCode/Notes(开源什么的最有爱了~~~)可以学到不少的东西。

当程序员有一个好处,就是当用其他应用都不爽的时候,可以自己开发一个~~~

我自己的需求如下:

尽可能的轻量:不常用的功能一律不要。

界面要好看一点:毕竟,程序员也是要装X的~~~

最终的效果是这样的:

点击可以进入编辑:

点击左上角可以换肤,点击那个“T”可以进行字体调节:

调节过程还可以实时预览。

好了,下面不废话了,进入开发时间!!!

官方文档地址:http://developer.android.com/intl/zh-cn/guide/topics/appwidgets/index.html

一个AppWidget需要用到下面的东东:

AppWidgetProviderInfo:这货是描述整个AppWidget的元信息的。比如更新的频率,初始大小等。它被放在/res/xml/目录下,是一个xml文件。比如我的这个应用的代码如下:

<?xml version="1.0" encoding="utf-8"?>

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"

    android:configure="com.stickynote.EditActivity"

    android:initialLayout="@layout/widget_note"

    android:minHeight="40dp"

    android:minWidth="250dp"

    android:previewImage="@drawable/icon_app"

    android:updatePeriodMillis="0" />

它的一些属性解释如下:

configure:当一个AppWidget第一次生成时可以启动一个Activity来配置它,该属性是可选的。

initialLayout:AppWidget的布局文件。

minHeight和minWidth:这两个参数比较复杂,最好参看官方文档,因为不同版本下还是不同的,比如从4.1开始还支持AppWidget大小的改变这些。

previewImage:就是AppWidget的预览图,不设置的话就是App的图标。

UpdatePeriodMillis:更新频率,这个也需要特别说明一下,在新版本的系统中(貌似是4.0)开始,更新频率是不能设置过小的,因为要考虑到耗电问题。所以,如果需要做到“实时”更新的话,就需要通过其他手段了。

其他属性看文档吧~~~

AppWidgetProvider:这家伙封装了BroadcastReceiver,并重写了onReceive方法。所以一般情况下,我们不需要再去重写onReceive方法了。而是按需要去重写以下的几个方法:

onEnabled:当这个App的第一个AppWidget创建时调用,也就是说添加第十个AppWidget时,是不会调用的。

onUpdate:当AppWidget更新时调用,比如到了更新的时间。注意,比如当手机重新启动时,这个方法也会被调用的。

onDeleted:当AppWidget被删除时调用。

onDisabled:当最后一个AppWidget被删除时调用。与onEnabled对应。

View layout:AppWidget的布局文件,与Activity的布局文件类似。但不是所有的控件、容器都可以用于AppWidget的。具体支持的控件请看文档:http://developer.android.com/intl/zh-cn/guide/topics/appwidgets/index.html#CreatingLayout

其实上面的东西都是官方文档的“中文简化版”,阅读英文文档还是相当重要的。

项目的文件结构:

其实本人不是怎么喜欢贴代码,因为我自己的看博客的习惯就不喜欢看代码(算法博文除外),所以我一般只写原理,代码的话自己下载运行一下应该我觉得更好~~~

AppWidgetProvider的配置:

AppWidgetProvider的本质还是一个广播接收器,所以在AndroidManifest.xml中还是使用一个receiver标签来配置:

<receiver android:name="com.stickynote.widget.NoteWidgetProvider" >

         <!-- 固定写法 -->

         <intent-filter>

                   <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

         </intent-filter>

         <!-- name也是固定的,resource就是那个AppWidget的配置文件 -->

         <meta-data

                   android:name="android.appwidget.provider"

                   android:resource="@xml/widget_note" />

</receiver>

添加AppWidget进弹出编辑Activity:

这个过程分为二步,第一:在AppWidgetProviderInfo中添加

android:configure="com.stickynote.EditActivity"

注意,这个Activity一定要带包名的!

第二:在Activity的配置中,一定要添加一个intent-filter:

<activity

         android:name="com.stickynote.EditActivity"

         android:theme="@android:style/Theme.Holo.NoActionBar" >

         <intent-filter>

                   <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />

         </intent-filter>

</activity>

更新(设置)AppWidget:

更新AppWidget是通过AppWidgetManager的updateAppWidget(int appWidgetId, RemoteViews views)这个方法来实现的。

其中,RemoteViews就是AppWidget的视图,我们要对其中的“子控件”进行设置,只能通过它提供的setXxx方法实现,有些方法是可以直接使用的,比如其中的TextView:

如果想对其中的布局设置背景,这时就只有通过比如setInt这个方法来“曲线救国”了:

views.setInt(R.id.rl_widget_note, "setBackgroundResource", bgRes); // 设置背景

同理,设置字体大小可以通过如下方法实现:

views.setFloat(R.id.tv_widget_note_content, "setTextSize", note.textSize); // 设置字体大小

注意:在AppWidget启动时调用的Activity更新之后,一定要setResult!否则没有结果。

Intent resultValue = new Intent();

resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, note.appWidgetId);

setResult(RESULT_OK, resultValue);

finish();

AppWidget的东西差不多了,剩下的东西就是数据库啊,还有一些界面之类的东西,应该说,东西不大,但该有的都有了,而且个人觉得把要把整个应用的代码用合理优雅的方法来实现,其实比单纯的学会调用API理重要。

本人菜鸟一个,欢迎各位的批评指正。

如果有疑问,请直接留言或通过475500230@qq.com这个邮箱与我交流。

图片资源大部分来自小米便签,在此表示感谢。

个人练习作品,欢迎转载!但请注意原作者与出处。

源码下载:http://pan.baidu.com/share/link?shareid=1065236481&uk=1812042723

安装包下载:http://pan.baidu.com/share/link?shareid=1152653812&uk=1812042723

(原创 开源)AppWidge的使用—桌面便利贴的更多相关文章

  1. 【原创开源】网络版二代双通道示波器开源发布,支持电脑,手机和Pad等各种OS平台访问

    前言感谢大家的支持,提前奉上今年的国庆福利. 一代示波器发布于3年前,去年年底的时候发布了二代示波器,软件性能已经比较强劲,但依然有值得升级改进的地方,经过今年这半年多努力,在二代示波器的基础上再推出 ...

  2. 原创开源项目HierarchyViewer for iOS 2.1 Beta新功能介绍

    回顾 HierarchyViewer for iOS是我们发布的一个开源项目,采用GPL v3.0协议. HierarchyViewer for iOS可以帮助iOS应用的开发和测试人员,在没有源代码 ...

  3. 【安富莱原创开源应用第3期】花式玩转网络摄像头之VNC远程桌面版本,稳定运行2年不死机

    说明: 1.前段时间开源了一个网络摄像头的TCP版本 https://www.cnblogs.com/armfly/p/9173167.html,这次再来一个远程VNC的版本.使用更方便,无需大家制作 ...

  4. [原创][开源] SunnyUI.Net 开发日志:ListBox 增加跟随鼠标滑过高亮

    QQ群里,寸目说,ListBox鼠标移动时,当前行需要焦点,我想了想,不难实现啊 不就是在鼠标移动时重绘Item嘛,何况选中的Item已经改了颜色了. 见UIListBox代码: protected ...

  5. [原创][开源] SunnyUI.Net 主题

    SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...

  6. [原创][开源] SunnyUI.Net 系列文章目录

    SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...

  7. [原创][开源]SunnyUI.Net, C# .Net WinForm开源控件库、工具类库、扩展类库、多页面开发框架

    SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...

  8. [原创][开源] SunnyUI.Net 更新日志

    SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...

  9. [原创][开源] SunnyUI.Net 安装

    SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...

随机推荐

  1. Bootstrap缩略图

    前面的话 缩略图在网站中最常用的地方就是产品列表页面,一行显示几张图片,有的在图片底部(左侧或右侧)带有标题.描述等信息.Bootstrap框架将这一部独立成一个模块组件,本文将详细介绍Bootstr ...

  2. BZOJ1500[NOI2005]维修数列——非旋转treap

    题目描述 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格 输入 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初 ...

  3. Bash Game 巴什博弈

    巴什博弈(Bash Game,同余理论):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先 ...

  4. Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds

    Servers -->双击你的启动服务--> 对话框左下角切换选项卡为 Overview -->中东找到Timeouts 把Start(in seconds)改为 100  ,然后按 ...

  5. 码云平台IDEA系列的插件使用

    一.IDEA插件安装 file -- setting --  Plugins -- 搜索gitee --  Search in repositories 安装后重启编译器 二.登录并拉取项目 file ...

  6. 架构师成长之路7.1 CDN理论

    点击返回架构师成长之路 架构师成长之路7.1 CDN理论 CDN,Content Distribute Network,内容分发网络:CDN解决的是如何将数据快速可靠从源站传递到用户的问题.用户获取数 ...

  7. NOIP2014题解

    NOIP2014题解 Day1 生活大爆炸版石头剪刀布 rps 简单模拟题,注意细节 #include<iostream> #include<cstdio> using nam ...

  8. [NOI2012] 骑行川藏 | 求导 二分

    一个能看的题解!预备知识只有高中数学的[导数].不用什么偏导数/拉格朗日乘子法之类的我看不懂的东西( •̀∀•́ )! 如果你不知道什么是导数,可以找本高中数学选修2-2来看一下!看第一章第1.2节就 ...

  9. 对STM32库函数中 assert 函数的认知

    > 本段代码取自 <stm32f4xx_gpio.c> > 可以看出进入函数第一件事就是做 assert 输入参数检查,参数合法后,根据参数做相应操作 /** * @brief ...

  10. SpringBoot集成RocketMQ

    实战,用案例来说话 前面已经说了JMS和RocketMQ一些概念和安装,下面使用SpringBoot来亲身操作一下. 生产者的操作 SpringBoot项目创建完成,引入依赖是第一步: <dep ...