`

AppWidgetProvider 应用

 
阅读更多

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、长按主界面

2、之后弹出一个对话框,里面就有android 内置的一些桌面组件



3、AppWidget 框架的主要类介绍

1) AppWidgetManger 类

bindAppWidgetId(int appWidgetId, ComponentName provider)
通过给定的ComponentName 绑定appWidgetId
getAppWidgetIds(ComponentName provider)
通过给定的ComponentName 获取AppWidgetId
getAppWidgetInfo(int appWidgetId)
通过AppWidgetId 获取 AppWidget 信息
getInstalledProviders()
返回一个List<AppWidgetProviderInfo>的信息
getInstance(Context context)
获取 AppWidgetManger 实例使用的上下文对象
updateAppWidget(int[] appWidgetIds, RemoteViews views)
通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件
updateAppWidget(ComponentName provider, RemoteViews views)
通过 ComponentName 对传进来的 RemoeteView 进行修改,并重新刷新AppWidget 组件
updateAppWidget(int appWidgetId, RemoteViews views)
通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件
2) 继承自 AppWidgetProvider 可实现的方法为如下:

1、onDeleted(Context context, int[] appWidgetIds)
2、onDisabled(Context context)
3、onEnabled(Context context)
4、onReceive(Context context, Intent intent)
Tip:因为 AppWidgetProvider 是继承自BroadcastReceiver  所以可以重写onRecevie 方法,当然必须在后台注册Receiver
5、onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
4、Demo讲解

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

1、新建AppWidgetProvderInfo
2、写一个类继承自AppWidgetProvider
3、后台注册Receiver
4、使 AppWidget 组件支持点击事件
5、如何使TextView 在两种文本间来回跳转
问题抛出来了,那么一起解决它吧。

1、新建AppWidgetProvderInfo

代码如下:




<?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方法。

效果图如下:





代码:



package com.terry;

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;
import android.widget.Toast;

public class widgetProvider extends AppWidgetProvider {
    private static final String CLICK_NAME_ACTION = "com.terry.action.widget.click";

    private static RemoteViews rv;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // TODO Auto-generated method stub
        final int N = appWidgetIds.length;
        for (int i = 0; i < N; i++) {
            int appWidgetId = appWidgetIds[i];
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    @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);
    }

    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);
    }
}

分享到:
评论

相关推荐

    Android AppWidgetProvider使用简例

    AppWidget是可以在用户主屏幕上显示的小部件,通常提供快捷方式或者简单的信息展示功能,无需打开应用程序即可与之交互。本教程将详细介绍如何使用AppWidgetProvider创建一个简单的Android桌面小工具。 首先,我们...

    android AppWidgetProvider例程(MP3播放)

    在Android平台上,AppWidgetProvider是实现桌面小部件(App Widget)功能的核心类。App Widgets是Android系统中一种轻量级的应用程序组件,用户可以将它们添加到主屏幕上,以提供快速访问或控制应用的功能,无需打开...

    android 桌面组件 App widget的使用 AppWidgetProvider

    它允许开发者创建小型的应用程序界面,用户可以直接在主屏幕上进行交互,无需打开完整的应用程序。App Widget 提供了一种快捷的方式,使得用户可以快速访问或操作应用中的关键功能。在本文中,我们将深入探讨 App ...

    AppWidgetProvider

    【AppWidgetProvider】是Android系统中的一个重要组件,它是Android应用小部件(App Widget)的核心类。App Widget允许开发者在用户的主屏幕上创建可交互的小应用程序,为用户提供快速访问或操作应用的功能,无需...

    基于Android系统的AppWidgetProvider分析.pdf

    总之,AppWidgetProvider是Android应用开发中的一个重要部分,它为开发者提供了创建个性化桌面小部件的能力,提升了用户体验。理解并熟练掌握AppWidgetProvider的工作原理和使用方法,对于开发高质量的Android应用至...

    android AppWidgetProvider httpclient 扒取网页

    在Android开发中,AppWidgetProvider是一种特殊的BroadcastReceiver,它用于管理桌面小部件(App Widgets)。在给定的标题和描述中,我们关注的是如何利用AppWidgetProvider和HTTP客户端(HttpClient)来从特定网页...

    基于Android AppWidgetProvider的使用介绍

    在Android开发中,AppWidgetProvider是实现桌面小部件(Widget)功能的关键组件。它是一个广播接收器,用于监听与小部件相关的事件,如添加、删除或更新小部件。以下是对基于Android AppWidgetProvider使用进行的...

    Android控件AppWidgetProvider使用方法详解

    Android AppWidgetProvider是Android系统中用于创建桌面小工具(Widget)的核心组件,它本质...AppWidgetProvider为Android应用提供了扩展桌面功能的能力,使得用户可以在主屏幕上直接与应用进行交互,提高了用户体验。

    Android 应用程序开发(第2版)教材源码

    会涉及到RemoteViews和AppWidgetProvider的使用。 第11章《Android NDK开发》:介绍了使用NDK进行原生代码开发,如C++,以提高性能或利用已有的C/C++库。还会讲解JNI(Java Native Interface)的使用,以及如何将原生...

    android appwidget测试

    Appwidget就是手机应用中常常放在桌面(即home)上的一些应用程序,比如说闹钟等。这种应用程序的特点是它上面显示的内容能够根据系统内部的数据进行更新,不需要我们进入到程序的内部去,比如说闹钟指针的摆动等。本...

    Android应用源码之android Widget小组件开发.zip

    在Android应用开发中,Widget小组件是用户界面的重要组成部分,它们允许用户在主屏幕上与应用程序进行交互,而无需打开实际的应用。本资料包"Android应用源码之android Widget小组件开发.zip"提供了一套完整的源代码...

    Android应用源码之安卓桌面应用EyeRoom.rar

    - 如果EyeRoom支持小部件,那么源码中会有实现`AppWidgetProvider`的类,以及对应的小部件布局文件。小部件的更新和交互逻辑也会在这里实现。 6. **权限管理**: - 在`AndroidManifest.xml`中,我们需要检查...

    【南开大学】21春学期《手机应用软件设计与实现》在线作业-答案.pdf

    2. AppWidget窗口小部件开发:创建AppWidget时,需要继承`AppWidgetProvider`类,这是一个BroadcastReceiver的子类,用于接收并处理与AppWidget相关的意图(Intent)。 3. 图片资源存放位置:在Android应用程序中,...

    Android应用源码之android Widget小组件开发-IT计算机-毕业设计.zip

    在Android应用开发中,Widget小组件是用户界面的重要组成部分,它们允许用户在主屏幕上与应用程序进行交互,而无需实际打开应用。本项目是针对Android Widget小组件开发的一个毕业设计示例,适合学习和理解Android...

    安卓桌面应用EyeRoom.zip项目安卓应用源码下载

    4. **小部件支持**:安卓桌面应用通常支持小部件,EyeRoom的源码可能包含关于AppWidgetHost和AppWidgetProvider的实现,允许用户在桌面上添加和管理小部件。 5. **动态壁纸**:如果EyeRoom支持动态壁纸,那么源码中...

    安卓桌面应用EyeRoom.zip

    Android提供了AppWidgetProvider接口来创建和管理这些小部件,通过源码,我们可以学习如何设计和更新小部件的UI,以及如何响应用户的触摸事件。 8. **资源文件管理** Android应用的资源文件如图片、字符串、颜色等...

    Android高级应用源码-android Widget小组件开发.rar

    在Android平台上,Widget是应用程序提供的一种桌面小部件,它允许用户在主屏幕上放置应用程序的快捷方式或者简化的视图,以便快速访问或显示特定信息。本压缩包"Android高级应用源码-android Widget小组件开发"提供...

    Android应用源码之Android小部件AppWidget-IT计算机-毕业设计.zip

    在Android平台上,AppWidget是Android小部件,它们是桌面组件,允许用户在主屏幕上与应用程序进行交互,而无需实际打开应用程序。本项目是针对Android应用源码的学习与毕业设计,旨在帮助开发者理解如何创建和集成...

    Android应用源码Widget炫酷特效 (宏基扇子型效果).zip

    【Android应用源码Widget炫酷特效 (宏基扇子型效果)】 在Android开发中,Widgets是应用程序在主屏幕上提供用户交互的一种方式。这个“宏基扇子型效果”是针对Android Widget的一种创新设计,旨在为用户提供独特的...

Global site tag (gtag.js) - Google Analytics