`
he91_com
  • 浏览: 410336 次
文章分类
社区版块
存档分类
最新评论

桌面组件widget

 
阅读更多

前几天学习下了桌面组件开发,现将学习心得跟大家交流下,欢迎探讨!

一、 概述

要进行桌面组件Widget开发,首先要了解AppWidget框架结构。AppWidget是Android 1.5平台推出的一种崭新的应用程序框架。基于AppWidget框架,开发人员可以在OPhone及模拟器上开发形似传统widget的小应用程序,并将其嵌入到其他应用中。

二、AppWidet框架

1、AppWidgetProvider :继承自 BroadcastRecevier , 在AppWidget 应用 update、enable、disable 和 delete 时接收通知。其中,onUpdate、onReceive 是最常用到的方法,它们接收更新通知。 下面对AppWidgetProvider类常用到的方法进行介绍:

(1)onDeleted(Context context, int[]appWidgetIds)

(2)onDisabled(Context context)

(3)onEnabled(Context context)

(4)onReceive(Context context, Intentintent)

Tip:因为 AppWidgetProvider 是继承自BroadcastReceiver 所以可以重写onRecevie 方法,当然必须在后台注册Receiver

(5)onUpdate(Context context,AppWidgetManager appWidgetManager, int[] appWidgetIds)

2、 AppWidgetProvderInfo:描述 AppWidget 的大小、更新频率和初始界面等信息,以XML 文件形式存在于应用的res/xml/目录下。

3、AppWidgetManger :负责管理 AppWidget ,向 AppwidgetProvider 发送通知。 下面对AppWidgetManger 类中主要方法进行介绍:

(1)bindAppWidgetId(int appWidgetId,ComponentName provider)

通过给定的ComponentName 绑定appWidgetId

(2)getAppWidgetIds(ComponentNameprovider)

通过给定的ComponentName 获取AppWidgetId

(3)getAppWidgetInfo(int appWidgetId)

通过AppWidgetId 获取 AppWidget 信息

(4)getInstalledProviders()

返回一个List<AppWidgetProviderInfo>的信息

(5)getInstance(Context context)

获取 AppWidgetManger 实例使用的上下文对象

(6)updateAppWidget(int[] appWidgetIds,RemoteViews views)

通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件

(7)updateAppWidget(ComponentNameprovider, RemoteViews views)

通过 ComponentName 对传进来的 RemoeteView 进行修改,并重新刷新AppWidget 组件

(8)updateAppWidget(int appWidgetId,RemoteViews views)

通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件

4、RemoteViews :一个可以在其他应用进程中运行的类,向 AppWidgetProvider 发送通知。这是构造AppWidet的核心。

三、Widget示例:WidgetDemo

下面改写一个倒计时Demo,该Widget背景图能定时更新。

先看下程序运行效果图:

1、 新建一个Android工程,命名为WidgetDemo

2、 修改string.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="hello">Hello World, WidgetDemo!</string>

    <string name="app_name">DaysToMay1ST</string>

</resources>


3、 修改main.xml布局文件。

由于Widget是一个实现在桌面的小应用程序,对UI的设计要求高,其中包括大小的计算和界面是否适合屏幕的布局等。所以首先要建立RemoteViews对应的布局文件main.xml。

代码如下:

<?xml version="1.0"encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:background="@drawable/sunset"

    >

<TextView

    android:id="@+id/may1st"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/hello"

    android:textSize="12px"

    android:textColor="#ff0000"

    />

</LinearLayout>



4、 建立Widget内容提供者文件。我们在res下建立xml文件夹,并且新建一个widget_provider.xml代码如下:

<?xml version="1.0"encoding="utf-8"?>

<appwidget-provider

  xmlns:android="http://schemas.android.com/apk/res/android"

  android:minWidth="50dip"   

  android:minHeight="50dip"   

  android:updatePeriodMillis="10000"   

  android:initialLayout="@layout/main"

  >

</appwidget-provider>

 
5、 修改WidgetDemo.java代码如下:
package com.android.rui; 

import java.util.Calendar;    

import java.util.Date;    

import java.util.GregorianCalendar;    

import java.util.Timer;    

import java.util.TimerTask;    

import android.appwidget.AppWidgetManager;    

import android.appwidget.AppWidgetProvider;    

import android.content.ComponentName;    

import android.content.Context;    

import android.widget.RemoteViews;    

public class WidgetDemo extends AppWidgetProvider {    

/** Called when the activityis first created. */            

    @Override   

    public void onUpdate(Context context, AppWidgetManagerappWidgetManager,    

        int[] appWidgetIds){    

            

            Timer timer = new Timer();    

           timer.scheduleAtFixedRate(new MyTime(context,appWidgetManager), 1, 60000);    

            super.onUpdate(context,appWidgetManager, appWidgetIds);    

        }                        

        private class MyTime extends TimerTask{    

            RemoteViews remoteViews;    

            AppWidgetManager appWidgetManager;    

            ComponentName thisWidget;    

                

            public MyTime(Contextcontext,AppWidgetManager appWidgetManager){    

                this.appWidgetManager =appWidgetManager;   

                switch(Declare.i)//让widget背景图定时变换              
                {
                case 1:
                    remoteViews = new RemoteViews(context.getPackageName(),R.layout.main1);
                    Declare.i++;
                    break;
                case 2:
                    remoteViews = new RemoteViews(context.getPackageName(),R.layout.main2);
                    Declare.i++;
                    break;
                case 3:
                    remoteViews = new RemoteViews(context.getPackageName(),R.layout.main3);
                    Declare.i++;
                    break;
                default:                    
                    remoteViews = new RemoteViews(context.getPackageName(),R.layout.main);
                    Declare.i=0;
                    Declare.i++;
                    break;
                }                    

                thisWidget = newComponentName(context,WidgetDemo.class);    

            }            

            public void run() {    

                    

                Date date = new Date();    

                Calendarcalendar = new GregorianCalendar(2011,05,01);    

                long days =(((calendar.getTimeInMillis()-date.getTime())/1000))/86400-30;    

                remoteViews.setTextViewText(R.id.may1st, "距离五一假期还有" + days+"天");    

                appWidgetManager.updateAppWidget(thisWidget, remoteViews);    

                    

            }    

                

        }     

}

6、 修改配置文件AndroidManifest.xml文件。

由于使用了reciever和“android.appwidget.action.APPWIDGET_UPDATE”,所以需要在AndroidManifest.xml中进行注册。

代码如下:

<?xml version="1.0"encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

      package="com.android.rui"

     android:versionCode="1"

     android:versionName="1.0">

    <application android:icon="@drawable/icon"android:label="@string/app_name">

        <receiver android:name=".WidgetDemo"   

                 android:label="@string/app_name">    

                <intent-filter>    

                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>    

            </intent-filter>    

            <meta-data android:name="android.appwidget.provider"   

                           android:resource="@xml/widget_provider"   

                />    

            </receiver> 

 


四、Widget事件处理

在以上五一假期倒计时的DEMO中只是更新显示了一个界面。在Widget中同样可以通过setOnClickPendingIntent方法来监听一个事件的处理。

比如:当我们点击一个”widget_button”按钮时,会弹出一个Toast提示。主要代码如下:

public class widget extends AppWidgetProvider

{

    public void onReceive(Context context,Intent intent)

    {

    super.onReceive(context,intent);

    if(intent.getAction().equals("com.android.myapp.widget.CLICK"))

    {

        Toast.makeText(context,"It works!",Toast.LENGTH_SHORT).show();

    }

    }

   

    public void onUpdate(Context context, AppWidgetManagerappWidgetManager,int[] appWidgetIds) {

        final int N = appWidgetIds.length;

        for (int i = 0; i < N; i++) {

            int appWidgetId = appWidgetIds[i];

            RemotesViews rv = new RemoteViews(context.getPackageName(),R.layout.main);

            Intent intentClick = new Intent("com.android.myapp.widget.CLICK");

            PendingIntent pendingIntent =PendingIntent.getBroadcast(context, 0,intentClick, 0);

            rv.setOnClickPendingIntent(R.id.widget_button,pendingIntent);

           appWidgetManager.updateAppWidget(appWidgetId, rv);

        }

    }

}
Tip: "com.android.myapp.widget.CLICK"事件需要在AndroidManifext.xml文件中声明,声明方式同上面的"android.appwidget.action.APPWIDGET_UPDATE"。

五、Widget启动Activity

在Widget中同样可以启动一个Activity,比如Android自带的音乐播放器,当我们添加一个音乐播放器桌面小部件并点击”button”时就开启一个Activity来显示播放音乐的界面。

通过如下代码即可以启动一个Activity:

RemoteViews rv=newRemoteViews(context.getPackageName(),R.layout.mywidget);

Intent intentActivity=new Intent(context,MusicPlayer.class);

PendingIntentpendingIntentActivity=PendingIntent.getActivity(context, 0, intentActivity, 0);

rv.setOnClickPendingIntent(R.id.button,pendingIntentActivity);

appWidgetManager.updateAppWidget(appWidgetId,rv);
当我们点击”button”按钮时就可以启动指定的Activity了,代码如下:

context.startActivity(intentActivity);

六、Widget启动Service

Widget还可以启动一个服务。比如Android自带的音乐播放器,要播放音乐肯定需要使用service在后台播放,所以就需要在音乐播放器桌面小部件中启动一个service。使用下面方法可以在Widget中启动一个Service:

RemoteViews rv=new RemoteViews(context.getPackageName(),R.layout.mywidget);

Intent intentService=new Intent(“Service名”);

context.startService(intentService);

appWidgetManager.updateAppWidget(appWidgetId,rv);


分享到:
评论

相关推荐

    Android开发教程之桌面组件【widget】初探--千锋培训

    在Android开发中,桌面组件(Widget)是一种可以让用户在手机或平板电脑的主屏幕上直接查看和操作的应用小部件。本文将深入探讨如何在Android中创建和使用Widget,以及相关的框架类和方法。 首先,我们来看App...

    android 桌面组件 App widget的使用 AppWidgetProvider

    Android 桌面组件,又称为 App Widget,是 Android 系统中一种独特且实用的功能。它允许开发者创建小型的应用程序界面,用户可以直接在主屏幕上进行交互,无需打开完整的应用程序。App Widget 提供了一种快捷的方式...

    安卓桌面时钟widget代码

    3. **RemoteViews**: 这是用来构建Widget UI的主要工具,它可以用来设置布局、文字、图片等组件。在这个时钟Widget中,开发者会用RemoteViews来创建和更新显示时间的大字体时钟和日期信息。 4. **AlarmManager**: ...

    安卓 android 日历 桌面组件

    在安卓(Android)操作系统中,桌面组件(Widget)是一种用户界面功能,允许用户将应用程序的部分功能直接放置在手机或平板电脑的主屏幕上,以便快速访问和操作。日历桌面组件是这种功能的一个典型示例,它使用户...

    Android-Android桌面小部件widget日签Or日历可作为桌面日历

    在Android平台上,开发者可以利用Android桌面小部件(Widget)功能为用户提供便捷的桌面服务,比如“Android桌面小部件widget日签Or日历可作为桌面日历”就是一个很好的例子。这个应用设计巧妙,不仅展示了日期,还...

    Android桌面小组件(AppWidget)

    在Android系统中,桌面小组件(AppWidget)是一种允许用户在主屏幕上与应用程序进行交互的UI元素。它们提供了一种快捷的方式,使用户无需打开应用就能获取信息或执行某些操作。"Android桌面小组件(AppWidget)"这个...

    Android 桌面组件【app widget】 进阶项目--心情记录器

    在这个进阶项目“Android桌面组件【app widget】—心情记录器”中,我们将深入探讨如何创建一个能够帮助用户便捷记录和展示心情的小部件。 首先,我们需要理解App Widget的基本构成。一个App Widget通常包含以下几...

    Android桌面插件-时钟widget

    本主题聚焦于"Android桌面插件-时钟widget",这是一个非常实用且常见的组件,它能为用户提供即时的时间显示,甚至支持多时区时间查看。 时钟Widget是Android系统中的一个核心组件,开发者可以通过自定义实现来提供...

    安卓Widget小组件相关-Widget安卓桌面小组件.rar

    “Widget 安卓桌面小组件.rar”可能包含示例代码、布局文件、资源文件等,可以帮助开发者了解如何创建和实现一个基本的安卓Widget。如果你遇到问题,比如程序无法运行,可能需要自行调试和调整代码,以适应你的具体...

    android 桌面小窗口 widget demo

    Android 桌面小窗口,通常被称为Widget,是Android操作系统提供的一种特性,允许开发者创建可以在用户主屏幕上的小应用程序。这些小窗口可以显示实时信息,如天气、新闻、日历事件,甚至提供简单的交互功能。在本篇...

    Widget 安卓桌面小组件

    Android 小组件(Widget)是安卓操作系统中的一种特色功能,它允许用户在手机或平板电脑的主屏幕上放置各种应用程序的快捷方式或者简化的交互界面,以便快速访问或操控应用功能,而无需每次都打开完整的应用程序。...

    Android桌面组件App Widget完整案例

    本文实例讲述了Android桌面组件App Widget用法。分享给大家供大家参考。具体如下: 这里模拟一个案例:把AppWidget添加到桌面后,点击AppWidget后AppWidget文本会轮回改变 main.xml布局文件: &lt;?xml version=1.0...

    安卓Widget小组件相关-androidWidget小组件开发.zip

    - 用户可以通过长按主屏幕,选择添加Widget来放置到桌面,提供便捷的操作。 2. **创建Widget** - 在Android Studio中创建一个新的Android项目,然后添加一个新的Android Widget组件。 - 需要定义一个继承自`...

    Android心情记录器(App widget 桌面组件)应用例子.rar

    可将你的心情讯录并用桌面组件的形式展示于桌面上,并有丰富的表情可供选择并加载在桌面上,此功能类似于QQ上的各性签名,可以看到手机主人的心情状况不是很好,注:因为这个小程序完全是App widget 桌面组件,所以...

    高仿墨迹天气桌面组件

    【标题】"高仿墨迹天气桌面组件"是一款模仿知名应用墨迹天气的桌面插件,它能够为用户提供直观、美观的天气信息展示,并且具备翻页时钟功能,为用户的手机桌面增添实用性和观赏性。 【核心知识点】 1. **AppWidget*...

    android 桌面控件appwidget

    Android 桌面控件(AppWidget)是Android操作系统提供的一种独特功能,允许开发者创建可以在用户主屏幕上显示的小型应用程序组件。这些控件通常提供快速访问应用的核心功能或展示实时信息,如天气预报、日历事件或...

    android天气预报的桌面widget

    Android桌面Widget是Android应用组件之一,它类似于一个小应用程序,可以被放置在用户的主屏幕上,为用户提供快捷的操作或信息展示。它们通过AppWidgetProvider类与系统交互,并使用RemoteViews来更新其内容。 创建...

    安卓Widget小组件相关-WidgetTest.zip

    【Android Widget小组件详解】 Android Widget是Android系统中一种特殊的应用组件,允许...尽管并非所有代码都能直接运行,但通过对这些源码的分析和研究,开发者可以深入掌握如何设计和实现自己的Android桌面小组件。

    Android Widget组件开发

    在Android应用开发中,Widget组件是用户界面的一个重要组成部分,它允许开发者将应用程序的功能和信息直接展示在用户的桌面或通知栏上,无需打开应用程序。Widget提供了便捷的方式,让用户可以快速交互,增强了用户...

    android桌面天气widget+GPS

    Android小部件(Widget)是用户界面的一种组件,可以直接在用户的主屏幕上展示信息,无需打开应用程序。它们通常用于提供快速操作或简化的视图,比如天气、日历事件或音乐播放器控制。创建一个天气Widget需要以下几...

Global site tag (gtag.js) - Google Analytics