使用方法我就不介绍了,网上一大堆

1.PendingIntent概述

PendingIntent表示在将来的某个时刻发生,Intent是立即发生。
PendingIntent的匹配规则:如果两个PendingIntent它们内部的Intent相同并且requestCode也相同,那么这两个PendingIntent就是相同的(如果两个Intent的ComponentName和intent-filter都相同,那么这两个Intent就是相同的,Extras不参与Intent匹配)。

PendingIntent支持三种待定意图

第一个和第三个参数好理解,第二个参数requestCode表示PendingIntent发送方的请求码,通常为0.另外requestCode会影响后面flag的取值。
flag有如下取值:

2.RemoteViews的内部机制

进入源码

class RemoteViews implements Parcelable, Filter

它实现了Parcelable接口,显然和跨进程通信有关
然后看一下最常用的构造方法

public RemoteViews(String packageName, int layoutId)

packageName表示当前应用的包名
layoutId对应的布局文件
RemoteViews只支持如下类型

Layout:
FrameLayout,LinearLayout,RelativeLayout,GridLayout
View:
AnalogClock,Button,Chronometer,ImageButton,ImageView,ProgressBar,TextView,ViewFlipper,ListView,GridView,StackView,AdapterViewFlipper,ViewStub

首先讲讲内部实现机制

通知栏和桌面小部件分别由NotificationManager和AppWidgetManager管理。而NotificationManager和AppWidgetManager通过binder分别和SystemServer进程中的NotificationManagerService和AppWidgetService进行通信。由此可见通知栏和桌面小部件是在NotificationManagerService和AppWidgetService被加载,然后运行在SystemServer中

首先RemoteViews通过Binder传递到SystemServer中(实现了Parcelable接口,可以跨进程传输)。系统根据包名得到资源,然后通过layoutinflater加载布局文件。(在SystemServer算一个普通的view,而在我们的进程中算RemoteViews)然后会有一系列set方法更新view,但不会立即执行,而是会保存下来,直到RemoteViews被加载以后再执行。

理论上来讲,系统可以让binder直接支持所有操作,但是大量IPC操作会影响效率

由于RemoteViews是在远程进程中显示,所以无法用findviewbyid,通常用set方法,比如setTextViewText()。接下来看一下它的源码

    public void setTextViewText(int viewId, CharSequence text) {setCharSequence(viewId, "setText", text);}

再看一下setCharSequence源码

    public void setCharSequence(int viewId, String methodName, CharSequence value) {addAction(new ReflectionAction(viewId, methodName, ReflectionAction.CHAR_SEQUENCE, value));}

再看一下addAction源码

    private void addAction(Action a) {if (hasLandscapeAndPortraitLayouts()) {throw new RuntimeException("RemoteViews specifying separate landscape and portrait" +" layouts cannot be modified. Instead, fully configure the landscape and" +" portrait layouts individually before constructing the combined layout.");}if (mActions == null) {mActions = new ArrayList<Action>();}mActions.add(a);// update the memory usage statsa.updateMemoryUsageEstimate(mMemoryUsageCounter);}

这下可以看到里面有一个ArrayList专门用来存储Action的。但是显然现在只是把Action保存起来,并没有对view进行实际操作啊。之前说过了“会保存下来,知道RemoteViews被加载以后再执行”
接下来看一个apply函数

    public View apply(Context context, ViewGroup parent, OnClickHandler handler) {RemoteViews rvToApply = getRemoteViewsToApply(context);View result;final Context contextForResources = getContextForResources(context);Context inflationContext = new ContextWrapper(context) {@Overridepublic Resources getResources() {return contextForResources.getResources();}@Overridepublic Resources.Theme getTheme() {return contextForResources.getTheme();}};LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);inflater = inflater.cloneInContext(inflationContext);inflater.setFilter(this);result = inflater.inflate(rvToApply.getLayoutId(), parent, false);rvToApply.performApply(result, parent, handler);return result;}

apply先加载resources,然后解析remoteview的布局,最后调用performApply

    private void performApply(View v, ViewGroup parent, OnClickHandler handler) {if (mActions != null) {handler = handler == null ? DEFAULT_ON_CLICK_HANDLER : handler;final int count = mActions.size();for (int i = 0; i < count; i++) {Action a = mActions.get(i);a.apply(v, parent, handler);}}}

可以看到,这里才是对view的真正操作

RemoteView相关推荐

  1. Android开发艺术探索读书笔记(第5章 RemoteView)

    原理 RemoteView的作用是在其他进程中显示并更新view界面. 大量的IPC操作会影响效率,为了解决这个问题,系统并没有通过Binder去直接支持View的跨进程访问,而是提供了一个Actio ...

  2. Android App Widget中如何调用RemoteView中的函数

    我们在开发App Widget时候,要创建一个RemoteView来呈现界面.但是会发现如果我们想要控制RemoteView中的view时候是无法使用findViewbyId来控制Child View ...

  3. 远程服务器套娃,无限套娃!RemoteView云上浏览器:运行在浏览器里的远程浏览器...

    无限套娃!RemoteView云上浏览器:运行在浏览器里的远程浏览器 极一 • 2020 年 01 月 19 日 简介 RemoteView是一款部署在服务器中的远程浏览器,可以方便快捷地使用服务器的 ...

  4. Android中的remoteView

    最近在学习中遇到了一个以前没有接触过的知识点remoteView,通过查阅资料,我发现了关于remoteView的一些相关特性. 1.RemoteView概述: 到目前为止,我发现RemoteView ...

  5. Android RemoteView的应用 一 桌面控件

    这回通过RemoteView来制作一个能够接受点击事件的桌面控件. 1. 在res/layout 新建widget文件,这是设计桌面控件的界面 <?xml version="1.0&q ...

  6. 简单理解RemoteView

    一.介绍 RemoteView表示的是一个View结构,他可以在其他进程中显示,由于它在其他进程中显示,为了能够更新他的界面,RemoteViews提供了一组基础的操作应用与跨进程更新它的界面. 二. ...

  7. RemoteView在什么地方用

    RemoteView是一款可实现安卓智能手机.平板电脑远程访问和控制PC机或者服务器的远程控制软件.在办公室.家里的计算器及所要管理的各种终端机上安装代理程序,然后再智能手机.平板电脑上安装Remot ...

  8. remoteview android,android remoteView原理

    android 中的remoteView通常用于更新远程的界面. 其实现了Paracelable接口,通过Bindler就可以传送到远程. 然后通过该类的 apply来更新界面. 其实,在我们通过该类 ...

  9. android remoteview 缓存,关于RemoteView的一点愚见(实现桌面小部件)

    RemoteView中的应用除了有通知栏的自定义之外,还有桌面小部件也是通过RemoteView以及AppWidgetProvider来完成的. 实际上AppWidgetProvider是一个广播,即 ...

最新文章

  1. SAP SD交货单凭证流里的Confirmation of Service初探 II
  2. html表格选择一行,vue + element table表格如何默认选中第一行
  3. junit junit_JUnit理论简介
  4. nodejs中require的路径是一个文件夹时发生了什么
  5. 玩转 Java8 Stream,常用方法大合集
  6. gvim 命令行粘贴_vim基本命令之剪切复制粘贴替换
  7. 吃热狗游戏Java_(转)Java中正确理解Thread Local的原理与适用场景
  8. 3.8 51单片机-M74HC138译码器驱动8位数码管
  9. Arch Linux stc-isp-wine AUR 包
  10. 手机麦克风结构原理图_麦克风工作原理是什么
  11. STM32 之十二 FLASH 使用详解 及 LL 库 FLASH 驱动实现
  12. Android 插件化框架replugin replugin-host-library 源码解析
  13. 论文笔记—RGB-D SLAM in Dynamic Environments Using Static Point Weighting
  14. QT做的小游戏,技术成长ing(莫名押韵_dog)
  15. 小米手机不为人知的秘密—后台静默安装任何应用
  16. OnlyBill 简易记账软件(续)
  17. ubuntu20.04 更新后蓝牙机械键盘不可用
  18. C语言训练-1522-对称矩阵的判定
  19. SQLServer中的N是什么意思?
  20. 没有滴滴的顺风车,想有顺风车的滴滴

热门文章

  1. 熟悉,掌握,精通? BOSS直聘你真棒!
  2. 2023.1.1单词打卡
  3. Win10自带的重装系统方法(云重装)
  4. MUI 引用阿里字体图标
  5. Jvm的堆、栈和数据结构的堆、栈的区别
  6. 用C语言编写简单的计算器
  7. 新版edge浏览器读取谷歌浏览器上的历史记录
  8. 成绩分级——switch
  9. java @Override is not allowed when implementing interface method
  10. latex 作者名上的邮件符号_Latex作者单位的写法—AND 首页脚注