Android AppWidget开发实战

AppWidget 框架类

1.AppWidgetProvider

继承自 BroadcastRecevier , 在AppWidget 应用 update、enable、disable 和 delete 时接收通知。其中,onUpdate、onReceive 是最常用到的方法,它们接收更新通知。

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

onDeleted(Context context, int[] appWidgetIds)

onDisabled(Context context)

onEnabled(Context context)

onReceive(Context context, Intent intent)

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

2.AppWidgetProvderInfo

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

3.AppWidgetManger

负责管理 AppWidget ,向 AppwidgetProvider 发送通知。

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 组件

4.RemoteViews

一个可以在其他应用进程中运行的类,向 AppWidgetProvider 发送通知。

Demo

一个简单的AppWidget步骤

1、在res下新建xml文件夹,然后新建appwidget_provider.xml

<?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/widget_main">
</appwidget-provider>

2、在layout文件夹下新建布局文件widget_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
		<TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:text="点点点我" >
		</TextView>
</LinearLayout>

3、定义类继承自AppWidgetProvider

public class MyAppWidgetProvider extends AppWidgetProvider {
    private RemoteViews remoteViews;

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        if (remoteViews == null) {
            remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_main);
        }
        if (intent.getAction().equals("com.example.widgettest")) {
            if (CommonValiable.isChange) {
                remoteViews.setTextViewText(R.id.tv, "点点点我");

            } else {
                remoteViews.setTextViewText(R.id.tv, "买买买我");
            }
            Toast.makeText(context, Boolean.toString(CommonValiable.isChange), Toast.LENGTH_LONG).show();
            CommonValiable.isChange = !CommonValiable.isChange;
        }
        AppWidgetManager appWidgetManger = AppWidgetManager.getInstance(context);
        int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName(context, MyAppWidgetProvider.class));
        appWidgetManger.updateAppWidget(appIds, remoteViews);

    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;
        for (int i = 0; i < N; i++) {
            int appWidgetId = appWidgetIds[i];
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }
    public void updateAppWidget(Context context, AppWidgetManager appWidgeManger, int appWidgetId) {
        remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_main);
        Intent intent = new Intent("com.example.widgettest");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        remoteViews.setOnClickPendingIntent(R.id.tv, pendingIntent);
        appWidgeManger.updateAppWidget(appWidgetId, remoteViews);
    }
}

4、在清单文件的application节点下声明如下

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

    <intent-filter>
        <action android:name="com.example.widgettest" />
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
</receiver>

下载Demo请猛戳

时间: 2024-10-08 10:34:37

Android AppWidget开发实战的相关文章

《Android Studio开发实战 从零基础到App上线》资源下载和内容勘误

http://blog.csdn.net/aqi00/article/details/72907534 http://blog.csdn.net/aqi00/article/details/73065392 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 资源下载 下面是<Android Studio开发实战 从零基础到App上线>一书用到的工具和代码资源:1.本书使用的Android Studio版本为2.2.3,因为Android官网现在不提供该版本的下载,所以博主

开源分享二(Android相机开发实战)

开源分享二(Android相机开发实战) 开源分享 一(StickerCamera + 仿微信多图选择) 前言 上篇博文给大家分享了两个非常实用的项目功能模块,不知道大伙感觉如何?有木有一种臭袜子味扑鼻,酸爽的赶脚!!!贱笑贱笑了~ ~ OK!不扯淡了,言归正传.本文将主要为大家介绍Android中自定义相机的开发,做Android应用的童鞋应该都知道,在应用中使用相机功能有两种方式: 调用Camera API 自定义相机 调用系统相机 由于需求不同,所以选择的方案固然也不同,至于第二种调用系统

Android项目开发实战之使用Fragment和FragmentTabHost搭建底部菜单(一)

学习在于实用,只有把自己学到的东西真正的融入到我们的开发中,并且使用的得心应手,那才是真正的掌握.而想把技术使用的得心应手并不是一蹴而就的,需要不断的巩固自己的知识体系,需要大量的实战练习,当然还不能缺少你的专研和耐心. 但是很多小伙伴们并不一定学过的知识都掌握了,而且相信很多伙伴们即使学习一种技术也还是停留在读过,看过,学习过,并没有真正的实战过,所以当时学习的技术觉得自己真正的学会了,搞懂了,而且信心满满的觉得自己可以不必在练习了,这是不对的,因为一时的学习并没有立马转变成为你的技能,而是需

Android项目开发实战-2048游戏

<2048>是一款比较流行的数字游戏,最早于2014年3月20日发行.原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台.这款游戏是基于<1024>和<小3传奇>的玩法开发而成的新型数字游戏.游戏源地址:http://gabrielecirulli.github.io/2048/ 1.新建android项目game2048 修改activity_main.xml文件 <LinearLayout xmlns:andro

Android SVN开发实战的文件夹结构呈现

svn有一个非常标准的文件夹结构,这是. 例如,该项目是proj.svn地址svn://proj/,然后该标准svn布局是 svn://proj/ | +-trunk +-branches +-tags 这 是一个标准的布局,trunk为主开发文件夹,branches为分支开发文件夹,tags为tag存档文件夹(不同意改动).可是详细这几个文件夹应该怎样使 用,svn并没有明白的规范,很多其它的还是用户自己的习惯. 对于这几个开发文件夹.一般的用法有两种.我很多其它的是从软件产品的角度出发 (比

Android SVN开发实战之目录结构介绍

svn有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是 svn://proj/ | +-trunk +-branches +-tags 这 是一个标准的布局,trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修改).但是具体这几个目录应该如何使 用,svn并没有明确的规范,更多的还是用户自己的习惯. 对于这几个开发目录,一般的使用方法有两种.我更多的是从软件产品的角度出发 (比如freebsd)

8-4 Flutter Android混合开发实战-调试与发布

在flutter的目录下运行命令 第二步,运行原生,点击按钮后,控制台的输出. 同步代码到安卓设备上已经完成.热加载小r 热重启的是大R.请求帮助按h .退出按q 这个时候原生的效果就出来了 原生这里就看到了效果 调试Dart代码 原生运行的app打开.点击加载flutter模块. 加载完成后就出现了调试面板 也可以加断点调试 点击按钮会触发代码 点击后 就在断点这里暂停了. 只要让原生项目和flutter项目监理debug的链接.调试和原有flutter的调试是一样的 发布应用 首先是签名,

美发帮--android APP开发实战

登陆界面,LinearLayout  ImageView  Button   用到了ImageView自动缩放,和自定义Button形状及State-Drawable,还用到了动画. 自定义控件之圆形头像,和自定义Toast 注册界面在验证手机号时,使用了一个CountDownTimer类,来完成倒计时验证.

Android 项目开发实战:聚合数据短信验证码

聚合数据集成短信验证码官网: http://www.juhe.cn/docs/sdk/id/67 我根据文档集成了一个例子 效果: 源码下载:http://download.csdn.net/detail/zhaihaohao1/8917409 参考视频:http://www.jikexueyuan.com/course/495.html 文章来源:http://blog.csdn.net/zhaihaohao1/article/details/46980551