RemoteView
使用方法我就不介绍了,网上一大堆
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相关推荐
- Android开发艺术探索读书笔记(第5章 RemoteView)
原理 RemoteView的作用是在其他进程中显示并更新view界面. 大量的IPC操作会影响效率,为了解决这个问题,系统并没有通过Binder去直接支持View的跨进程访问,而是提供了一个Actio ...
- Android App Widget中如何调用RemoteView中的函数
我们在开发App Widget时候,要创建一个RemoteView来呈现界面.但是会发现如果我们想要控制RemoteView中的view时候是无法使用findViewbyId来控制Child View ...
- 远程服务器套娃,无限套娃!RemoteView云上浏览器:运行在浏览器里的远程浏览器...
无限套娃!RemoteView云上浏览器:运行在浏览器里的远程浏览器 极一 • 2020 年 01 月 19 日 简介 RemoteView是一款部署在服务器中的远程浏览器,可以方便快捷地使用服务器的 ...
- Android中的remoteView
最近在学习中遇到了一个以前没有接触过的知识点remoteView,通过查阅资料,我发现了关于remoteView的一些相关特性. 1.RemoteView概述: 到目前为止,我发现RemoteView ...
- Android RemoteView的应用 一 桌面控件
这回通过RemoteView来制作一个能够接受点击事件的桌面控件. 1. 在res/layout 新建widget文件,这是设计桌面控件的界面 <?xml version="1.0&q ...
- 简单理解RemoteView
一.介绍 RemoteView表示的是一个View结构,他可以在其他进程中显示,由于它在其他进程中显示,为了能够更新他的界面,RemoteViews提供了一组基础的操作应用与跨进程更新它的界面. 二. ...
- RemoteView在什么地方用
RemoteView是一款可实现安卓智能手机.平板电脑远程访问和控制PC机或者服务器的远程控制软件.在办公室.家里的计算器及所要管理的各种终端机上安装代理程序,然后再智能手机.平板电脑上安装Remot ...
- remoteview android,android remoteView原理
android 中的remoteView通常用于更新远程的界面. 其实现了Paracelable接口,通过Bindler就可以传送到远程. 然后通过该类的 apply来更新界面. 其实,在我们通过该类 ...
- android remoteview 缓存,关于RemoteView的一点愚见(实现桌面小部件)
RemoteView中的应用除了有通知栏的自定义之外,还有桌面小部件也是通过RemoteView以及AppWidgetProvider来完成的. 实际上AppWidgetProvider是一个广播,即 ...
最新文章
- SAP SD交货单凭证流里的Confirmation of Service初探 II
- html表格选择一行,vue + element table表格如何默认选中第一行
- junit junit_JUnit理论简介
- nodejs中require的路径是一个文件夹时发生了什么
- 玩转 Java8 Stream,常用方法大合集
- gvim 命令行粘贴_vim基本命令之剪切复制粘贴替换
- 吃热狗游戏Java_(转)Java中正确理解Thread Local的原理与适用场景
- 3.8 51单片机-M74HC138译码器驱动8位数码管
- Arch Linux stc-isp-wine AUR 包
- 手机麦克风结构原理图_麦克风工作原理是什么
- STM32 之十二 FLASH 使用详解 及 LL 库 FLASH 驱动实现
- Android 插件化框架replugin replugin-host-library 源码解析
- 论文笔记—RGB-D SLAM in Dynamic Environments Using Static Point Weighting
- QT做的小游戏,技术成长ing(莫名押韵_dog)
- 小米手机不为人知的秘密—后台静默安装任何应用
- OnlyBill 简易记账软件(续)
- ubuntu20.04 更新后蓝牙机械键盘不可用
- C语言训练-1522-对称矩阵的判定
- SQLServer中的N是什么意思?
- 没有滴滴的顺风车,想有顺风车的滴滴