五、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篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...
随机推荐
- [Swift]LeetCode19. 删除链表的倒数第N个节点 | Remove Nth Node From End of List
Given a linked list, remove the n-th node from the end of list and return its head. Example: Given l ...
- [Swift]LeetCode647. 回文子串 | Palindromic Substrings
Given a string, your task is to count how many palindromic substrings in this string. The substrings ...
- [Swift]LeetCode738. 单调递增的数字 | Monotone Increasing Digits
Given a non-negative integer N, find the largest number that is less than or equal to Nwith monotone ...
- [Swift]LeetCode942. 增减字符串匹配 | DI String Match
Given a string S that only contains "I" (increase) or "D" (decrease), let N = S. ...
- C语言——Win10系统下安装VC6.0教程
学习一门语言最重要的一步是搭建环境,许多人搭建在搭建环境上撞墙了,就有些放弃的心理了:俗话说,工欲善其事,必先利其器:所以接下来我们进行学习C的第一步搭建环境; 第一步:先解压我们下载好的VC6.0软 ...
- Spring Boot 最核心的 25 个注解,都是干货!
学习和应用 Spring Boot 有一些时间了,你们对 Spring Boot 注解了解有多少呢?今天栈长我给大家整理了 Spring Boot 最核心的 25 个注解,都是干货! 你所需具备的基础 ...
- 【mysql】mysql 调优之 ——执行计划 explain
1.what is explain(explain 是个什么东东) explain(解释),在 Mysql 中 作为一个关键词,用来解释 Mysql 是如何执行语句,可以连接 select .dele ...
- 9.Git分支-分支的创建与合并-02
在 8.Git分支-分支的创建与合并-01 主要通过一个例子介绍了分支的新建,以及在工作中,git分支的新建切换以及使用,这里主要介绍分支的合并.这里的例子和8.Git分支-分支的创建与合并-01 的 ...
- 使用vue+ivew做2048小游戏
首先先弄页面 废话不多说 上代码 静态页面代码 <template> <div class="main"> <div class="top& ...
- scala的break和continue
scala 是没有 continue 的,但是包含 break,可以用 break 构造出 continue 的效果 这里用到了库: import scala.util.control.Breaks. ...