五、RemoteViews
RemoteViews表示的是一个View结构,它可以在其他进程中显示。RemoteViews在Android中的使用场景有两种:通知栏和桌面小部件。
1、RemoteViews的应用
RemoteViews在实际开发中,主要用在通知栏的桌面小部件的开发过程中。通知栏主要是通过NotificationManager的notify方法来实现,除了默认效果,还可以另外定义布局。桌面小部件则是通过AppWidgetProvider来实现,AppWidgetProvider本质上是一个广播。RemoteViews运行在系统的SystemServer进程。
AppWidgetProvider除了最常用的onUpdate方法,还有以下几个方法:
- onEnable:
当该窗口小部件第一次添加到桌面时调用该方法,可添加多次但只在第一次调用。
- onUpdate:
小部件被添加时或者每次小部件更新时都会调用一次该方法,小部件的更新时机由updatePeriodMillis来指定,每个周期小部件都会自动更新一次。
- onDeleted:
每删除一次桌面小部件就调用一次
- onDisabled:
当最后一个该类型的桌面小部件被删除时调用该方法
- onReceive:
这是广播的内置方法,用于分发具体的事件给其它方法。
PendingIntent
PendingIntent表示一种处于pending状态的意图,而pending状态表示的是一种待定、等待、即将发生的意思,就是说接下来有一个Intent将在某个特定的时刻发生。PendingIntent和Intent的区别在于,PendingIntent是在将来的某个不确定的时刻发生,而Intent是立刻发生。PendingIntent典型使用场景是给RemoveViews添加单击事件,通过send和cancel方法来发送和取消特定的待定的Intent。
PendingIntent主要方法:
getActivity(Context context,int requestCode,Intent intent,int flags)
获得一个PendingIntent,该待定意图发生时,效果相当于Context.startActivity(Intent)
getService(Context context,int requestCode,Intent intent,int flags)
获得一个PendingIntent,该待定意图发生时,效果相当于Context.startService(Intent)
getBroadcast(Context context,int requestCode,Intent intent,int flags)
获得一个PendingIntent,该待定意图发生时,效果相当于Context.sendBroadcast(Intent)
PendingIntent匹配规则:如果两个PendingIntent它们内部的Intent相同并且requestCode也相同,那么这两个PendingIntent就是相同的。
flags:
- FLAG_ONE_SHOT:
当前描述的PendingIntent只能被使用一次,然后它就会被自动cancel。
- FLAG_NO_CREATE:
当前描述的PendingIntent不会主动创建。日常开发中没有太多的使用意义。
- FLAG_CANCEL_CURRENT:
当前描述的PendingIntent如果已经存在,那么它们都会被cancel,然后系统创建一个新的PendingIntent。对于通知栏消息,那些被cancel的消息单击后将无法打开。
- FLAG_UPDATE_CURRENT:
当前描述的PendingIntent如果已经存在,那么它们都会被更新,即Intent中的Extras会被替换成最新的。
2、RemoteViews的内部机制
RemoteView并不能支持所有的View类型,它所支持的类型如下:
Layout
FrameLayout、LinearLayout、RelativeLayout、GridLayout。
View
AnalogClock、Buttom、Chronometer、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView、AdapterViewFlipper、ViewStub。
上面所描述的是RemoteViews所支持的所有View类型,RemoteViews不支持它们的子类以及其他View类型。
通知栏和桌面小部件分别由NotificationManager和AppWidgetManager管理,而NotificationManager和AppWidgetManager通过Binder分别和SystemServer进程中的NotificationManagerService以及AppWidgetService进行通信。由此可见,通知栏和桌面小部件中的布局实际是在NotificationManagerService以及AppWidgetService中被加载的,而它们运行在系统的SystemServer中。
setOnClickPendingIntent、setPendingIntentTemplate以及setOnClickFillInIntent它们之间的区别和联系:
首先setOnClickPendingIntent用于给普通View设置单击事件,但不能给集合(ListView和StackView)中的View设置单击事件,比如我们不能给ListView中的item通过setOnClickPendingIntent这种方式添加单击事件,因为开销比较大,所以系统禁止了这种方式;其次,如果要给ListView和StackView中的item添加单击事件,则必须将setPendingIntentTemplate和setOnClickFillInIntent组合使用才可以。
五、RemoteViews的更多相关文章
- Android开发艺术探索第五章——理解RemoteViews
Android开发艺术探索第五章--理解RemoteViews 这门课的重心在于RemoteViews,RemoteViews可以理解为一种远程的View,其实他和远程的Service是一样的,Rem ...
- 《android开发艺术探索》读书笔记(五)--RemoteViews
接上篇<android开发艺术探索>读书笔记(四)--View工作原理 No1: RemoteViews使用场景:通知栏和桌面小部件 No2: 通知栏主要通过NotificationMan ...
- 第五章:理解RemoteViews
RemoteView应该是一种远程View,表示的是一个View结构,他可以在其它进程中显示. 在android中使用场景有两种:通知栏和桌面小部件 5.1 RemoteView的应用 5.1.1 R ...
- remoteViews简介
RemoteViews从字面上看是一种远程视图.RemoteViews具有View的结构,既然是远程View,那么它就可以在其他进程中显示.由于它可以跨进程显示,所以为了能够更新他的界面,Remote ...
- 【Android - 进阶】之RemoteViews简介
RemoteViews,顾名思义,就是远程的View,也就是可以运行在其他进程中的View.RemoteViews常用在通知和桌面小组件中. 一.RemoteViews应用到通知 首先来介绍一下系统自 ...
- 《Django By Example》第五章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:大家好,我是新来的翻译, ...
- 旺财速啃H5框架之Bootstrap(五)
在上一篇<<旺财速啃H5框架之Bootstrap(四)>>做了基本的框架,<<旺财速啃H5框架之Bootstrap(二)>>篇里也大体认识了bootst ...
- 移动站应该尝试百度MIP的五个原因
MIP是什么?MIP是百度在2016年提出的移动网页加速器项目. MIP能做什么?MIP能帮助站长和网站开发者快速搭建移动端页面. MIP怎么加速?MIP从前端渲染和页面网络传输两方面进行优化,杜绝页 ...
- 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发
阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...
随机推荐
- GraphQL-前端开发的利剑与桥梁
GraphQL-前端开发的利剑与桥梁 基本概念 GraphQL GraphQL 是一种用于 API 的查询语言,由Facebook开发和开源,是使用基于类型系统来执行查询的服务端运行时(类型系统由你的 ...
- python学习笔记(十)、文件操作
在前面我们了解到了没得模块,其中有一个模块为fileinput,为文件操作模块,不知道小伙伴们是否还记得? 1 打开文件 要打开文件,可以使用fileinput中的fileinput.input函数进 ...
- HBase篇--搭建HBase完全分布式集群
一.前述. 完全分布式基于hadoop集群和Zookeeper集群.所以在搭建之前保证hadoop集群和Zookeeper集群可用.可参考本人博客地址 https://www.cnblogs.com/ ...
- 网络协议 4 - 交换机与 VLAN:办公室太复杂,我要回学校
上一次,我们通过宿舍联网打魔兽的需求,认识了如何通过物理层和链路层组建一个宿舍局域网.今天,让我们切换到稍微复杂点的场景,办公室. 在这个场景里,就不像在宿舍那样,搞几根网线,拉一拉, ...
- redis 系列6 数据结构之字典(下)
一.概述 接着上篇继续,这篇把数据结构之字典学习完, 这篇知识点包括:哈希算法,解决键冲突, rehash , 渐进式rehash,字典API. 1.1 哈希算法 当一个新的键值对 需要添加到字典里面 ...
- Android Native App自动化测试实战讲解(下)(基于python)
6.Appuim自动化测试框架API讲解与案例实践(三) 如图1,可以在主函数里通过TestSuite来指定执行某一个测试用例: 6.1,scroll():如图2 从图3中可以看到当前页面的所有元素r ...
- 用PMML实现机器学习模型的跨平台上线
在机器学习用于产品的时候,我们经常会遇到跨平台的问题.比如我们用Python基于一系列的机器学习库训练了一个模型,但是有时候其他的产品和项目想把这个模型集成进去,但是这些产品很多只支持某些特定的生产环 ...
- IDEA搭建Spring Boot项目
所需工具 新建项目 创建一个login控制器 写入两个注释 import导入项会自动添加@RestController@RequestMapping(value = "/login" ...
- leetcode — scramble-string
import java.util.Arrays; /** * Source : https://oj.leetcode.com/problems/scramble-string/ * * Given ...
- SmartSql 类型处理器
Nuget 安装 Install-Package SmartSql.TypeHandler -Version 3.0.1 SmartSql.TypeHandler 包括了俩种类型的类型处理程序: Js ...