AppWidgetProvider小部件开发(RemoteViews 机制分析)

Android 桌面小组件 AppWidgetProvider 桌面小组件,绝对是小程序中的小程序,说白了就是任何复杂一丁点的操作都适合做成桌面小组件。所以这里采用的演示的例子,就只有一个白色圆角背景,外加一个文本框,显示文字。小组件的教程网上一搜一大堆,所以我这里主要就是介绍一些坑的地方,跟大致处理流程,具体细节还得看其他大神的骚操作。 阅读详情

桌面小部件开发:

一,AppWidgetProvider 

(本质是一个广播) 运行在SystemServier 通过RemoteViews 跨进程更新

1.xml文件

注册的xml文件:

   <receiver android:name=".widget.TableWidget"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
                <action android:name="com.com.example.cuizehui.estore.widget.Click"/>
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/example_appwidget_info" />
        </receiver>

配置 长相的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="80dp"
    android:minHeight="80dp"
    android:previewImage="@drawable/shop_normal"
    android:initialLayout="@layout/tablewidget_layout"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen|keyguard">

    <!--
    android:minWidth : 最小宽度
    android:minHeight : 最小高度
    android:updatePeriodMillis : 更新widget的时间间隔(ms),"86400000"为1个小时
    android:previewImage : 预览图片
    android:initialLayout : 加载到桌面时对应的布局文件
    android:resizeMode : widget可以被拉伸的方向。horizontal表示可以水平拉伸,vertical表示可以竖直拉伸
    android:widgetCategory : widget可以被显示的位置。home_screen表示可以将widget添加到桌面,keyguard表示widget可以被添加到锁屏界面。
    android:initialKeyguardLayout : 加载到锁屏界面时对应的布局文件
     -->

</appwidget-provider>

2.实现类

public class TableWidget extends AppWidgetProvider {


   public  static  final String  ClickAction="com.com.example.cuizehui.estore.widget.Click" ;
    public TableWidget() {
        super();
    }

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

        //对ui进行初始化
RemoteViews remoteViews=new RemoteViews(context.getPackageName(), R.layout.tablewidget_layout);//包名和布局文件名
remoteViews.setImageViewResource(R.id.table_imageview,R.drawable.tabl); ComponentName componentName=new ComponentName(context,TableWidget.class); //设置点击事件 Intent intentclick=new Intent(context,MainActivity.class); // intentclick.setAction(ClickAction); PendingIntent pendingIntent=PendingIntent.getActivity(context,0,intentclick,0); remoteViews.setOnClickPendingIntent(R.id.table_imageview,pendingIntent); /* //如果时内部 则相当于给自己发送广播 注册好action 后自己发送 Intent intentaciton=new Intent(); PendingIntent pendingIntentclick=PendingIntent.getBroadcast(context,0,intentaciton,0); remoteViews.setOnClickPendingIntent(R.id.table_imageview,pendingIntentclick); */ appWidgetManager.updateAppWidget(componentName,remoteViews); } //接受到广播后自己要做什么 @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if (intent.getAction().equals(ClickAction)){ AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(context); //对ui进行修改 RemoteViews remoteViews=new RemoteViews(context.getPackageName(), R.layout.tablewidget_layout); Bitmap bitmap= BitmapFactory.decodeResource(context.getResources(),R.drawable.tabl); remoteViews.setImageViewBitmap(R.id.table_imageview,rotateBitmap(context,bitmap,180)); appWidgetManager.updateAppWidget(new ComponentName(context,TableWidget.class),remoteViews); } } private Bitmap rotateBitmap(Context context,Bitmap srcbBitmap ,float degeree){ Matrix matrix=new Matrix(); matrix.reset(); matrix.setRotate(degeree); Bitmap tmpBitmap=Bitmap.createBitmap(srcbBitmap,0,0,srcbBitmap.getWidth(),srcbBitmap.getHeight(),matrix,true); return tmpBitmap; } }

通过上面可以看到 注册点击事件的方法和更新UI的方式。

onRreceive 源码可以看到
是根据Intent 来判断 并自动调用其中的 onUpdata/onDisable/....等几个方法的
(所以我们也可以自己注册Action 并获取  在其中写自己的逻辑)

3.点击事件

PedingIntent (send/cancel)

支持三种待定的意图 (activity /broadcast/service)
4个参数, 最后一个Flag的作用是通过前两个 参数(requestcode 和intent 其中的intent-fitlter和conponext)用来标识 是否是同一 来选择是否send/cancel。

setOnclickPedingIntent() 即可完成点击事件的注册。

4.更新UI的方式

这段代码是用来更新UI的:
   AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(context);

         //对ui进行修改
         RemoteViews remoteViews=new RemoteViews(context.getPackageName(), R.layout.tablewidget_layout);
         Bitmap bitmap= BitmapFactory.decodeResource(context.getResources(),R.drawable.tabl);
         remoteViews.setImageViewBitmap(R.id.table_imageview,rotateBitmap(context,bitmap,180));


         appWidgetManager.updateAppWidget(new ComponentName(context,TableWidget.class),remoteViews);

代码解析:

本质上是AppwidgetManager 通过Binder 和SystemService中的 AppwigetService 进行通信

Remoteview 实现了parcelable 接口所以可以通过Binder进行传输


每次Remoteview的set方法本质都是产生了一个RemotionAction对象放到 list中, 传递过去后通过 apply 拆包的(最终是RemoteView的Apply 和reApply 方法获取的)
 

参考文章:
http://blog.youkuaiyun.com/qq_26787115/article/details/54427183

[实战] 关于AppWidgetProvider 桌面小工具如何实现 AppWidgetProvider提供一个在桌面的小窗口用来展示APP的内容。具体我们通过回答几个问题来展示如何实现。 1.怎么注册服务 2.怎么更新UI 3.怎么根据窗口大小使用不同的Layout 4.怎么定时刷新Layout 以下一一作答。 1.怎么注册服务 核心类,AppWidgetProvider 定义了基本的方法onAppWidgetOptionsChanged,onUpdate,onEnabled,onDisabled。 onAppWidgetOptionsChanged在窗口大小改变时 阅读详情

相关推荐

Android 之App Widget

构建应用微件

qq_52670697的博客 1310

Android 小组件 AppWidgetProvider

在 res/xml/ 文件夹中新建配置文件 demo_appwidget_info.xml}

阿杜 2011

Android RemoteViews的基本使用(下)之窗口小部件

一,写在前面                     在文章RemoteViews的基本使用(上)之通知栏 中讲述了的RemoteViews使用场景之通知栏,这篇文章主要讲述RemoteViews在窗口小部件中的使用。在写好了一个窗口小部件之后,如果需要对小部件的界面进行更新,由于在本应用中无法调用findViewbyid(id)方法获取控件引用(需要跨进程访问界面),这个时候RemoteVie

小王君的专栏 2725

使用AppWidgetProvider、RemoteViews、PendingIntent开发桌面小部件

android:resource="@xml/lcq_appwidget_provider_info"小部件的配置信息;:用于识别小部件的点击行为;:系统规范,必须存在,如果不加则在手机的小部件里面不会出现。initialLayout:桌面小工具使用的初始化布局;

qq_19942717的博客 1261

Android桌面小部件开发:AppWidgetProvider核心机制与实战优化

在Android应用开发中,桌面小部件(AppWidget)是一种能够将应用核心信息直接展示在用户主屏幕或锁屏上的重要组件,它通过跨进程视图渲染机制,实现了在不启动完整应用的情况下提供实时数据预览和轻量交互。其核心原理基于广播驱动的事件模型,由AppWidgetProvider作为广播接收器响应系统生命周期事件,并借助RemoteViews进行跨进程的UI更新。这项技术的工程价值在于显著提升了用户体验的便捷性和信息获取效率,使得天气、日程、音乐播放等高频场景的信息能够一目了然。在实际开发中,开发者常需处理小

weixin_29195615的博客 270

Android中桌面小部件的开发流程及常见问题和解决方案

在Android中开发桌面小部件(App Widget)可以让用户直接在主屏幕上查看和交互应用内容。以下是桌面小部件的开发流程,包括了创建基本小部件的步骤和示例代码。

执剑人 5162

Android之RemoteViews篇下————RemoteViews的内部机制

android之RemoteViews篇2————RemoteViews的内部机制 一.目录 android之RemoteViews篇2————RemoteViews的内部机制 一.目录 二.remoteViews概述 三.RemoteViews源码 四.RemoteViews的简单应用 五.参考资料 二.remoteViews概述 上一篇博客中讲了通知栏和桌面小部件...

冰炭不投day的博客 1921

《Android开发艺术探索》第5章- 理解 RemoteViews 读书笔记

目录1. RemoteViews 的应用1.1 说一说对 RemoteViews 的理解1.2 如何创建 RemoteViews?1.3 如何更新 RemoteViews 的视图层级里的 View?1.4 开发桌面小部件的步骤是什么?1.5 AppWidgetProvider 的回调方法有哪些?作用分别是什么?1.6 PendingIntent 和 Intent 的区别是什么?1.7 PendingIntent 支持哪三种待定意图?1.8 PendingIntent 的匹配规则是什么?1.9 `FLAG_O

willwaywang6 1785

Android之AppWidgetProvider使用详解

AppWidget 即桌面小部件,也叫桌面控件,就是能直接显示在Android系统桌面上的小程序。一些用户使用比较频繁的程序,可以做成AppWidget,这样能方便地使用。典型的程序有时钟、天气、音乐播放器等。

Jason_Lee155的博客 9334

掌握Android AppWidget更新:终极实践指南

AppWidget作为Android系统中提供给开发者一种将小型应用界面集成到用户主屏幕的控件,它能够在不需要打开应用的情况下直接向用户显示重要信息,并允许用户与之交互。控件的更新机制是AppWidget的核心特性之一,它使得Widget能够定时或者在特定事件发生时刷新内容,以提供最新的信息给用户。更新机制通常涉及多个组件协作工作,包括以及。其中,类似于BroadcastReceiver的角色,负责接收广播并处理更新事件;用于管理Widget实例,并且负责界面更新请求的调度;

weixin_35370061的博客 1581

Android天气小部件开发源码详解

推荐做法:使用处理轻量级更新请求:) {.action) {注册方式:优势:- 轻量级,无需启动完整组件;- 易于集成 WorkManager 进行异步处理;- 支持跨进程通信。

weixin_42594427的博客 1303

Android Widget——实现桌面小部件

前言       在Android手机中,我们经常会看到各种桌面小部件,天气、音乐播放器、时间表盘等,这些都是桌面小部件的实例。本篇主要介绍桌面小部件开发的一些最基础的知识。 Widget介绍       Widget并没有运行在我们App的进程中,而是运行在系统的SystemServer进程中。所以意味着我们也不能像在App中那样操作View控件。为了我们能在远程进程中更新界面,Goog

haazzz的博客 4122

Android桌面时钟小部件开发实战项目

在移动应用开发中,桌面小部件(App Widget)为用户提供了一种“一瞥即得”的信息交互方式。其中,桌面时钟小部件因其高频可见性与实时性,成为提升用户体验的重要载体。它无需启动主应用即可展示时间、日期甚至个性化主题,广泛应用于锁屏替代、智能家居控制面板、专注时钟等场景。-- 示例:基础时钟小部件布局引用 -->通过与协同工作,系统以低功耗方式实现跨进程UI更新,体现了Android组件化设计的高效性。与对应,在当前应用的所有小部件都被用户删除时调用。

weixin_42173218的博客 1400

RemoteViews应用以及内部机制、原理(上)。

一、概述。 RemoteViews是一种远程View,它提供了一组基础的操作用于跨进程更新它的界面。 一般RemoteViews在android中的应用场景有两种:一种是通知栏,另一种是桌面小部件。 二、应用。 (1)、通知栏。 首先使用系统默认的样式创建一个通知, Intent intent = new Intent(this, NotificationActiv

visions的博客 1505

android 桌面组件 App widget的使用 AppWidgetProvider

android 桌面组件 App widget的使用.

Android控件AppWidgetProvider使用方法详解

介绍 AppWidgetProvider是Android中提供的用于实现桌面小工具的类,其本质是一个广播,即BroadcastReceiver,在实际的使用中,把AppWidgetProvider当成一个BroadcastReceiver即可 1. 为AppWidget提供一个文件定义小控件的基本配置信息 在资源文件夹res目录下新建xml文件夹,添加app_widget_provider_info.xml文件内容为: <?xml version=1.0 encoding=utf-8?> <!--小控件宽高--> <!--android:minWidth=40dp-->

Android桌面小部件与RemoteViews

Android桌面小部件与RemoteViews标签(空格分隔): Android一、简介  App Widget是应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新。你可以通过一个App Widget Provider来发布一个Widget。   小部件通过AppWidgetProvide来实现,AppWidgetProvide本质

高沛的博客 956

低功耗基础概念——Level Shifter cell补充

信号跨越不同级别电压模块进行驱动时,需要使用level shifter。 H2L Level shifer 从高电压到低电压的level shifter,可以是两个反相器的串联。 输入高电平区域信号INH,输出低电平区域信号OUTL,注意供应电源由低电压模块提供,即图中的VDDL。 从图中可以看出,H2L的level shifter只会引入一个buffer的延迟,对时序的影响较小。 L2H Level shifer 用低电压区域的信号invert和buffer之后得到的一对信号来驱动工作在高电压区域的交

qq_36480087的博客 1万+
上一篇: DialogFragment 实现支付弹出功能
下一篇: Crash的收集
Nela
博客等级 码龄11年 9粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值