`

Android学习10-----Android组件通信 (8) 桌面显示组件:AppWidget

阅读更多

 

一、 AppWidget

在使用 Android 手机时,用户经常会将一些常使用的软件拖放到桌面上以方便操作。这时就需要使用 AppWidget 组件,在 android.appwidget 包综合那个定义了 5 个核心的操作类。

No.

类名称

描述

1

AppWidgetProvider

定义了 AppWidget 的基本操作,需要通过子类进行设置

2

AppWidgetProviderInfo

AppWidget 组件的元数据提供者,如组件的大小、更新时间等

3

AppWidgetHostView

创建 AppWidget View 显示,此为真正的 View ,与之对应的还有 RemoteView

4

AppWidgetHost

监听 AppWidget 的服务以及创建 AppWidgetHostView

5

AppWidgetManager

用于更新相应的 AppWidget

由于 AppWidget 要在桌面上显示界面,而这个界面又要通过 AppWidgetManager 程序进行控制,所以还需要使用一个 android.widget.RemoveViews 类,此类的主要功能是描述一个 View 的显示实体, RemoveViews 会通过进程间通信机制传递个 AppWidgetHost

这里的 RemoteViews 只是把一个进程的控件嵌入到另外一个进程中显示的一个方法,所有的事件处理操作依然在原始进程中,而 AppWidget 需要依靠 RemoveViews 来完成显示内容的更新操作, RemoveViews 常用方法有:

No.

方法

描述

1

Public RemoteViews(String packageName,int layoutId)

创建新的 RemoveViews 组件,并指定所需要的布局管理器文件

2

Public void addView(int viewId,RemoteViews nestedView)

RemoveViews 增加一个组件

3

Public void setXxx(int viewId,String methodName,Xxx value)

设置指定内容,如 setBoolean() setImageViewResource() setTextViewText()

4

Public void setOnClickPendingIntent(int viewId,PendingIntent pendingIntent)

设置单击事件触发之后要操作的 PendingIntent 对象

5

Public void setProgressBar(int viewId,int max,int progress,Boolean indeterminate)

设置要操作的 ProgressBar 组件

除了 RemoveViews 类作为远程 View 之外, Activity 程序中也提供了对应的 AppWidgetProvider 类用于与 RemoveView 组件的操作相对应,通过文档可以发现 AppWidgetProvider BroadcastReceiver 的子类,所以在使用时需要在 AndroidManifest.xml 中配置 receive 节点, AppWidgetProvider 类中也提供了像 Activity 类中的生命周期控制方法,其方法如下:

No.

方法

描述

1

Public void onDeleted(Context context,int[] appWidget)

删除 AppWidget 时触发

2

Public void onDisabled(Context context)

当最后一个 AppWidget 删除时触发

3

Public void onEnabled(Context context)

当第一个 AppWidget 启动时触发

4

Public void onReceive(Context context,Intent intent)

接受广播事件

5

Public void onUpdate(Context context,

AppWidgetManager appWidgetManger,

int[] appWidgetIds)

当指定的更新时间到达或者用户添加 AppWidget 时触发

注:

1 onUpdate 方法决定了 AppWidget 组件的显示功能以及远程 AppWidget 的事件处理绑定,当组件更新时,需要使用 AppWidgetManager 类更新远程 AppWidget 组件(严格说是 RemoveViews ),而 AppWidgetManager 会广播 Action 名称是“ android.appwidget.action.APPWIDGET_UPDATE ”的 Intent

2 、对于 onDisabled onEnabled 方法,因为 android 中一个程序可以同时在桌面上设置多个显示的组件。

MyAppWidget.java

package com.iflytek.demo;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;

public class MyAppWidget extends AppWidgetProvider {

	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {// 删除时触发
		System.out.println("*** MyAppWidget onDeleted");
		super.onDeleted(context, appWidgetIds);
	}

	@Override
	public void onDisabled(Context context) {// 删除最后一个触发
		System.out.println("*** MyAppWidget onDisabled");
		super.onDisabled(context);
	}

	@Override
	public void onEnabled(Context context) {// 启动第一个时触发
		System.out.println("*** MyAppWidget onEnabled");
		super.onEnabled(context);
	}

	@Override
	public void onReceive(Context context, Intent intent) {// 处理广播
		System.out.println("*** MyAppWidget onReceive");
		super.onReceive(context, intent);
	}

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {// 更新时触发
		System.out.println("*** MyAppWidget onUpdate");
		super.onUpdate(context, appWidgetManager, appWidgetIds);
	}

}

上面只是对AppWidgetProvider中的几个与生命周期有关的方法进行覆写,但是如果想让一个AppWidget程序进行显示,还需要定义一个设置桌面显示的配置文件,该文件保存在res\xml文件夹中。
xdwang_appwidget.xml.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:minHeight="80px"
	android:minWidth="300px"
	android:updatePeriodMillis="6000"
	android:initialLayout="@layout/xdwang_appwidget">
</appwidget-provider>

xdwang_appwidget.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"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/img"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <Button
        android:id="@+id/but"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="王旭东" />

</LinearLayout>

AndroidManifest.xml

<receiver android:name=".MyAppWidget" >

            <!-- AppWidget更新时触发 -->
            <intent-filter >
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <!-- 定义AppWidget的元数据 ,android:name:AppWidget提供者,android:resource程序要使用的配置信息 -->
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/xdwang_appwidget" />
        </receiver>

 

二、使用 AppWidget 跳转到 Activity 进行操作

前面我们简单描述了 AppWidget 程序的配置,但是在实际情况下,很多时候需要单击桌面显示的 AppWidget 可以进入一个 Activity 程序进行更加复杂的操作处理。这里我们首先来看看 AppWidgetManager 提供的方法:

No.

方法

描述

1

Public void updateAppWidget(int appWidgetId,RemoveViews views)

更新指定的 AppWidget 组件

2

Public void updateAppWidget(ComponentName provider,

RemoveViews views)

更新指定的 AppWidget 组件

3

Public void updateAppWidget(int[] appWidgetIds,RemoveViews views)

更新指定的 AppWidget 组件

4

Public static AppWidgetManager getInstance(Context context)

取得一个 AppWidgetManager 的实例

MyAppWidget.java

package com.iflytek.demo;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;

public class MyAppWidget extends AppWidgetProvider {
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {// 更新时触发
		for (int x = 0; x < appWidgetIds.length; x++) {// 更新所有显示的AppWidget
			Intent intent = new Intent(context, AppWidget02Activity.class);// 设置Activity
			PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
					intent, PendingIntent.FLAG_UPDATE_CURRENT);// 设置准备执行的Intent
			RemoteViews remote = new RemoteViews(context.getPackageName(),
					R.layout.xdwang_appwidget);// 更新要操作的RemoveViews
			remote.setOnClickPendingIntent(R.id.but, pendingIntent);
			appWidgetManager.updateAppWidget(appWidgetIds[x], remote);// 更新远程的视图
		}
	}

}

三、使用AppWidget进行广播
MyAppWidget.java

package com.iflytek.demo;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;

public class MyAppWidget extends AppWidgetProvider {

	@Override
	public void onReceive(Context context, Intent intent) {
		if ("com.iflytek.action.MYAPPWIDGET_UPDATE".equals(intent.getAction())) {// 判断是否是指定的Action
			RemoteViews remote = new RemoteViews(context.getPackageName(),
					R.layout.xdwang_appwidget);// 定义RemoveViews
			remote.setImageViewResource(R.id.img, R.drawable.ic_launcher);// 设置图片
			remote.setTextViewText(R.id.but, "王旭东改变");// 更新组件文字
			AppWidgetManager appWidgetManager = AppWidgetManager
					.getInstance(context);// 取得AppWidgetManager
			ComponentName componentName = new ComponentName(context,
					MyAppWidget.class);// 定义使用的组件
			appWidgetManager.updateAppWidget(componentName, remote);// 更新组件
		} else {
			super.onReceive(context, intent); // 如果不写此代码,表示无法调用onUpdate()
		}
	}

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		Intent intent = new Intent();// 设置操作要执行的Intent
		intent.setAction("com.iflytek.action.MYAPPWIDGET_UPDATE");
		PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
				intent, PendingIntent.FLAG_UPDATE_CURRENT);// 设置准备执行的Intent
		RemoteViews remote = new RemoteViews(context.getPackageName(),
				R.layout.xdwang_appwidget);// 定义要操作的RemoveViews
		remote.setOnClickPendingIntent(R.id.but, pendingIntent);
		appWidgetManager.updateAppWidget(appWidgetIds, remote);// 更新远程视图
	}

}

AndroidManifest.xml

<receiver android:name=".MyAppWidget" >
            <intent-filter >
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <intent-filter >
                <action android:name="com.iflytek.action.MYAPPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/xdwang_appwidget" />
        </receiver>

 

分享到:
评论

相关推荐

    Android -- AppWidget源码.zip

    在Android系统中,AppWidget是桌面小部件的实现,它允许开发者将应用程序的功能和信息集成到用户的主屏幕上,用户无需打开应用即可与之交互。这个压缩包“Android -- AppWidget源码.zip”很可能是包含了Android App...

    android AppWidget ListView

    在Android开发中,AppWidget是桌面小部件,它允许开发者将应用程序的功能直接集成到用户的主屏幕上,无需打开应用。在本案例中,我们探讨的是如何在AppWidget中使用ListView,这是一个增强用户交互的方式,使小部件...

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

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

    Android高级应用源码-Android小部件AppWidget.zip

    在Android平台上,AppWidget是应用程序可以提供的一种桌面小部件,让用户在主屏幕上获得快速的交互体验,无需打开完整的应用程序。这个“Android高级应用源码-Android小部件AppWidget.zip”包含了一个关于如何创建和...

    android widget

    - `appwidget-provider.xml`文件定义了Widget的元数据,包括最小尺寸、更新频率等。 10. **AndroidManifest.xml配置**: - 需要在这里注册AppWidgetProvider,并关联其对应的布局和配置文件。 11. **测试和调试...

    android安卓app开发之widget界面控件使用教程.zip

    了解了基本概念后,开发者可以通过阅读《Android 之桌面组件 App Widget 案例》、《Android Launcher开发之桌面小部件AppWidget详解》以及相关的博客文章来深入学习。这些资料提供了丰富的实例和代码解析,帮助理解...

    appWidget启动Service

    在Android开发中,AppWidget是桌面小部件,它允许用户在主屏幕上与应用程序进行交互,而无需实际打开应用。Service是Android系统中的一个组件,它可以在后台长时间运行,执行一些耗时的操作,如音乐播放、数据同步等...

    android之appwidget

    AppWidget是Android操作系统提供的一种组件,允许开发者在用户主屏幕上创建小型应用程序,这些小部件无需用户直接启动应用就能显示和交互。AppWidget为用户提供了一种快速访问应用功能的方式,增强了用户体验。本文...

    android 桌面小窗口 widget demo

    &lt;action android:name="android.appwidget.action.APPWIDGET_UPDATE" /&gt; &lt;/intent-filter&gt; &lt;meta-data android:name="android.appwidget.provider" android:resource="@xml/app_widget_info" /&gt; ``` **步骤四...

    Android小部件AppWidget-IT计算机-毕业设计.zip

    【Android小部件AppWidget】是Android操作系统中的一种特殊组件,它允许用户在主屏幕上放置小型的应用程序界面元素,提供快捷的操作或显示实时信息。在Android应用开发中,AppWidget是扩展应用程序功能的一种方式,...

    AppwidgetTest.

    在Android开发中,AppWidget是桌面小部件,它允许用户在主屏幕上添加应用程序的功能或信息概览,无需打开应用程序本身。AppWidgetTest项目显然旨在演示如何创建和管理这些小部件。接下来,我们将深入探讨AppWidget...

    桌面小部件AppWidget的使用

    在Android系统中,AppWidget是桌面小部件的实现方式,它允许开发者创建可以在用户主屏幕上显示的小应用程序。这些小部件可以提供快速访问某些功能或显示实时信息,无需打开完整的应用程序。本篇将深入探讨如何使用...

    AppWidget桌面小控件

    需要在AndroidManifest.xml中通过&lt;appwidget-provider&gt;标签声明。 4. **实现AppWidgetProvider类**: 重写`onUpdate()`、`onDeleted()`、`onEnabled()`等方法,以处理用户添加、删除或交互时的事件。例如,在`on...

    关于android AppWidget初探①

    Android AppWidget是Android系统提供的一种桌面小部件功能,它允许开发者创建可以被用户直接放置在主屏幕上的小型应用程序,提供快捷的功能或者展示实时信息。在本文中,我们将深入探讨AppWidget的基本概念、工作...

    安卓开发-android Widget小组件开发.zip.zip

    AppWidget是可以在主屏幕上独立显示的应用程序组件,而Shortcut则是指向特定应用或活动的快捷方式。我们将主要讨论AppWidget的开发。 1. **AppWidgetProvider**:这是Widget的核心类,它继承自BroadcastReceiver。...

    安卓开发-Android小部件AppWidget.zip

    - **配置元数据**: 在AndroidManifest.xml中为添加appwidget-provider标签,设置小部件的属性,如最小宽度、高度、初始配置等。 - **发布小部件**: 用户通过长按主屏幕,选择“小部件”类别,然后选择你的AppWidget...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    安卓Android源码——安卓Android小部件AppWidget.zip

    通过学习这份源码,开发者不仅能掌握AppWidget的基本使用,还能深入理解Android系统如何处理和显示这些组件,从而提升应用的用户体验。同时,了解AppWidget的内部机制有助于在实际项目中设计出更高效、更用户友好的...

    android 组件通信

    本篇文章将深入探讨“Android组件通信”这一主题,特别是聚焦于AppWidget与Activity间的跳转以及数据传输。 首先,我们要理解Android组件的基本概念。Activity是用户界面的主要载体,它负责展示用户可以互动的视图...

    android widget实例下载

    Android小部件(Widget)是Android操作系统提供的一种桌面扩展功能,允许开发者将应用程序的部分功能或信息直接集成到用户的主屏幕上,用户无需打开应用就能与之交互。在这个“android widget实例下载”中,我们可以...

Global site tag (gtag.js) - Google Analytics