Android 桌面组件【widget】初探

摘要:
以下是本文的概要:1.AppWidget框架类。2.如何在Android中使用Widgets。3.AppWidget框架的主要类介绍。4.演示说明。1.AppWidget框架类。1.AppWidgetProvider:继承自BroadcastReceiver。它在更新、启用、禁用和删除AppWidget应用程序时接收通知。其中,onUpdate和onReceive是最常用的接收更新通知的方法。

转自:http://www.cnblogs.com/TerryBlog/archive/2010/07/29/1788319.html

本来打算晚上继续 Api Demos 系列的,不过今天下午的时候无聊去玩了一下桌面组件 App Widget 觉得挺不错的一个东西,对它很是感兴趣,玩了一下碰到很多问题,一直在解决问题到了晚上10点。只能怪自己理解不深刻,不过最后还是解决了,把一些领悟写出来也算给自己一个交代。下面是本篇的大纲:

  • 1、AppWidget 框架类
  • 2、在 Android 如何使用 Widget
  • 3、AppWidget 框架的主要类介绍
  • 4、DEMO 讲解

1、AppWidget 框架类

  • 1、AppWidgetProvider :继承自 BroadcastRecevier , 在AppWidget 应用 update、enable、disable 和 delete 时接收通知。其中,onUpdate、onReceive 是最常用到的方法,它们接收更新通知。
  • 2、 AppWidgetProvderInfo:描述 AppWidget 的大小、更新频率和初始界面等信息,以XML 文件形式存在于应用的 res/xml/目录下。
  • 3、AppWidgetManger :负责管理 AppWidget ,向 AppwidgetProvider 发送通知。
  • 4、RemoteViews :一个可以在其他应用进程中运行的类,向 AppWidgetProvider 发送通知。

2、在 Android 如何使用 Widget

  • 1、长按主界面
    Android 桌面组件【widget】初探第1张
  • 2、之后弹出一个对话框,里面就有android 内置的一些桌面组件
    Android 桌面组件【widget】初探第2张

 3、AppWidget 框架的主要类介绍

 1) AppWidgetManger 类

2) 继承自 AppWidgetProvider 可实现的方法为如下:

4、Demo讲解

下面是我今天做的一个实例,提供给大家练习时做参考,效果如下:在布局中放一个 TextView 做桌面组件,然后设置TextView 的 Clickable="true" 使其有点击的功能,然后我们点击它时改变它的字体,再点击时变回来,详细操作如下流程:

  • 1、新建AppWidgetProvderInfo
  • 2、写一个类继承自AppWidgetProvider
  • 3、后台注册Receiver
  • 4、使 AppWidget 组件支持点击事件
  • 5、如何使TextView 在两种文本间来回跳转

问题抛出来了,那么一起解决它吧。

1、新建AppWidgetProvderInfo

代码如下:

复制代码
Android 桌面组件【widget】初探第4张
<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth
="60dp"
    android:minHeight
="30dp"
    android:updatePeriodMillis
="86400000"
     
    android:initialLayout
="@layout/main">
</appwidget-provider>
复制代码

Tip:上文说过AppWidgetProvderInfo 是在res/xml 的文件形式存在的,看参数不难理解,比较重要的是这里android:initialLayout="@layout/main" 此句为指定桌面组件的布局文件。

2、写一个类继承自AppWidgetProvider

主要代码如下:

public class widgetProvider extends AppWidgetProvider

并重写两个方法

@Override
    
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            
int[] appWidgetIds) {}

@Override
    
public void onReceive(Context context, Intent intent) {}

Tip:onUpdate 为组件在桌面上生成时调用,并更新组件UI,onReceiver 为接收广播时调用更新UI,一般这两个方法是比较常用的。

3、后台注册Receiver

后台配置文件代码如下:

复制代码
<receiver android:name=".widgetProvider">
            
<meta-data android:name="android.appwidget.provider"
                android:resource
="@xml/appwidget_provider"></meta-data>
            
<intent-filter>
                
<action android:name="com.terry.action.widget.click"></action>
                
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                 
            
</intent-filter>
        
</receiver>
复制代码

Tip:因为是桌面组件,所以暂时不考虑使用Activity 界面,当然你在实现做项目时可能会需要点击时跳转到Activity 应用程序上做操作,典型的案例为Android  提供的音乐播放器。上面代码中比较重要的是这一句 <meta-data android:name="android.appwidget.provider"  android:resource="@xml/appwidget_provider"></meta-data>  大意为指定桌面应用程序的AppWidgetProvderInfo  文件,使其可作其管理文件。

4、使 AppWidget 组件支持点击事件

先看代码:

 

复制代码
public static void updateAppWidget(Context context,
            AppWidgetManager appWidgeManger, 
int appWidgetId) {
        rv 
= new RemoteViews(context.getPackageName(), R.layout.main);
        Intent intentClick 
= new Intent(CLICK_NAME_ACTION);
        PendingIntent pendingIntent 
= PendingIntent.getBroadcast(context, 0,
                intentClick, 
0);
        rv.setOnClickPendingIntent(R.id.TextView01, pendingIntent);
        appWidgeManger.updateAppWidget(appWidgetId, rv);
    }
复制代码

此方法为创建组件时 onUpdate 调用的更新UI的方法,代码中使用RemoteView 找到组件的布局文件,同时为其设置广播接收器CLICK_NAME_ACTION并且通过RemoteView 的setOnClickPendingIntent 方法找到我想触发事件的TextView 为其设置广播。接着

复制代码
@Override
    
public void onReceive(Context context, Intent intent) {
        
// TODO Auto-generated method stub
        super.onReceive(context, intent);

        
if (rv == null) {
            rv 
= new RemoteViews(context.getPackageName(), R.layout.main);
        }
        
if (intent.getAction().equals(CLICK_NAME_ACTION)) {
            
if (uitil.isChange) {
                rv.setTextViewText(R.id.TextView01, context.getResources()
                        .getString(R.string.load));

            } 
else {
                rv.setTextViewText(R.id.TextView01, context.getResources()
                        .getString(R.string.change));

            }
            Toast.makeText(context, Boolean.toString(uitil.isChange),
                    Toast.LENGTH_LONG).show();
            uitil.isChange 
= !uitil.isChange;

        }
        AppWidgetManager appWidgetManger 
= AppWidgetManager
                .getInstance(context);
        
int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName(
                context, widgetProvider.
class));
        appWidgetManger.updateAppWidget(appIds, rv);
    }
复制代码

在onReceiver 中通过判断传进来的广播来触发动作。

5、如何使TextView 在两种文本间来回跳转

如何 TextView 在来两种状态中来回呢?这也是我比较调试最久的一个难点,问题出在对 AppWidget 的理解不够深入。 如果我的设想没错的话AppWidget 的生命周期应该在每接收一次广播执行一次为一个生命周期结束,也就是说你在重写的 AppWidgetProvider 类里面声明全局变量做状态判断,每次状态改变AppWidgetProvider 再接收第二次广播时即为你重新初始化也就是说桌件为你重新实例化了一次AppWidgetProvider 。今天我因为在里面放了一个boolean 值初始化为true ,观察调试看到每次进入都为TRUE 故你在设置桌面组件时,全局变量把它声明在另外一个实体类用来判断是没问题的,切忌放在本类。代码参考onReceiver方法。

效果图如下:

Android 桌面组件【widget】初探第12张

代码:

Android 桌面组件【widget】初探第13张代码

源码下载:/Files/TerryBlog/widget.rar

免责声明:文章转载自《Android 桌面组件【widget】初探》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android M 控件:Snackbar、Toolbar、TabLayout、NavigationViewdocker常规操作——启动、停止、重启容器实例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Neo4J图库的基础介绍(二)-图库开发应用

我们接着Neo4J图库的基础介绍(一)继续介绍Neo4J图库。 JAX-RS是一个用于构建REST资源的Java API,可以使用JAX-RS注解装饰每一个扩展类,从而让服务器处理对应的http请求,附加注解可以用来控制请求和响应的格式,http头和URI模板的格式。 下面看一个服务器扩展实现的示例,允许客户端请求社交网络的两个成员之间的距离 @Pa...

spring启动过程

首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境; 其次,在web.xml中会提供有contextLoaderListener。在web容器启动时,会触发容器初始化事件,此时contextLoaderListener会监听到这个...

Android开发——Android搜索框架(二)

上一篇:Android开发——Android搜索框架(一) 距离上一篇文章有段时间了,唉。 接着上一篇文章,现在说说如何在搜索的时候弹出搜索历史提示。 1.创建搜索建议提供者 Android已经为我们创建了一个默认的,我们只需要继承 SearchRecentSuggestionProvider 就稍做修改就可以了。 见代码: 1: import andr...

Android:JNI与NDK(二)交叉编译与动态库,静态库

  欢迎关注公众号,第一时间获取最新文章:   本篇目录 一、前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,linux操作系统基本是同样适用的。 交叉编译就是在A平台编译出可以在B平台执行的文件,对于我们安卓开发者来说交叉编译就是在window或者mac或者...

ASP.NET Core WebApi + EF Core(实现增删改查,使用Swagger测试API)

EF有两个不同版本,即Entity Framework Core 和 Entity Framework 6 EF Core:轻量级,可扩展,跨平台,参考EF6,全新平台,学习曲线小,引入一些新功能(批量删除) EF 6 :笨重,稳定,微软已经不打算进行大版本升级,无法跨平台。 如何实现EF Core功能 1、创建ASP.NET Core Web应用程序 ...

客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析

原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓。 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样式表来讲,美化Winform的界面以及自定义控件是需要耗费更多的时间的。 WPF 基于XML+C#+CSS的呈现方式让它在UI上有了更加灵活的设计宽度 WPF...