Android中的AppWidget入门教程

什么是AppWidget?AppWidget就是我们平常在桌面上见到的那种一个个的小窗口,利用这个小窗口可以给用户提供一些方便快捷的操作。本篇打算从以下几个点来介绍AppWidget:

1.如何创建一个简单的AppWidget
2.如何使得AppWidget与客户端程序交互

创建简单的AppWidget

在介绍之前给大家看一下程序运行的最后结果和项目结构图,以便大家有个整体的印象。

运行结果图:

项目结构图:

第一步:

首先在res文件夹下新建一个名字为xml的文件夹,然后在xml目录下创建一个名为appwidget01的xml文件(如上图所示)。这个appwidget01中的内容如下:

代码如下:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth = "294dp"
  android:minHeight = "72dp"
  android:updatePeriodMillis = "86400000"
  android:initialLayout = "@layout/appwidgetlayout"
  >
</appwidget-provider>

这个xml是用来描述你所要创建的appWidget的一些描述信息的,比如高度、宽度、刷新间隔、布局文件等等。仅仅这个描述文件还不够,我们看到的appWidget可都是有界面元素的呀,比如说文本,图片,按钮等等,这些东西的定义都需要放到layout文件夹下面。这个文件就是上面代码中写到的那个appwidgetlayout。

第二步:

在layout文件夹下面新建一个appwidgetlayout.xml文件,在这个文件中描述了appWidget的控件和布局等等信息,就和我们平常创建的一个activity的布局文件没什么两样,因为只是简单的演示,所以仅用一个文本和一个按钮。xml的内容如下:

代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <TextView android:id="@+id/txtapp" android:text="test" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:background="#ffffff"></TextView>
    <Button android:id="@+id/btnSend" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="Send"></Button>
</LinearLayout>

第三步:

既然appWidget中存在按钮等等控件,那么就肯定少不了处理这些控件事件的处理代码啦。这些代码被放在一个继承于AppWidgetProvider的类中,在本例子中我新建了一个AppWidget的类,该类继承于AppWidgetProvider,以后所有的AppWidget上面的控件事件都会在这个类中处理。看一下类的内容:

代码如下:

public class AppWidget extends AppWidgetProvider
{
 
    private final String broadCastString = "com.qlf.appWidgetUpdate";
    
    /**
     * 删除一个AppWidget时调用
     * */
    @Override
    public void onDeleted(Context context, int[] appWidgetIds)
    {
        super.onDeleted(context, appWidgetIds);
    }
 
    /**
     * 最后一个appWidget被删除时调用
     * */
    @Override
    public void onDisabled(Context context)
    {
        super.onDisabled(context);
    }
 
    /**
     * AppWidget的实例第一次被创建时调用
     * */
    @Override
    public void onEnabled(Context context)
    {
        super.onEnabled(context);
    }
 
    /**
     * 接受广播事件
     * */
    @Override
    public void onReceive(Context context, Intent intent)
    {
 
             super.onReceive(context, intent);
    }
 
    /**
     * 到达指定的更新时间或者当用户向桌面添加AppWidget时被调用
     * */
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds)
    {
 
                 
    }
    
}

各个方法的作用大家一看上面的注释就明白了。我们暂时不需要实现里面的方法。

第四步:

在AndroidManifest.xml中定义一些创建AppWidget必要的东西,先看代码:

代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.qlf.widget" android:versionCode="1" android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="AppWidget">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/appwidget01" />
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="8" />
</manifest>

可以看到我们在配置文件里面定义了一个receiver,他的名字是上面创建处理控件代码的那个类,下面那个intent-filter中的action是系统自带的用于更新所有appwidget的广播动作。然后meta-data标签是一个描述我们创建appwidget的元数据,那个android:name="android.appwidget.provider"是固定的,android:resource="@xml/appwidget01"指定创建的appWidget的描述信息的位置。这样程序就知道到哪里去初始化这些appWidget啦。

经过上面四个步骤,我想您已经能够成功在桌面上添加小工具了,效果就是我们最前面发出的样子。

AppWidget与程序交互

前面我们只是简单的介绍了如何创建一个appWidget,但是目前这个appWidget还没有任何的交互功能。下面我们介绍一下appWidget如何与程序进行交互。首先要介绍一个对象,这个对象在appwidget和程序的交互中很重要,他就是RemoteViews。因为appwidget运行的进程和我们创建的应用不在一个进程中,所以我们也就不能像平常引用控件那样来获得控件的实例。这个时候RemoteViews出场了,从字面上看他的意思是远程的视图,也就是说通过这个东西我们能够获得不在同一进程中的对象,这也就为我们编写appwidget的处理事件提供了帮助。我们使用一下代码来创建一个RemoteViews :

代码如下:

RemoteViews remoteViews  = new RemoteViews(context.getPackageName(),R.layout.appwidgetlayout);
 
remoteViews.setOnClickPendingIntent(R.id.btnSend, pendingIntent);  //为小工具上的按钮绑定事件

可以看到上面又出现了一个陌生的对象pendingIntent,这个又是用来干嘛的呢?我们知道在一般的程序中绑定按钮的点击事件是直接在实现了OnClickListener接口的类中中完成的。不过因为appwidget并不在我们应用的进程中,所以当然他也访问不到我们在应用中设置的onclick代码啦。而PendingIntent就是被用来解决这个问题的。PendingIntent可以看成是一个特殊的Intent,如果我们把Intent看成一封信,那么PendingIntent就是一封被信封包裹起来的信。这封信在remoteViews.setOnClickPendingIntent()中被“邮寄”到了appwidget, 当appwidget中的按钮单击时他知道将这封信打开,并执行里面的内容。这样就避免了直接从appwidget中执行本地代码。我们来看看PendingIntent是如何定义的:

代码如下:

//创建一个Intent对象
Intent intent = new Intent();
intent.setAction(broadCastString);
 
//这一步相当于写信,说明这个信的作用到底是什么,在这里表示将发送一个广播
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

有了上面的介绍,我们在创建appwidget的交互应用时就简单不少了。我们剩下要做的工作就是在appwidget在创建的时候调用上面说到的方法为appwidget中的控件绑定事件,也就是在AppWidget类下的onUpdate方法中完成这个过程。

代码如下:

/**
* 到达指定的更新时间或者当用户向桌面添加AppWidget时被调用
* */
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds)
{
 
        //创建一个Intent对象
        Intent intent = new Intent();
        intent.setAction(broadCastString);
 
 
        //设置pendingIntent的作用
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        RemoteViews remoteViews  = new RemoteViews(context.getPackageName(),R.layout.appwidgetlayout);
       
 
        //绑定事件
        remoteViews.setOnClickPendingIntent(R.id.btnSend, pendingIntent);
        
        //更新Appwidget
        appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
}

通过上面的代码我们就为button按钮绑定了一个事件,这个事件的作用是发送一个广播便于其他应用接收、更新信息。这是appwidget发送广播,那么appwidget如何接受来自其他程序发送的广播呢?这就是public void onReceive(Context context, Intent intent)的功能啦。这个方法会接收来自其他应用发出的广播,我们只要在这个程序中过滤我们需要的广播就能响应其他应用的操作来更新appwidget的信息了。要注意的是,因为appwidget运行的进程和我们创建的应用不在一个进程中的限制,所以更新的appwidget的时候也要通过远程对象来操作,具体代码如下:

代码如下:

/**
   * 接受广播事件
   * */
  @Override
  public void onReceive(Context context, Intent intent)
  {
      if (intent.getAction().equals(broadCastString))
      {              
          //只能通过远程对象来设置appwidget中的控件状态
          RemoteViews remoteViews  = new RemoteViews(context.getPackageName(),R.layout.appwidgetlayout);
 
         //通过远程对象将按钮的文字设置为”hihi”
          remoteViews.setTextViewText(R.id.btnSend, "hihi");  
           
          //获得appwidget管理实例,用于管理appwidget以便进行更新操作
          AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
          
          //相当于获得所有本程序创建的appwidget
          ComponentName componentName = new ComponentName(context,AppWidget.class);
          
          //更新appwidget
          appWidgetManager.updateAppWidget(componentName, remoteViews);
      }
      super.onReceive(context, intent);
  }

总结下就是appwidget上的操作都必须借助远程对象来操作。最后看一下运行的图片吧:

按之前:

按之后:

(0)

相关推荐

  • 基于Android AppWidgetProvider的使用介绍

    AppWidgetProvider 用来在HOME页面显示插件 实现步骤:1.为AppWidget提供一个元布局文件AppWigdetProvider_Provider.xml,用来显示Widget的界面.2.创建一个类继承自AppWidgetProvider,并覆写里面的相关的方法.3.为WidgetProvider创建一个引用的布局文件,或者直接用main.xml.4.在程序中注册Manifest.xml. 代码如下: 1.在res/xml/文件夹下创建AppWigdetProvider_P

  • 讲解Android中的Widget及AppWidget小工具的创建实例

    1.Widget .App Widget .Web App 的概念 Widget最初的概念是98年一个叫Rose的苹果工程师提出,直到2003年的时候才正式为大家所知,不过随后无数大公司都开始接受并应用这一思路. 现在我们看到在苹果系统里按下F4弹出的Dashboard里的小工具叫Widget,在Windows 7里侧边栏上的那些漂亮的小工具叫Gadget(widget变体?),除此以外还有yahoo Widget等等Widget产品.他们有一个共同的特点就是采用前台Web开发用的技术(譬如HT

  • Android UI组件AppWidget控件入门详解

    Widget引入 我们可以把Widget理解成放置在桌面上的小组件(挂件),有了Widget,我们可以很方便地直接在桌面上进行各种操作,例如播放音乐. 当我们长按桌面时,可以看到Widget选项,如下图所示: 点击上图中箭头处的widgets图标,会出现如下界面:(都是widget) 长按上图中的任意一个widget,就可以将其放到桌面上. Widget的使用 Widget的实现思路  (1)在AndroidManifest中声明AppWidget:  (2)在xml目录中定义AppWidget

  • Android学习之AppWidget高级效果

    接着AppWidget基础学习,今天是一个"进阶版"的小例子,用来检验一下自己的学习效果.于是就做了一个掷骰子的Widget. 方便大家观看,先截图如下: 需要注意的是在drawable文件夹下有几张图片,我是在网上下载的别人的素材. 下面就开始我们的学习之旅吧. 第一步: 是在res/目录下创建一个名为xml的文件夹(其实名字是随意的,不必拘泥与这一个名字),然后在里面创建一个appwidget_info.xml文件,其作用就是向系统进行声明. <appwidget-provi

  • Android学习之AppWidget笔记分享

    什么是AppWidget?AppWidget就是我们平常在桌面上见到的那种一个个的小窗口,利用这个小窗口可以给用户提供一些方便快捷的操作. 今天的目标就是怎么创建一个简单的AppWidget. 首先我先把目录结构展示一下,方便大家理解. 第一步:我们需要在res目录下创建一个folder,可以命名为xml(但这并不是必须的,你也可以换成你喜欢的名字).然后在这么目录下创建一个xml文件.我的appwidget.xml文件代码如下: <appwidget-provider xmlns:androi

  • 简单掌握Android Widget桌面小部件的创建步骤

    一.Widget设计步骤 需要修改三个XML,一个class: 1.第一个xml是布局XML文件(如:main.xml),是这个widget的.一般来说如果用这个部件显示时间,那就只在这个布局XML中声明一个textview就OK了. 2.第二个xml是widget_provider.xml,主要是用于声明一个appwidget的.其中,Layout就是指定上面那个main.xml. 3.第三个xml是AndroidManifest.xml,注册broadcastReceiver信息. 4.最后

  • Android开发入门之Appwidget用法分析

    本文实例讲述了Android Appwidget用法.分享给大家供大家参考,具体如下: App Widgets 是一个小型应用程序的View  他可以嵌入到其他应用程序中(如 桌面程序) 并且可以得到周期性刷新. 在创建App Widget之前需要了解以下几个概念 AppWidgetProviderInfo对象 它是对App Widget 元数据的一个描述,譬如 AppWidget的布局,刷新频率,以及   AppWidgetProvider 类  这些元数据都是定义在XML中. AppWidg

  • Android编程之桌面小部件AppWidgetProvider用法示例

    本文实例讲述了Android编程之桌面小部件AppWidgetProvider用法.分享给大家供大家参考,具体如下: /** * 桌面小部件 AppWidget配置 * * @description: * @author ldm * @date 2016-5-16 下午1:57:16 */ public class ExampleAppWidgetConfigure extends Activity { static final String TAG = "ExampleAppWidgetCon

  • Android之AppWidget(桌面小部件)开发浅析

    什么是AppWidget AppWidget 即桌面小部件,也叫桌面控件,就是能直接显示在Android系统桌面上的小程序,先看图: 图中我用黄色箭头指示的即为AppWidget,一些用户使用比较频繁的程序,可以做成AppWidget,这样能方便地使用.典型的程序有时钟.天气.音乐播放器等.AppWidget 是Android 系统应用开发层面的一部分,有着特殊用途,使用得当的化,的确会为app 增色不少,它的工作原理是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法.长按桌面空白处,会出现

  • Android中的AppWidget入门教程

    什么是AppWidget?AppWidget就是我们平常在桌面上见到的那种一个个的小窗口,利用这个小窗口可以给用户提供一些方便快捷的操作.本篇打算从以下几个点来介绍AppWidget: 1.如何创建一个简单的AppWidget 2.如何使得AppWidget与客户端程序交互 创建简单的AppWidget 在介绍之前给大家看一下程序运行的最后结果和项目结构图,以便大家有个整体的印象. 运行结果图: 项目结构图: 第一步: 首先在res文件夹下新建一个名字为xml的文件夹,然后在xml目录下创建一个

  • Android 超详细SplashScreen入门教程

    这次的Android系统变化当中,UI的变化无疑是巨大的.Google在Android 12中采取了一种叫作Material You的界面设计,一切以你为中心,以你的喜好为风格.相信大家一旦上手Android 12之后应该能立刻察觉到这些视觉方面的变化. 关于这个SplashScreen,今天就值得好好讲一讲了. 什么是SplashScreen SplashScreen其实通俗点讲就是指的闪屏界面.这个我们国内开发者一定不会陌生,因为绝大多数的国内App都会有闪屏界面这个功能,很多的App还会利

  • Android中AsyncTask的入门使用学习指南

    前言 AsyncTask异步任务,用于执行耗时任务并在UI线程中更新结果. 我们都知道,Android UI线程中不能执行耗时的任务,否则就会出现ANR.对于耗时的操作就需要放到子线程中操作,操作完成后需要通知UI线程进行更新等操作,这就需要Android的异步消息机制(创建一个Message对象,使用Handler发送出去,然后在Handler的handleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作). 不过本文要说的是AsyncTask,其实早在Andr

  • Go中的gRPC入门教程详解

    目录 Go GRPC 入门 1,安装包 2,gRPC 服务端 3,gRPC 客户端 4,编译运行 5,其它 GRPC Protobuf buffer 字段类型 字段规则 Protobuf gRPC 四种服务方法 编译 proto Go GRPC 入门 1,安装包 grpc golang-grpc 包提供了 gRPC 相关的代码库,通过这个库我们可以创建 gRPC 服务或客户端,首先需要安装他. go get -u google.golang.org/grpc 协议插件 要玩 gRPC,自然离不开

  • Python中的Numpy入门教程

    1.Numpy是什么 很简单,Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy.matplotlib一起使用.其实,list已经提供了类似于矩阵的表示形式,不过numpy为我们提供了更多的函数.如果接触过matlab.scilab,那么numpy很好入手. 在以下的代码示例中,总是先导入了numpy: 复制代码 代码如下: >>> import numpy as np>>> print np.version.version1.6.2

  • PHP中使用curl入门教程

    概述 在我的上一篇文章"curl和libcurl简介"中简单的给大家介绍了curl相关的知识.这篇文章向大家介绍一下PHP中的curl扩展. 尽管在上一篇文章中,对curl和libcurl做了区分,也解释了某些相关的概念.同时,也知道了PHP中的curl扩展其实是对libcurl的封装.但是,在这篇文章中,为了写起来方便,将不再对这两个概念进行区分,因此文章接下来提到的curl其实是指libcurl,希望不会把大家绕糊涂. 关于PHP中curl扩展这里就不再过多介绍了,大家可以查下文档

  • C#中Linq的入门教程

    一.LINQ的体系结构 语言集成查询 (LINQ) (C#) | Microsoft 官方文档 LINQ总共包括五个部分: 程序集 命名空间 描述 LINQ to Objects System.Core.dll System.Linq 提供对内存中集合操作的支持 LINQ to XML System.Xml.Linq.dll System.Xml.Linq 提供对XML数据源的操作的支持 LINQ to SQL System.Data.Linq.dll System.Data.Linq 提供对S

  • Android中Intent组件的入门学习心得

    目录 什么是 Intent ? Intent 的类型? Intent 的组成 显式 Intent 的使用 隐式 Intent 的使用 总结 什么是 Intent ? Intent是Android开发中一个非常重要且常用的类,Intent是一个消息传递对象,可以用来从其他应用组件请求操作,使用Intent可以在一个组件中同一APP中的另一个组件或者是启动另一个APP的组件(这里所说的组件包括Activity.Service和Broadcast). ctivity.service和broadcast

  • Python 机器学习库 NumPy入门教程

    NumPy是一个Python语言的软件包,它非常适合于科学计算.在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础库. 本文是对它的一个入门教程. 介绍 NumPy是一个用于科技计算的基础软件包,它是Python语言实现的.它包含了: 强大的N维数组结构 精密复杂的函数 可集成到C/C++和Fortran代码的工具 线性代数,傅里叶变换以及随机数能力 除了科学计算的用途以外,NumPy也可被用作高效的通用数据的多维容器.由于它适用于任意类型的数据,这使得NumPy可以无缝和

  • Android Studio 新手入门教程(一)基本设置图解

    ##写在前面: 作为一个刚半只脚踏入android开发的新手,在使用eclipse开发了两个自我感觉不甚成熟的商城类app之后,遇到了一些问题,总结为如下: 1.代码复用性 .findviewById,onclick事件等,一遍遍重复这类无聊的代码简直浪费生命,这个问题推荐通过依赖注入框架ButterKnife解决,直接一键生成布局中的所有控件,包括onclick点击事件,但是诸如行布局item里的控件,以及布局中include复用的布局要如何使用框架解决,这个有待后续再看. 另一个代码重复率很

随机推荐