我的桌面插件大概分了两块,一块为一个小的桌面时钟,根据系统时间变化来设定时间。第二个是几个Textview和一个imageView来显示当前城市的天气,温度,还有一个小的天气图标。

小插件的实现要自己重写一个类继承AppWidgetProvider这个父类,并重写onUpdate()方法(并不规定一定要重写,但是这样的话这个插件就没有实际的意义)。AppWidget和Activity.Service等一样需要在Mainfest文件中注册才能使用。要实现AppWidget同样需要两个xml文件,一个xml文件定义了一个appwidget-provider控件的各种属性:

<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"    android:minWidth="300dip" android:minHeight="50dp"    android:updatePeriodMillis="1000"   android:initialLayout="@layout/widget_layout"    >
</appwidget-provider>    

高度宽度就不说了,android:updatePeriodMillis规定了这个插件的更新的频率,个人理解是一旦到了这个频率就执行onUpdate里面的代码,但是我现在写的1000实际上是没有意义的,现在的安卓系统为了不让插件太占用系统电量和内存,规定android:updatePeriodMillis这个值不能低于30分钟,也就是 1800000毫秒,低于这个值的会自动默认为30分钟,那么我们要实现每分钟更新一次系统时间就得自己调用Service或者广播来实现,我这里是调用handler机制实现的。

还有就是android:initialLayout这个表示插件的布局文件,用@layout引用。

因为我的时钟并不是textview而是imageView,这样就需要根据时间来加载图片。

先弄一个图片资源ID的数组和一个控件资源ID的数组

// 数字图片的ID  
    private int[] digits = new int[] 
{
    R.drawable.widget_timer0,  
            R.drawable.widget_timer1, R.drawable.widget_timer2,  
            R.drawable.widget_timer3, R.drawable.widget_timer4,  
            R.drawable.widget_timer5, R.drawable.widget_timer6,  
            R.drawable.widget_timer7, R.drawable.widget_timer8,  
            R.drawable.widget_timer9
    };  
    // 用于显示数字的ImageView的ID  
    private int[] digitViews = new int[]
{
    R.id.first, R.id.second,  
            R.id.fourth, R.id.fivth 
    };

接下来就要在onUpdate中书写代码了:

timer = new Timer();//启动周期性调度timer.schedule(new TimerTask(){public void run(){Message msg=new Message();msg.what=1;handler.sendMessage(msg);}},0,1000);}

这里我定义了一个定时器,timer,它的方法timer.schedule( new TimerTask() {void run() },0,60*60*1000);参数解释:

第一个参数:是一个TimeTask类,需实现run方法,因为TimeTask实现了runnable接口。

第二个参数:0的意思是没有延迟,当你调用timer.schedule方法后,必然会调用run方法,这个数值就是调用者两个方法之间的差值,也就是说,用户调用schedule()方法后,要等待这么长的一段时间才能调用run()方法。

第三个参数:为时间间隔,意思是调用了一次run方法后,要等待多长时间才能再一次调用run方法,单位是毫秒。

run方法中new出了一个Message,由handler发送出去,间隔是1000毫秒也就是1秒。有发送就必然会有接受,所以下面我的主要逻辑代码就在当handler接受到Message后的。

<span style="font-size:10px;">private Handler handler = new Handler(){public void handleMessage(Message msg){if(msg.what == 1){RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.widget_layout);SimpleDateFormat df = new SimpleDateFormat("HHmmss");String timeStr = df.format(new Date());for(int i = 0;i < digitViews.length;i++){int num = timeStr.charAt(i) - 48;views.setImageViewResource(digitViews[i], digits[num]);}ComponentName componentName = new ComponentName(context,MyWidgetProvider.class);appWidgetManager.updateAppWidget(componentName,views);}super.handleMessage(msg);}};</span>

RemoteViews:      RemoteViews类描述了一个View对象能够显示在其他进程中,可以融合从一个 layout资源文件实现布局。虽然该类在android.widget.RemoteViews而不是appWidget下面但在Android Widgets开发中会经常用到它,主要是可以跨进程调用(appWidget由一个服务宿主来统一运行的)。

构造方法 
RemoteViews(String packageName, int layoutId) 
创建一个新的RemoteViews 对象将显示 views包含指定一个layout资源. 
RemoteViews(Parcel parcel) 
读取RemoteViews对象从一个parcel中.

简单来说就是这个玩意可以在其他进程中改变Widget的控件内容,通过setXXX的方法。

这样时钟那一部分就完成了,接下来就简单了,改变城市及天气图标值,因为AppWidgetProvider是继承BroadcastReceiver的,所以他拥有广播的onReceiver方法,所以可以在AppWidgetProvider里面写一个自己的方法(例如为updateUI()),执行这个方法的时候就发送一段广播,由onReceiver接受,将事务代码写在onReceiver中,当我每一次想改变插件内容时我就调用updateUI()方法即可。

public void upDateTextview(Context context){Context mcontext = null;  Intent intent = null;  //新建一个要发送的Intent  mcontext = context;  intent = new Intent();  intent.setAction(broadCastString);  //发送广播(由onReceive来接收)  mcontext.sendBroadcast(intent);  }
public void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubsuper.onReceive(context, intent);RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);if(intent.getAction().equals(broadCastString))  {    /*******************加入事务代码*********************//************************************************///将该界面显示到插件中  AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);  ComponentName componentName = new ComponentName(context,MyWidgetProvider.class);  appWidgetManager.updateAppWidget(componentName, rv);  }

天气预报--桌面插件功能相关推荐

  1. android 桌面插件 语录,一句话心情语录app

    一句话心情语录app是一个心情阅读软件,这里有着一句句优美的语言,用一段段真挚的语言来温暖你我的身心,一句真挚的话语,洗涤心灵的尘埃,带给你温暖的心语.一句充满知识.智慧和感情的话语,柔软.温暖,充满 ...

  2. linux动态桌面插件,Ubuntu下使用动画壁纸 LiveWallpaper 0.3

    Ubuntu 系统本身的桌布功能已经非常不错了,基本上我们能想到的对桌布的需求也都可以实现.默认的几张壁纸也看得非常让我们轻松愉悦. 不过,用户的需求总是会不断的发展和出乎大多数的需求的,有很多人就希 ...

  3. 正点科技公司比赛-----桌面插件闹钟项目总结

    [size=large] 正点桌面插件项目总结 忙碌了一个星期的项目,终于在十一月25号那天的晚上九点左右完成了.但心里并没有想象中应当有的兴奋和喜悦.却更多的是一股无法言语的郁闷.因为我所认为的这个 ...

  4. 微信小程序插件功能页开发详细流程

     有问题可以扫码加我微信,有偿解决问题.承接小程序开发. 微信小程序开发交流qq群   173683895  . 526474645 : 正文: 关于新出的微信小程序插件功能页做一下记录,希望能帮到大 ...

  5. HTML5开发 桌面提醒功能

    桌面提醒的介绍 桌面通知功能能够让浏览器即使是最小化状态也能将消息通知给用户.这和WebIM是最为天然的结合.不过,目前支持Desktop Notification功能的浏览器只有Chrome5+. ...

  6. DISCUZ开启设计插件功能和显示嵌入点功能

    DISCUZ开启设计插件功能和显示嵌入点功能 找到config文件夹下的config_global.php文件,在最后添加 $_config['plugindeveloper'] = 0; $_con ...

  7. php打印模板插件,smarty的插件功能是smarty模板的精华

    一,smarty插件介绍 smarty的插件放在/smarty/libs/plugins下面,它为程序的开发提供了很大的方便,例如:{$yesterday|date_format:"%H:% ...

  8. embedv.php_PHP与视频播放插件功能实现,非常简单

    PHP与视频播放插件功能实现,非常简单 龙行    PHP    2018-8-28    2579    0评论 最近在研究maccms所以会接触到这个ckplayer播放器,那么如何 php与视频 ...

  9. Win10系统如何退出桌面磁贴功能

    桌面磁贴是Modern开始界面下的那些方格,但是很多小伙都用不太习惯却不知道如何去关闭这个功能,那么Win10系统如何退出桌面磁贴功能呢?就此问题,下面小编整理了Win10系统退出桌面磁贴功能的解决方 ...

最新文章

  1. 【系统缓慢、CPU 100%、频繁Full GC问题】的定位排查思路!
  2. python基础课程_学习笔记13:标准库:有些收藏夹——sys
  3. Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) 思维 + 质因子
  4. redis---安全设置
  5. servlet过滤器 实例_Java Servlet过滤器示例教程
  6. 学者CIO邓遵红:让人文梦想照进职业现实
  7. 又联考了一场,感觉自己好菜啊,T1没写出来,后来花了一个早上调试。QAQ。最后发现是个-1还有取模没打。。。TAT。。。难受极了!!!...
  8. 【物流选址】基于matlab粒子群算法求解多物流中心选址问题【含Matlab源码 1458期】
  9. UDP协议与TCP协议
  10. 操作系统安全与系统攻击
  11. ST-LINK驱动的安装(有图 超详细)
  12. c语言英文的读法将时间读出来,c怎么读(英文c正确读音)
  13. C++实现字符串去掉前后的空格
  14. python(2048)
  15. jQuery带缩略图轮播效果图片切换带缩略图
  16. Spring context:annotation-config/ 解说
  17. 单体测试与结合测试区别
  18. 嵌入式开发板硬件操作入门学习9——集成电路芯片手册术语词汇表(中英文对照)
  19. 一些常见数列的生成函数推导
  20. 两种安装MinGW的方法

热门文章

  1. 2023年pmp的考试时间是什么时候?(含pmp资料)
  2. iOS 访问网络权限
  3. xss编码绕过详解(更像是在介绍实体编码和JS编码的解析过程)
  4. java计算机毕业设计乡村基层政务管理系统源代码+数据库+系统+lw文档
  5. 详细讲解网络协议:TCP和UDP什么区别?
  6. Android测试接口时超时
  7. 常用优化器(Adam SGD)算法
  8. python人物关系可视化百年孤独_百年孤独LDA主题分析
  9. sync.Pool 问题argument should be pointer-like to avoid allocations (SA6002)
  10. 怎么选择好的CCD视觉检测?