最近在学习中遇到了一个以前没有接触过的知识点remoteView,通过查阅资料,我发现了关于remoteView的一些相关特性。

1.RemoteView概述:

到目前为止,我发现RemoteView基本上常用的两个地方,AppWidget和Notification。

RemoteView描述一个view,而这个view是在另一个进程中显示的,它inflate的是layout资源文件,并且提供了可以修改view内容的一些简单的基本操作。

1,AppWidget---RemoteView 
我们都知道AppWidgetProvider是一个BrocaseReceiver,只是接受到Enable, Update,disale,delete这些message,而真正显示界面的是AppWidgetHostView(这是在Launcher里面实现的)这中间就是通过RemoteView来沟通。通过RemoteView告诉Launcher你想要的AppWidget是长什么样。

2,Notification--RemoteView 
若你想自定义你的Notification也必须通过RemoteView.因为你定义的Nofication和显示Notification也是两个不同的进程。 

· 在android 2.2之前,RemoteView只支持一些简单的view:TextView, Framelaout..不支持ListView和GridView等复杂的view,它的操作也是简单的click。在网上有人说是通过@RemoteView这个标签确定RemoteView是否支持view.在view的源文件加上@RemoteView这个标签就可以支持了。这个我还没有去试试过。 (在htc sence ui 中我们可以看到有用到listview,gridview,这是怎么做到的呢,看下面说明)

在android 3.0,Google加强这方面,下面来源官方文档: 
Expanded Home screen widgets 
Home screen widgets are popular with users because they offer fast access to application-specific data directly from the home screen. Android 3.0 lets developers take home screen widgets to the next level, offering more types of content and new modes of interaction with users. Developers can now use more standard UI widget types home screen widgets, including widgets that let users flip through collections of content as 3D stacks, grids, or lists. Users can interact with the home screen widgets in new ways, such as by using touch gestures to scroll and flip the content displayed in a widget.

2.Android AppWidget 如何支持复杂的View 

一直想知道如何在AppWidget里面添加 ListView,EditText 这些复杂的View.我们知道要在AppWidget里添加 View都是通过RemoteView来做到了,然而RemoteView本身功能很弱,支持的操作很少,而且支持RemoteView的Widget很少:

在Dev Guide中有下面这段:

说明

A RemoteViews object (and, consequently, an App Widget) can support the following layout classes: * FrameLayout * LinearLayout * RelativeLayout And the following widget classes: * AnalogClock * Button * Chronometer * ImageButton * ImageView* ProgressBar * TextView Descendants of these classes are not supported.

所以从这里可以知道,为什么在AppWidget里添加EditText会显示LoadError了,因为本身它就不支持这些复杂的 Widget.

疑问1:为什么Google Search会有EditText呢?

其实这些都是假象,并不是AppWidget支持EditText. 
具体怎么回事,我猜有两种情况: 
1.一种确实是EditText但确不是AppWidget 支持的,而是集成到Home里面去了。 
2.最新的SDK 1.6中,显示在桌面的EditText只是一个ImageView,而这个ImageView的背景就是EditText的截图了。我们点中这个“EditText”后,会调起一个Activity, 
而这个Activity就是复杂输入的EditText,并且会全屏显示。所以我们就误以会那是一个单纯的EditText.

疑问2:HTC Hero Sense UI的人都看到了,它的AppWidget是确实支持复杂Widget的,比如:Bookmark, Widget:ListView/GridView,Twitter Widget:EditText.

这些确实是我们可以看到的,但它是怎么做到的呢?我也很想知道,AppWidget支持到那么强大,甚至超过了本身AP的功能,很抢眼。但不管是怎么实现的,我想人家肯定是花了大力气去做到了,我猜想可能是将Google 提供的AppWidget进行了比较大的改动。我们查看一下framework下的appwidget:

pjq@gentoo-pjq ~/android/donut $ ls frameworks/base/core/java/android/appwidget/-lh total 60K -rw-r--r-- 1 pjq users 7.9K 2009-09-29 21:49 AppWidgetHost.java -rw-r--r-- 1 pjq users 12K 2009-09-29 21:49 AppWidgetHostView.java -rw-r--r-- 1 pjq users 14K 2009-09-29 21:49 AppWidgetManager.java -rw-r--r-- 1 pjq users 691 2009-09-29 21:49 AppWidgetProviderInfo.aidl -rw-r--r-- 1 pjq users 5.6K 2009-09-2921:49 AppWidgetProviderInfo.java -rwxr-xr-x 1 pjq users 6.3K 2009-09-29 21:49 AppWidgetProvider.java -rw-r--r-- 1 pjq users 1.5K 2009-09-29 21:49 package.html

所以我想HTC一定是将这里给改动了,以支持复杂的Widget,有知道内情的透露一点最好了。

要知道RemoteView的功能很少,特别是对事件处理的能力,都需要通过PendingIntent,传到BroadcastReceiver 去处理。所以这里对一些事件处理也仅限于比较简单事件:比如说:Button Clicked,其它的我好像还没怎么用过,orz…. 对复杂的View:比如ListView(当然这里还不支持,打个比方),ListView里面那么多Item,要设置Listener,要传值,这些 RemoteView都不能像一个单纯的Activity那样处理。

如何在AppWidget里支持显示ListView/GridView这些复杂的 Widget.:

其实简单点讲就是在一个Widget类前面加上”@RemoteView”,加上了它就等于说RemoteView可以支持它, RemoteView支持就等于是AppWidget支持这它了。

好了,现在你只需要自定义一些你需要的Widget,加上”@RemoteView”标记,你就可以在AppWidget里使用它了。

关于如何自定义一个Widget你完全可以参照frameworks/base/core/java/android/widget已有的这些Widget.依样加一个。

其实如果你需要自定义一个Widget,比如说支持ListView,你可以先在一个activity里实现它,然后将它移到framework下面去。

这里说一下可能需要注意的地方:

1.如果有多个文件,需要Package的时候,名字最好按照这样的形式:android.widget.bookmark

其中bookmark就是你要添加一个Widget存放的地方,这样的话你就可以在frameworks/base/core/java/android/widget 目录下新增bookmark文件夹,将java文件放在这个目录下。

如果你新增的Widget只有一个java文件就可以不用这样了,可以完全按照已经存在的Widget的样子,直接将java文件放到frameworks/base/core/java/android/widget目录下。

2.资源文件存放:

frameworks/base/core/res/res

资源文件都放到这个目录下。

3.资源的引用:

要用这样的方式引用:com.android.internal.R.drawable.**

4.记着在这个Customer Widget类名前加上”@RemoteView”标记.

这些都做完了,你就已经将一个自定义的Widget添加到framework了。之后要做的工作就是编译整个工程了,重新生成SDK。

最后你就可以在AppWidget引用你新加的这个Widget了:com.widget.bookmark.***。

至此,你已经用上了你新加的这个Widget,并且可以加到AppWidget.

在新加Widget的时候可能会遇到的一些问题:

1.构造函数初始化问题。

如果在XML里写的layout不能直接指定哪个构造函数进行初始化,如果你不确定会跑哪个构造函数,最好在每个构造函数里对加上log,这样你就知道初始化时会跑哪个构造函数,并将初始化的工作加到里面。我当时就遇到了这个问题,因为用XML写layout,你不能显示调用哪个构造函数进行初始化,如果你将初始化的操作放到一个不会自动跑到的构造函数里面,那面你运行的时候就好像没添加到Widget一样。

Android中的remoteView相关推荐

  1. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  2. 接口文档示例_在示例中使用Android中的Work Manager

    接口文档示例 在本文中,我们将介绍如何在android中使用工作管理器. 工作管理器是android体系结构组件的一部分,并且可以很好地替代所有先前的调度选项. 其他调度选项,例如JobSchedul ...

  3. Android中AppWidget的分析与应用:AppWidgetProvider .

    from: http://blog.csdn.net/thl789/article/details/7887968 本文从开发AppWidgetProvider角度出发,看一个AppWidgetPrv ...

  4. Android中各个权限详解

    在Android的设计中,资源的访问或者网络连接,要得到这些服务都需要声明其访问权限,否则将无法正常工作.在Android中这样的权限有很多种,这里将各类访问权限一一罗列出来,供大家使用时参考之用. ...

  5. Android中Notification的使用(一)

    本篇博客只是对Android通知进行了比较浅显的研究,适合通知栏初学者借鉴.废话不多说开始撸代码. Android开发环境 (1)AndroidStudio 3.1.2 (2)Android设备Hon ...

  6. Android中RemoteViews的实现

    田海立@CSDN 2012-8-22 本文结合AppWidget的应用场景,分析Android中RemoteViews的内部具体实现. 从前文<Android中AppWidget的分析与应用:A ...

  7. Android Notification通知RemoteView布局使用ConstraintLayout报错

    Android Notification通知RemoteView布局使用ConstraintLayout报错:inflate error ? Notification的自定义布局是RemoteView ...

  8. Android中实现为TextView添加多个可点击的文本

    这篇文章主要介绍了Android中实现为TextView添加多个可点击的文本,可实现类似Android社交软件显示点赞用户并通过用户名称进入该用户主页的功能,是非常实用的技巧,需要的朋友可以参考下.具 ...

  9. android 弹出fragment,Android中ViewPager获取当前显示的Fragment

    前言 在项目中,有时会用到在ViewPager中显示同样类型的Fragment,同时这样的Fragment的个数是动态的,但是PagerAdapter没有给我们提供getCurrentFragment ...

最新文章

  1. Python 写了一个网页版的「P图软件」,惊呆了!
  2. 目前最细致清晰的NSDictionary以及NSMutableDictionary用法总结
  3. Git一电脑配置config多个git用户 一个用于公司工作 一个用于个人学习
  4. Access执行sql 查询
  5. 数字图像matlab心得,Matlab数字图像处理的学习建议
  6. Oracle 自带sqldeveloper导入数据到表
  7. 实现Windows直接远程访问Ubuntu桌面和解决VNC连接Ubuntu桌面灰色的问题解决
  8. ACDU活动回顾:@DBA,前辈指路不迷茫
  9. 【电商AI】商业情境中的机器学习|湾区人工智能
  10. quidway secpath下搭建DHCP服务器01
  11. python通过文件路径读取图片
  12. matlab cos sinx,matlab求y=sinxcos(2x)及其包络线急!!!
  13. 姆町网络验证带壳内存取密钥
  14. TAS5754应用笔记
  15. day42.自动关机小程序
  16. 企业信息安全————3、如何建立企业安全框架
  17. python处理can协议文件_用Python处理CAN数据库
  18. 项目中遇到的问题(一)弹出UIAlertController 时出现 Warning: Attempt to present * on * which is already presenting
  19. 转载:mongo常规操作 大于/小于/不等于……
  20. DayDayUp:佛说:有果必有因。 黑格尔说:世界上没有无缘无故的爱,也没有无缘无故的恨。

热门文章

  1. redis搭建主从哨兵模式+分片集群部署(redis系列二)
  2. 【小象学院】案例6——判断密码强弱v4.0
  3. ssm+jsp计算机毕业设计医院管理系统63lzg(程序+lw+源码+远程部署)
  4. 18年程序员退休后的第一篇文章:程序员推荐去的网站
  5. 【综合类型第 21 篇】声明:更改 CSDN 博客昵称
  6. 400Bad Request异常
  7. 软件测试 保险公司人寿保险保费计算程序的等价类
  8. 重写Winform的Textbox单行模式下滚动条。
  9. Windows 10「设置」应用完整MS-Settings快捷方式汇总
  10. VS2017连接MySQL数据库出错:Could not load file or assembly 'MySql.Data, Version=8.0.13.0, Culture=neutral