Connor学Android - RemoteViews

在这里插入图片描述

Learn && Live

虚度年华浮萍于世,勤学善思至死不渝

前言

Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习、复盘过程,欢迎各位大佬阅读斧正!原创不易,转载请注明出处:http://t.csdn.cn/iaj0w,话不多说我们马上开始!

1 PendingIntent

1.1 PendingIntent与Intent的区别?

(1)Intent是立即使用的,而PendingIntent可以等到事件发生后触发,PendingIntent可以cancel
(2)Intent在程序结束后即终止,而PendingIntent在程序结束后依然有效
(3)PendingIntent自带Context,而Intent需要在某个Context内运行
(4)Intent在原task中运行,PendingIntent在新的task中运行

1.2 PendingIntent的三种待定意图

启动Activity、启动Service和发送Broadcast

在这里插入图片描述
requestCode:表示PendingIntent发送方的请求码,多数情况下设为0即可,另外requestCode会影响到flags的效果

flags:常见的类型有:FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT

1.3 PendingIntent的匹配规则

如果两个PendingIntent内部的Intent相同并且requestCode相同,那么两个PendingIntent就是相同的

Intent相同:ComponentName相同 + intent-filter相同,则Intent相同

1.4 flags参数的含义

FLAG_ONE_SHOT

当前PendingIntent只能被使用一次,然后会被自动cancel,如果后续还有相同的PendingIntent,那么它们的send方法就会调用失败

例如:同类通知只能点击一次,后续的通知单击后将无法打开

FLAG_NO_CREATE

当前PendingIntent不会主动创建,如果当前PendingIntent之前不存在,则getActivtiy、getService和getBroadcast会直接返回null

FLAG_CANCEL_CURRENT

当前PendingIntent如果已经存在,则会被cancel,然后系统会创建一个新的PendingIntent

例如:通知栏消息,被cancel的消息单击后无法打开

FLAG_UPDATE_CURRENT

当前PendingIntent如果已经存在,则都会被更新,即它们的Intent中的Extras会被替换成最新的

2.RemoteViews

2.1 支持的View类型

**Layout:**FrameLayout、LinearLayout、RelativeLayout、GridLayout

**View:**AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView、AdapterViewFlipper、ViewStub

RemoteViews中不能使用除了上述列表中以外的View,也无法使用自定义View

2.2 RemoteViews内部机制

通知栏和桌面小部件分别由NotificationManager和AppWidgetManager管理,两者通过Binder分别和SystemServer进程中的NotificaitionManagerService以及AppWidgetService通信,实际上是一个当前应用进程与Android系统进程的跨进程通信的场景

(1)RemoteViews会通过Binder传递到系统进程,这是因为RemoteViews实现了Parcelable接口,可以跨进程通信,系统会根据RemoteViews中的包名等信息去得到该应用的资源

(2)通过LayoutInflater去加载RemoteViews中的布局文件。在SystemServer进程中加载后的布局文件是一个普通的View

(3)系统会对View执行一系列通过set方法提交的界面更新任务。set方法对View所做的更新并不是立即执行的,在RemoteViews内部会记录所有的更新操作,具体的执行时机要等到RemoteViews被加载以后才能执行,这样RemoteViews就可以在SystemServer进程中显示了

(4)当需要更新RemoteViews时,我们需要调用一系列set方法并通过NotificationManager和AppWidgetManager提交更新任务,具体的更新操作也会在SystemServer进程中完成

考虑到View的方法太多,且大量的IPC操作会影响效率,系统没有通过Binder直接支持View的跨进程访问,而是借助Action来实现

(1)Action代表一个View操作,实现了Parcelable接口

(2)将View操作封装到Action对象并将这些对象跨进程传输到远程进程

(3)在远程进程中执行Action对象中的具体操作。每调用一次set方法,RemoteView中就会添加一个对应的Action对象,提交更新时,这些Action对象就会传输到远程进程并在远程进程中依次执行

(4)远程进程通过RemoteViews的apply方法来进行View的更新操作。这个apply方法内部会遍历所有的Action对象并调用它们的apply方法,具体的View更新操作是由Action对象的apply方法完成的

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ConnorYan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值