Android开发之AppWidget详解

Android通知系统是它的一大特色,而其中,AppWidget是其中一个亮点。在开发应用的中,很多时候可以为其添加一个AppWidget显示在桌面中,及时方便的与用户进行

交互。这里就简单的熟悉一下开发一个AppWidget的流程吧。

想要在应用中创建一个AppWidget,至少需要以下几样东西:

  1. 需要创建一个AppWidgetProviderInfo,来描述AppWidget的元数据。
  2. 需要实现一个自己的AppWidgetProvider对AppWidget进行更新等操作。
  3. 需要布局文件来描述AppWidget的布局。

那么,下面就开始创建一个AppWidget吧。

一、在AndroidManifest.xml中声明一个AppWidget

首先我们需要在AndroidManifest.xml中声明AppWidgetProvider。格式如下:

<receiver android:name="MyAppWidgetProvider" >  
    <intent-filter>  
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />  
    </intent-filter>  
    <meta-data android:name="android.appwidget.provider"  
               android:resource="@xml/my_appwidget_info" />  
</receiver>  

可以看出AppWidgetProvider实际上就是一个BroadcastReceiver,它接收特定的Broadcast。<meta-data>标签描述了AppWidget所使用的元数据,android:resource则声明了定义元数据的xml文件的位置。

二、添加AppWidgetProviderInfo元数据

AppWidgetProviderInfo描述了AppWidget的本质特性,例如,AppWidget更新的周期,最小的宽度、长度,所使用的布局文件是什么,以及添加AppWidget需要启动的

configuration Activity等。我们需要在XML中来定义AppWidgetProviderInfo对象,这个XML文件应该保存在res/xml文件夹下。下面是一个范例:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  
    android:minWidth="294dp"  
    android:minHeight="72dp"  
    android:updatePeriodMillis="86400000"  
    android:previewImage="@drawable/preview"  
    android:initialLayout="@layout/example_appwidget"  
    android:configure="com.example.android.MyAppWidgetConfigure"   
    android:resizeMode="horizontal|vertical">  
</appwidget-provider>  

<appwidget-provider>需要使用这个标签来定义AppWidgetProviderInfo。下面对范例中使用到的属性做下说明。

minWidthminHeight定义了AppWidget需要占据的最小的空间。

updatePeriodMillis定义了大概多久AppWidget需要更新一次,这里定义的只是一个大概的时间,系统不能做出精确的保证。

previewImage定义了在用户选择AppWidget时做现实的图标。

initialLayout定义了AppWidget所使用的布局文件。

configure定义了AppWidget在添加的时候需要启动的configuration Activity 用于执行配置的工作。

resizeMode定义了缩放模式。

三、创建AppWidget所使用的布局文件

在创建AppWidget时必须创建一个布局文件,为其提供布局描述。AppWidget创建视图时,需要根据RemoteViews来创建。而出于效率等因素的考虑,很多控件在

RemoteViews中是被支持的。以下列出能在RemoteViews中使用的UI控件:

layout : FrameLayout , LinearLayout , RelativeLayout

widget : AnalogClock , Button , Chronometer , ImageButton , ImageView , ProgressBar , TextView , ViewFlipper , ListView , GridView , StackView , AdapterViewFlipper

四、创建一个AppWidgetProvider的子类

前面提到过AppWidgetProvider就是一个BroadcastReceiver。对,它其实确实是继承自BroadcastReceiver,只是它为了更加方便的处理AppWidget的广播进行了封装。

AppWidgetProvider在接收到AppWidget的广播的时候,会根据类型分别触发以下几个方法:

onUpdate() : 当AppWidget需要更新时,会触发这个方法,我们需要重写这个方法,在里面实现更新的操作。如果没有定义configuration Activity,那么在添加一个AppWidget

时,也会触发此方法。

onDelete(Context , int[] ):当AppWidget从AppWidgetHost中删除时,会触发此方法。

onEnabled(Context ):如果为一个应用添加了多个AppWidget,只有在第一个AppWidget被添加时,此方法才会被调用。

onDisabled(Context ):当一个应用的最后一个AppWidget从AppWidgetHost中删除时,会触发此方法。

onReceive(Context , Intent ):这实际上就是BroadcastReceiver中的方法,当任何一个Broadcast被接收到时,会调用此方法,并且会在以上回调方法之前被调用。

五、创建一个ConfigurationActivity(可选)

如果需要AppWidget添加的时候做一些配置工作,就可以使用Configuration Activity。要使用ConfigurationActivity首先需要像普通的Activity一样在AndroidManifest.xml中

进行声明:

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

只是这里需要添加action类型为android.appwidget.action.APPWIDGET_CONFIGURE的intent-filter。然后,需要在AppWidgetProviderInfo中进行声明:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  
    ...  
    android:configure="com.example.android.ExampleAppWidgetConfigure"   
    ... >  
</appwidget-provider>  

最后,当然是需要创建Activity了,在Configuration Activity中,需要执行一些必要的操作:

1、获取AppWidget ID

Intent intent = getIntent();  
Bundle extras = intent.getExtras();  
if (extras != null) {  
    mAppWidgetId = extras.getInt(  
            AppWidgetManager.EXTRA_APPWIDGET_ID,   
            AppWidgetManager.INVALID_APPWIDGET_ID);  
}  

2、进行必要的配置操作,获取AppWidgetManager实例、更新RemoteViews

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);  

RemoteViews views = new RemoteViews(context.getPackageName(),  
R.layout.example_appwidget);  
appWidgetManager.updateAppWidget(mAppWidgetId, views);  

3、设置Activity result,并且返回一个Intent。

Intent resultValue = new Intent();  
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);  
setResult(RESULT_OK, resultValue);  
finish();  

这样一个就创建好了一个Configuration Activity了。

注意android8.0以后无法收到发给自己的AppWidgetProvider,需要添加

intent.setComponent(new ComponentName(context,CacheProvider.class));
Intent intent = new Intent();
intent.setAction(ACTION_CACHE_CLEAN);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.setComponent(new ComponentName(context,CacheProvider.class));
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
                    0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.tv_clean, pendingIntent);

执行完上面的步骤,就已经创建了一个可以在桌面进行显示的AppWidget了。

以上就是Android开发之AppWidget详解的详细内容,更多关于Android AppWidget详解的资料请关注我们其它相关文章!

(0)

相关推荐

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

  • Android控件AppWidgetProvider使用方法详解

    介绍 AppWidgetProvider是Android中提供的用于实现桌面小工具的类,其本质是一个广播,即BroadcastReceiver,在实际的使用中,把AppWidgetProvider当成一个BroadcastReceiver即可 1. 为AppWidget提供一个文件定义小控件的基本配置信息 在资源文件夹res目录下新建xml文件夹,添加app_widget_provider_info.xml文件内容为: <?xml version="1.0" encoding=&

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

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

  • 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及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详解

    Android通知系统是它的一大特色,而其中,AppWidget是其中一个亮点.在开发应用的中,很多时候可以为其添加一个AppWidget显示在桌面中,及时方便的与用户进行 交互.这里就简单的熟悉一下开发一个AppWidget的流程吧. 想要在应用中创建一个AppWidget,至少需要以下几样东西: 需要创建一个AppWidgetProviderInfo,来描述AppWidget的元数据. 需要实现一个自己的AppWidgetProvider对AppWidget进行更新等操作. 需要布局文件来描

  • Android开发之Activity详解

    [Activity] 一个Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,例如拨号.拍照.发送email.看地图.每一个activity被给予一个窗口,在上面可以绘制用户接口.窗口通常充满屏幕,但也可以小于屏幕而浮于其它窗口之上. 一个应用程序通常由多个activities组成,他们通常是松耦合关系.通常,一个应用程序中的activity被指定为"main"activity,当第一次启动应用程序的时候呈现给用户的那个activity.每一个activ

  • Java微服务开发之Swagger详解

    目录 一.Swagger的作用和概念 1.Swagger 的优势 2.SwaggerUI 特点 2.SpringBoot集成Swagger 3.配置Swagger 4.实体配置 5.其他皮肤 一.Swagger的作用和概念 ​ 官方地址:https://swagger.io/ ​ Swagger 是一个规范且完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务以及 集成Swagger自动生成API文档. ​ Swagger 的目标是对 REST API 定义一个标准且和

  • IOS 开发之UISearchBar 详解及实例

    IOS UISearchBar 详解 iPhone开发之UISearchBar学习是本文要学习的内容,主要介绍了UISearchBar的使用,不多说,我们先来看详细内容.关于UISearchBar的一些问题. 1.修改UISearchBar的背景颜色 UISearchBar是由两个subView组成的,一个是UISearchBarBackGround,另一个是UITextField. 要IB中没有直接操作背景的属性.方法是直接将 UISearchBarBackGround移去 seachBar=

  • iOS开发之UITableView详解

    一.UITableView基本介绍 默认的UITableView有2种风格: UITableViewStylePlain(不分组) UITableViewStyleGrouped(分组) UITableView中的数据只有行的概念,没有列的概念,UITableView的每行数据就是一个UITableViewCell. 自带的UITableViewCell的类型选择有: 复制代码 代码如下: typedef NS_ENUM(NSInteger, UITableViewCellStyle) {   

  • iOS开发之UIScrollView详解

    介绍:UIScrollView用于在一个小范围里显示很大的内容的控件.通过用户平滑.手捏手势,在这个小区域里查看不同内容.是UITableView和UITextView的父类.它是视图,但是比较特殊,可以看成把它看成2层的结构.上面是它的frame层,跟一般试图一样,是它的可见区域,下面层是contentView,可以滑动. 父类UIView方法 复制代码 代码如下: // autoresizingMask - 现在基本弃用,改用autoLayout typedef NS_OPTIONS(NSU

  • Android开发之Android.mk模板的实例详解

    Android开发之Android.mk模板的实例详解 关于Android NDK开发的文章已经比较多了,我的博客中也分享了很多NDK开发相关经验和技巧,今天简单写了一个 Android.mk 的示例模板,供初学者参考. 本模板主要给大家示例 Android NDK 开发中的如下几个问题: 1. 如何自动添加需要编译的源文件列表   2. 如何添加第三方静态库.动态库的依赖   3. 如何构造一个完整的NDK工程框架 假设我们的项目依赖 libmath.a, libjson.a, libffmp

  • Android开发之Kotlin委托的原理与使用详解

    目录 前言 一.接口/类委托 二.属性委托 三.延迟委托 四.观察者委托 五.Map委托 总结 前言 在设计模式中,委托模式(Delegate Pattern)与代理模式都是我们常用的设计模式(Proxy Pattern),两者非常的相似,又有细小的区分. 委托模式中,委托对象和被委托对象都是同一类型的对象,委托对象将任务委托给被委托对象来完成.委托模式可以用于实现事件监听器.回调函数等功能. 代理模式中,代理对象与被代理对象是两种不同的对象,代理对象代表被代理对象的功能,代理对象可以控制客户对

  • Android开发之ContentProvider的使用详解

    前言         Content Provider为存储数据和获取数据提供了统一的接口,它可以完成在不同应用程序下的数据共享,而在上一篇文章Android开发之SQLite的使用方法讲到的SQLite只能在同一个程序中共享数据.另外android为一些常见的数据,比如说音频,视频,图片,通讯录等提供了Content Provider,这样我们就可以很方便的对这些类型的数据操作了.使用ContentProvider的好处是开发人员不需要考虑数据内部是怎么存储的,比如说如果我们想利用Conten

  • Android开发之Animations动画用法实例详解

    本文实例讲述了Android开发之Animations动画用法.分享给大家供大家参考,具体如下: 一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 Java Code代码中 AlphaAnimation 渐变透明度动画效果 ScaleAnimation 渐变尺寸

随机推荐