• 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方法完成的

    在这里插入图片描述

  • 相关阅读:
    c语言中的fread
    B树的定义和特点
    sudo+vim+g++/gcc+makefile+进度条
    Android Material Design之SwitchMaterial(三)
    react+IntersectionObserver实现页面丝滑帧动画
    基于vue框架的4S店汽车维修保养管理系统28a7y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
    阿里云CDN缓存配置及优化-oss绑定CDN缓存自动刷新功能
    C# OpenCVSharp图像入门_给绿幕图片视频加背景
    C++ 【模板和string模拟实现】
    读取不同格式文件中的内容(xlsx,csv,txt,npz,yaml)
  • 原文地址:https://blog.csdn.net/scottb/article/details/126379325