首先后台进程创建一个PendingIntent对象,其中PendingIntent中包含一个真正的Intent,创建完成后将此PendingIntent对象交给桌面控件所在的进程,当用户点击桌面控件或者其他情况时,触发Intent,从而可实现启动一个Activity、发送一个Broadcast、启动一个Service。

  创建PendingIntent的方法,其中的三个方法都是PendingIntent的静态方法:

1、getActivity(Context context,int requestCode,Intent intent,int flags)

2、getBroadcast(Context context,int requestCode,Intent intent,int flags)

3、getService(Context context,int requestCode,Intent intent,int flags)

  RemoteViews的作用

    1、RemoteViews对象表示一系列的View对象

2、RemoteViews所表示的对象运行在另外的进程当中

  向App Widget中添加Button并为Button绑定监听事件:

    首先在example_appwidget.xml添加Button按钮:

      <Button
        android:id="@+id/ButtonId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="测试按钮"/>

    为Button绑定处理器:

由于App Widget和应用程序运行在不同的进程当中(App Widget当中的View运行在Home Screen进程当中),所以无法按照之前的惯用方法绑定监听器。

remoteViews.setOnClickPendingIntent(R.id.ButtonId, pendingIntent);

在ExampleAppWidgetProvider类(extends AppWidgetProvider)的onUpdate()方法:

      <1>点击Button启动一个Activity:

        for(int i = 0;i<appWidgetIds.length;i++){
          //创建一个Intent对象
          Intent intent = new Intent(context,MainActivity.class);
          //创建一个PendingIntent
          PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
          RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.example_appwidget);
          //为按钮绑定事件处理器
          //第一个参数用来指定被绑定处理器的控件的ID
          //第二个参数用来指定当事件发生时,哪个PendingIntent将会被执行
          remoteViews.setOnClickPendingIntent(R.id.ButtonId, pendingIntent);
          //更新AppWidget
          //第一个参数用于指定被更新AppWidget的ID
          appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
        }

      <2>点击Button发送一个广播事件,更新App Widget控件内容:

首先在AndroidManifest.xml文件中添加一个action,当intent包含此action时都可以被ExampleAppWidgetProvider类(extends AppWidgetProvider)接收

          <receiver android:name="ExampleAppWidgetProvider">
            <intent-filter >
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            </intent-filter>
            <intent-filter >
              <action android:name="zhanglei.appwidget.UPDATE_APP_WIDGET"/>
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
              android:resource="@xml/example_appwidget_info"/>
          </receiver>

      ExampleAppWidgetProvider类代码如下:

        //定义一个常量字符串,该常量用于命名Action
        private static final String UPDATE_ACTION = "zhanglei.appwidget.UPDATE_APP_WIDGET";

onUpdate()代码如下:

          //创建一个Intent对象
          Intent intent = new Intent();
          intent.setAction(UPDATE_ACTION);
          //使用getBroadcast方法,得到一个PendingIntent对象,当该对象执行时会发送一个广播
          PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
          RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.example_appwidget);
          remoteViews.setOnClickPendingIntent(R.id.ButtonId, pendingIntent);
          appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
          // TODO Auto-generated method stub
          super.onUpdate(context, appWidgetManager, appWidgetIds);

        调用RemoteViews类当中的方法更新控件:

          public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            super.onReceive(context, intent);
            String action = intent.getAction();
            if(UPDATE_ACTION.equals(action)){
              //remoteViews代表整个Widget中的所有控件
              RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.example_appwidget);
              //第一个参数是ImageView控件的ID
              //第二个参数是图片的ID
              remoteViews.setImageViewResource(R.id.ImageId, R.drawable.ic_launcher);
              remoteViews.setTextViewText(R.id.textId, "text");
              //得到AppWidgetManager对象
              AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
              //componentName代表整个Widget
              ComponentName componentNane = new ComponentName(context,ExampleAppWidgetProvider.class);
              appWidgetManager.updateAppWidget(componentNane, remoteViews);
            }
            else{ //处理其他的action,调用父类中的onReceive方法
              super.onReceive(context, intent);
            }
          }

App Widget简单应用的更多相关文章

  1. Android App Widget的简单使用

    App Widget是一些桌面的小插件,比如说天气和某些音乐播放应用,放到桌面去的那部分: 例如: 实现步骤及代码如下: (1)首先,在AndroidManifest.xml中声明一个App Widg ...

  2. 一个App Widget实例第一次创建时被调用

    事实上已经有很多的所谓的路由框架做到这一点,我也没有去研究别的,加上一直对backbone这个框架的评价不错,所以就琢磨着怎么用它实现我所需要的SPA的url管理了. 比如,你可能会说"如果 ...

  3. android app widget 创建调用周期

    1 ?Android widget 大小问题 2 ?RemoteViewService Android开发历程_15(AppWidget的使用) Appwidget就是手机应用中常常放在桌面(即hom ...

  4. [安卓开发]App Widget开发入门指导

    本节所要讲的主要内容包括Android桌面小部件.App Widget的开发入门指导,并通过一个简单实例的形式来直观的讲解App Widget. 一.Widget .App Widget .Web A ...

  5. Android 之窗口小部件高级篇--App Widget 之 RemoteViews - 跨到对岸去

    在之前的一篇博文( Android 之窗口小部件详解--App Widge t)中,已经介绍了App Widget的基本用法和简单实例.这篇主要讲解 App Widget 的高级内容,即通过 Remo ...

  6. Android 之窗口小部件高级篇--App Widget 之 RemoteViews

    Android 之窗口小部件高级篇--App Widget 之 RemoteViews 在之前的一篇博文(Android 之窗口小部件详解--App Widget)中,已经介绍了App Widget的 ...

  7. 基于MaterialDesign设计风格的妹纸app的简单实现

    代码地址如下:http://www.demodashi.com/demo/11644.html *今天看了郭神的第二行代码,深深的被MaterialDesign的设计风格所吸引,然后就照例做了一个小D ...

  8. App Widget

    AppWidgetProviderInfo对象: 为App Widget提供元数据(描述数据的数据,如XML.关系型数据的表结构),包括布 局,更新频率等数据.这个对象被定义在XML文件当中: App ...

  9. APP Widget的开发

    Android中经常用到APP Widget,如时钟,天气预报等. 长按屏幕,在弹出的对话框中选择“窗口小部件”,然后就列出了可选择的小部件,这些小部件就是APP Widget. 本文开发一个APP ...

随机推荐

  1. centos上安装php运行环境

    可以参考,但我安装的过程不完全一样http://www.cnblogs.com/liulun/p/3535346.html 我先安装的apache,直接执行的yum -y install httpd ...

  2. 快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,即USE方法

    命令:uptime说明:查看机器分别在1分钟.5分钟.15分钟的平均负载情况,显示的数字表示等待cpu资源的进程和阻塞在不可中断io进程的数量,如果1分钟的平均负载很高,而15分钟的平均负载很低,说明 ...

  3. HDFS 与 GFS 的设计差异

    后端分布式系列」前面关于 HDFS 的一些文章介绍了它的整体架构和一些关键部件的设计实现要点. 我们知道 HDFS 最早是根据 GFS(Google File System)的论文概念模型来设计实现的 ...

  4. 【腾讯Bugly干货分享】Redex初探与Interdex:Andorid冷启动优化

    本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/583b9e3ee8992c2c2df6e6ac 导语 早在去年10月份,face ...

  5. 我的面板我做主 -- 淘宝UWP中自定义Panel的实现

    在Windows10 UWP开发平台上内置的XMAL布局面板包括RelativePanel.StackPanel.Grid.VariableSizedWrapGrid 和 Canvas.在开发淘宝UW ...

  6. clojure基础入门(一)

    最近在看storm的源码,就学习分享下clojure语法. 阅读目录: 概述 变量 运算符 流程控制 总结 概述 clojure是一种运行在JVM上的Lisp方言,属于函数式编程范式,它和java可以 ...

  7. sysbench 压力测试

    200 ? "200px" : this.width)!important;} --> 介绍 sysbench是一个模块化.跨平台.多线程基准测试工具,主要用于测试不同系统参 ...

  8. C#编程模式之扩展命令

    C#编程模式之扩展命令 前言 根据上一篇的命令模式和在工作中遇到的一些实际情况,有了本篇文章,时时都是学习的一个过程,会在这个过程中发现许多好的模式或者是一种开发方式,今天写出来的就是我工作中常用到的 ...

  9. Nodejs初阶之express

    PS: 2014/09/24 更新<Express 4.X 启航指南>,欢迎阅读和评论:)   老规矩,开头部分都是些自娱自乐的随想,想到哪写到哪... 到今天俺已经在俺厂工作俩年零几天了 ...

  10. ie a absolute bug

    给a设置position:absolute时,在IE下,尽管display:block;width:100%;height:100%,依然无法点击.但是加一个背景颜色就可以了.如果不需要背景,再把背景 ...