如有错漏请不吝拍砖指正,转载请注明出处,很感谢


桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行,

Sticky Note的介绍能够參见 http://www.tompda.com/c/article/11778/

而实际上使用android平台对widget开发的支持,桌面便签类软件是很易于开发的。

本文通过逐步实现一个简单的桌面便签软件,和大家分享进行widget开发的过程和方法。


1.MyNote的终于实现效果

为了提起大家阅读本文的兴趣,先介绍一下终于实现的效果。

首先能够通过桌面添加我们的MyNote小部件,例如以下图所看到的:

图中的“我的便签”就是我们之后将要开发的便签程序。

点击后启动加入日志界面,例如以下图所看到的:

输入便签内容后,能够点击以下所列的四种图标之中的一个作为便签图标。

比方点击第一个后,桌面上就会加入一个便签:

点击桌面上的便签,能够再次对便签内容进行改动,并更换图标。

桌面上能够同一时候存在多个便签,并能够分别进行改动。

例如以下图所看到的,我们将刚才创建的便签的图标改动一下,并新增了一个便签:

每一个便签的内容都是分别独立保存的,能够随时点击桌面图标改动。


2.开发方式

开发的目的和追求的效果已经十分清楚了,首先我们确定一下开发方式。

在本文中,将採取一种渐进式的开发,也就是说不会一口气从头做到尾。

而是分为好几个阶段。每一个阶段都完毕一定的目标,然后下个阶段添加很多其它的功能,

每一个阶段都离终于目标更进一步,OK,你能够说这是一次敏捷开发 :)

第一个阶段,首先我们会搭建一个widget原型程序,

它是全然能够执行的,能够创建桌面widget。

第二个阶段,我们改进 widget 配置Activity 部分的实现

使其具备创建便签的功能

第三个阶段,我们改进 widget 点击响应部分的实现,

使其具备改动便签的功能


3.搭建widget原型程序

本节我们会做一个最简单的widget程序原型,可是它是能够执行的。

一般来说 widget 程序由下面部分组成:

a. AppWidgetProvider 的实现

b. widget外观布局定义文件

c. 新增widget时的配置Activity的实现(可选)

d. widget 參数配置文件

下面分别解说

a. AppWidgetProvider 的实现

首先我们新建一个androidproject起名为MyNote,然后改动 MyNote.java 的代码,

使MyNote继承自 AppWidgetProvider ,并重写 onUpdate 和 onDeleted 方法。

当中onUpdate 会在widget创建及被更新时调用, onDeleted 会在widget被删除时调用。

眼下我们不须要在这里实现不论什么功能,仅仅是简单的记录日志以便我们观察其执行,编写好的代码例如以下:

package com.silenceburn;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.util.Log;

public class MyNote extends AppWidgetProvider {
/** Called when the activity is first created. */

final String mPerfName = "com.silenceburn.MyColorNoteConf";

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
Log.i("myLog", "this is [" + appWidgetId + "] onUpdate!");

}
}

@Override
public void onDeleted(Context context, int[] appWidgetIds) {
// TODO Auto-generated method stub
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
Log.i("myLog", "this is [" + appWidgetId + "] onDelete!");
}
}

}

b. widget外观布局定义文件

我们须要为widget编写一个外观布局文件,在本演示样例中,布局很easy,仅仅须要一个imageView就可以

编写好的 my_note_widget.xml 文件例如以下:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/my_widget_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/sketchy_paper_008"
android:clickable="true"/>

这里用到了一个外部图片 sketchy_paper_008.png,来源于网络,感谢图片原作者。

能够到 http://dryicons.com/free-icons/preview/sketchy-paper-icons/ 打包下载。

(  注意下载下来的包中的文件名称可能和我写的程序中的命名有差异,请注意自行调整。)

c. 新增widget时的配置Activity的实现(可选)

android平台为widget提供一个配置界面的功能,我们能够自己定义一个Activity,

在widget參数配置文件里配置好相关參数后,此Activity会在用户新增widget时自己主动调用。

一般来说,这个配置界面的作用是用户新建widget时,让用户配置widget的一些属性,比方颜色、大小等等。

可是在我们的这个演示样例程序中,我们用它来当做创建便签的地方!

只是本节仅仅是先实现一个原型程序,所以临时不做处理,我们仅仅是新建一个Activity就可以。

新建名为MyNoteConf的Activity,重写onCreate方法,在OnCreate方法中,

因为这个Activity是由系统在新增widget时自己主动调用的,

所以我们能够用getIntent获取到传入的widgetId。能够推断其是否是一个有效的widgetId,

最后我们必须返回一个RESULT_OK的Intent,并结束当前Activity,系统才会觉得配置成功,在桌面上放置这个widget。

假设返回RESULT_CANCELED,系统会觉得配置失败,终止widget的创建过程。

编写好的MyNoteConf的代码例如以下:

package com.silenceburn;

import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MyNoteConf extends Activity {

int mAppWidgetId;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

Log.i("myLog"," on WidgetConf ... ");

setResult(RESULT_CANCELED);

// Find the widget id from the intent.
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}

// If they gave us an intent without the widget id, just bail.
if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish();
}

// return OK
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
mAppWidgetId);

setResult(RESULT_OK, resultValue);
finish();
}
}

d. widget 參数配置文件

最后我们须要编写一个widget參数配置文件,将布局文件、配置Activity关联起来。

我们在res下新建文件夹xml,在xml文件夹下新增文件 my_note_widget.xml ,编写例如以下:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="72dp" android:minHeight="72dp"
android:updatePeriodMillis="86400000" android:initialLayout="@layout/my_note_widget"
android:configure="com.silenceburn.MyNoteConf">
</appwidget-provider>

当中 minWidth minHeight 用来指定widget的大小,假设我们仅仅占用一个格子,也就是俗称的1X1,

那么72dp的长宽是android平台推荐的一个最佳实践值。

然后用 initialLayout 參数关联了我们编写好的 layout 文件,

用 configure 參数关联了我们编写好的配置用Activity:MyNoteConf,

此外另一个參数 updatePeriodMills 指定widget的刷新周期,

从省电角度考虑,一般都把此值设置的比較大,假设一定要对widget做周期性的事情,能够使用AlarmManager。

至此全部widget的要素都已经准备好,我们执行一下来看看吧。


4.执行widget原型程序

为了执行widget,我们还须要改动一下 AndroidManifest.xml 来声明我们的widget。

声明一个receiver,过滤 android.appwidget.action.APPWIDGET_UPDATE ,

而且用metadata关联到我们自己编写的 appWidgetProvider 实现。

声明一个activity关联到我们的配置类 MyNoteConf,过滤 android.appwidget.action.APPWIDGET_CONFIGURE。

最后改动一下应用图标,此图标会出如今系统的新增widget列表中。

编写好的AndroidManifest.xml 例如以下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.silenceburn" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/sketchy_paper_008"
android:label="@string/app_name">
<receiver android:name=".MyNote">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/my_note_widget" />
</receiver>

<activity android:name=".MyNoteConf">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
</application>
</manifest>

至此原型程序所有开发完毕,执行一下看看效果吧!

在桌面上长点,能够选择我们刚刚写的原型widget“MyNote”了,

选择后出现我们定义的配置界面MyNoteConf,

可是因为我们在onCreate中finish了,所以是一闪而过的。

之后MyNote就出如今桌面上了。

我们能够随便拖动它,或者把它丢进垃圾箱,观察一下日志输出。


上半部分总结

上半部分主要完毕了一个widget的原型,它没有不论什么业务功能,

可是已经是一个能够执行的骨架了。

在下半部分中我们为它加入血和肉,让它真正具备业务功能。

希望大家喜欢这样的先写骨架,再逐步丰富的开发方式 :)

下半部分已出炉 android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (下)

地址是:http://blog.csdn.net/silenceburn/archive/2010/12/23/6094705.aspx

android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)的更多相关文章

  1. win7桌面便签。自带的

    新建WIN7下的桌面便签小程序 桌面—>新建 快捷方式-> 输入%windir%\system32\StikyNot.exe

  2. Android 应用开发实例之情景模式

    2013-07-01 Android 应用开发实例 1. 情景模式 使用TabHost来实现主界面的布局. 设置一组RadioButton来切换不同的情景模式. 对比普通情景模式,定时情景模式需要加上 ...

  3. Win7系统桌面便签怎么添加?

    参考:http://jingyan.baidu.com/article/ab69b270c207432ca7189f99.html Win7系统桌面便签怎么添加?有时候工作.学习忙起来就会忘记要办的事 ...

  4. Android Widget 开发详解(二) +支持listView滑动的widget

    转载请标明出处:http://blog.csdn.net/sk719887916/article/details/47027263 不少开发项目中都会有widget功能,别小瞧了它,他也是androi ...

  5. Android计算器开发实例

    Android简单计算器开发实例如图: ==================================================== activity_main.xml 代码如下: < ...

  6. Android自动化测试 - MonkeyRunner(二) 锤子便签测试脚本

    来源于:http://testerhome.com/topics/878 # encoding=utf-8 #导入python中自带的time模块和sys模块,脚本中都要用到它们. import ti ...

  7. android 浏览器开发实例

    android app需要通过手机显示网页信息还是比较常用的,比如我最近业余开发的 抢商铺游戏,需要对游戏规则做说明,规则会比较多,而且要经常变动,就想到用网页来展示,更新起来方便,不像应用,一旦发布 ...

  8. Android网络开发实例(基于抓包实现的网络模拟登录,登出和强制登出)

    学习Android有几个月了,最近喜欢上了网络编程,于是想通过Android写一些一个小程序用于连接外网.在这里非常感谢雪夜圣诞的支持,非常感谢,给我打开新的一扇门. 1.声明,本程序只能用于西南大学 ...

  9. win7和win10自带桌面便签哪里找

    一些小伙伴习惯使用windows自带的便签功能,但win7和win10区别较大, 导致更新系统后不知道在哪里找,甚至以为没有该功能了, 其实不然,下面我总结了2种方法,希望能帮到有需要的人 win7( ...

随机推荐

  1. iOS、mac开源项目及库(感谢原作者的分享)

    目录 模糊效果 富文本 表相关 HUD与Toast 其他UI 其他动画 网络测试 网络聊天 Model 数据库 PDF 摄像照相视频音频处理 消息相关 消息推送服务器端 版本新API的Demo 测试及 ...

  2. 数据视化Echarts+百度地图API实现市县区级下钻

    开始 这两天公司有个页面需要做数据可视化的展示,数据视化采用的是Echarts+百度地图API做展示,需要用到县级区级下钻的一个联动效果发现网上关于Echarts做到县区级下钻的资料很少,有的话也不是 ...

  3. SQL每个用户最后的一条记录

    SELECT [ID] ,[UserID] ,[StartDate] ,[EndDate] ,[CreateUser] ,[CreateDate] ,[LastEditUser] ,[LastEdit ...

  4. HTML、CSS、JS、PHP 的学习顺序~(零基础初学者)

    如果你有耐心坚持一年以上的话, 我会推荐HTML->CSS->JS->PHP的顺序来学习. 1. HTML学习:首先学习HTML,HTML作为标记语言是非常容易学的,把w3schoo ...

  5. Ubuntu 添加sudo用户

    第一种方法: 添加sudo用户 当你安装Ubuntu的时候,它会自动添加第一个用户到sudo组,允许这个用户通过键入其自身帐户密 码来获得超级用户(root)身份.然而,系统不会再自动添加其他的用户到 ...

  6. web标准(复习)--5 超链接伪类

    今天我们开始学习超链接伪类,包含以下内容和知识点: 链接的四种样式 将链接转换为块状 用css制作按钮 首字下沉 一.超链接的四种样式 超链接可以说是网页发展史上一个伟大的发明,它使得许多页面相互链接 ...

  7. Webpack: 为Web开发而生的模块管理器[转]

    Webpack: 为Web开发而生的模块管理器 原文地址:http://hanjianwei.com/2014/09/10/webpack-package-manager-for-web/ 10 Se ...

  8. PHP学习系列(1)——字符串处理函数(2)

    6.chunk_split() 函数把字符串分割为一连串更小的部分.本函数不改变原始字符串. 语法:chunk_split(string,length,end) 参数: string——必需.规定要分 ...

  9. 文成小盆友python-num6 -反射 ,常用模块

    本次主要内容: 内容补充 python中的反射 常用模块 一,内容补充: 利用上次说到的递归的方法来实现阶乘. 说明:利用函数递归的方法来实现阶乘如: 1*2*3*4*5*6*7 代码实现如下: de ...

  10. C语言基础学习学习前的准备-2

    注释让程序更明了 注释帮助我们阅读代码,对代码的运行不会造成任何影响.C语言主要有两种注释方法,一种是使用//进行单行注释,注释内容放在//之后: //需要注释的内容 当你的注释内容不止一行时,可以使 ...