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文件。比如我的这个应用的代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
  4.  
  5. android:configure="com.stickynote.EditActivity"
  6.  
  7. android:initialLayout="@layout/widget_note"
  8.  
  9. android:minHeight="40dp"
  10.  
  11. android:minWidth="250dp"
  12.  
  13. android:previewImage="@drawable/icon_app"
  14.  
  15. 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标签来配置:

  1. <receiver android:name="com.stickynote.widget.NoteWidgetProvider" >
  2.  
  3. <!-- 固定写法 -->
  4.  
  5. <intent-filter>
  6.  
  7. <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  8.  
  9. </intent-filter>
  10.  
  11. <!-- name也是固定的,resource就是那个AppWidget的配置文件 -->
  12.  
  13. <meta-data
  14.  
  15. android:name="android.appwidget.provider"
  16.  
  17. android:resource="@xml/widget_note" />
  18.  
  19. </receiver>

添加AppWidget进弹出编辑Activity:

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

android:configure="com.stickynote.EditActivity"

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

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

  1. <activity
  2.  
  3. android:name="com.stickynote.EditActivity"
  4.  
  5. android:theme="@android:style/Theme.Holo.NoActionBar" >
  6.  
  7. <intent-filter>
  8.  
  9. <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
  10.  
  11. </intent-filter>
  12.  
  13. </activity>

更新(设置)AppWidget:

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

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

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

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

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

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

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

  1. Intent resultValue = new Intent();
  2.  
  3. resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, note.appWidgetId);
  4.  
  5. setResult(RESULT_OK, resultValue);
  6.  
  7. 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. arctan

    ArcTanWhen the ArcTan functional configuration is selected, the input vector (X_IN,Y_IN) is rotated( ...

  2. postgres(pgAdmin) 客户端保存密码

    pgAdmin 大象客户端保存密码后连接服务器,删除掉当前连接,建立一个新的连接不用输入密码也能连接上,其实是客户端保存了密码,让人误以为是空密码可登录.可以通过右键连接,选择重载服务配置,再次连接就 ...

  3. 什么是Maven?

    绝大部分Maven用户都会说:Maven是一个“构建工具”——一个用来把源代码构建成可发布的构建的工具. 构建工程师和项目经理会说Maven是一个更复杂的东西:一个项目管理工具. Maven除了提供构 ...

  4. BZOJ4377[POI2015]Kurs szybkiego czytania——数学思维题

    题目描述 给定n,a,b,p,其中n,a互质.定义一个长度为n的01串c[0..n-1],其中c[i]==0当且仅当(ai+b) mod n < p.给定一个长为m的小01串,求出小串在大串中出 ...

  5. SharePoint 2013 APP 开发示例 (一)List 读写

    在这个示例里,我们将创建一个页面测试 SharePoint APP的权限.这个页面有二个按钮,一个从documents里读数据,一个往documents里写数据: 1. 打开Visual Studio ...

  6. 老铁,这年头得玩玩这个:Git基本操作【github】

    GitHub创建项目 本地创建项目 1.初始化配置,设置仓库人员的用户名和邮箱地址,这一步必不可少 git config --global user.name "uncleyong" ...

  7. Java -- JDBC 学习--数据库连接池

    JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开 ...

  8. ASP.NET MVC 网站优化之压缩技术

    压缩 html 可以去除代码中无用的空格等,这样可提高网站的加载速度并节省带宽. 实现 ActionFilter 来完成 html 的压缩 public class WhitespaceFilterA ...

  9. JasperReport 中踩过的坑

      Mac Book Pro 10.13.6Jaspersoft Studio community version 6.6.9JDK 8 安装 Jaspersoft Studio Jasper Rep ...

  10. java常用的运算符

    Java 语言中常用的运算符可分为如下几种: Ø 算术运算符 Ø 赋值运算符 Ø 比较运算符 Ø 逻辑运算符 Ø 条件运算符