5_理解RemoteViews

RemoteViews表示的是一个View机构,它可以在其他进程中显示,由于它在其他进程中显示,为了能够更新它的界面,RemoteViews提供了一组基础的操作作用于跨进程更新它的界面。RemoteViews在android中使用场景有两种:通知栏和桌面小部件。

桌面小部件是通过AppWidgetProvider来实现的,AppWidgetProvider本质上是一个广播。通知栏和桌面小工具都会用到RemoteViews,它们在更新界面时无法像在Activity直接更新界面。

//PendingIntent.FLAG_CANCEL_CURRENT 如果当前系统已经存在相同的PendingInIntent,那么先将已有的PendingIntent取消掉然后重新生成一个PendingIntent对象。

//PendingIntent.FLAG_NO_CREATE 如果当前系统不存在相同的PendingIntent对象,系统不会创建该PendingIntent对象而是返回null.

//PendingIntent.FLAG_ONE_SHOT 该PendingIntent只作用一次

//PendingIntent.FLAG_UPDATE_CURRENT  如果系统中已经存在该PendingIntent对象,那么系统将保留该PendingIntent对象,但会使用新的Intent来更新之前PendingIntent中的Intent对象数据。
RemoteViews在桌面小部件上的应用

AppWidgetProvider是android中提供的用于实现桌面小部件的类,其本质是一个广播,即BroadcastReceiver。

5.1.3 pendingIntent概述

pendingIntent表示一种处于pending状态的意图,而pending状态表示的是一种特定、等待即将发生的意图,PendingIntent通过send和cancel方法来发送和取消特定Intent。

如果notify方法的id是常量,那么不管PendingIntent是否匹配,后面的通知会直接替换前面的通知。

如果notify方法的id每次都不同,那么当PendingIntent不匹配时,这里的匹配是指PendingIntent中Intent相同并且requestCode相同,在这种情况下不管采用何种标记,这些通知互不干扰。如果PendingIntent处于匹配状态时,这个时候要分情况讨论:如果采用了FLAG_ONE_SHOT标记位,那么后续通知中的PendingIntent会和第一条通知保持完全一致,包括其中的Extras,单击任一条通知后,剩下的通知均无法再打开,当所有的通知被清除后,会再次重复这个过程;如果采用FLAG_CANCEL_CURRENT标记位,之前存在的PendingIntent都会被cancel掉,只有最新的通知才会被打开。如果是FLAG_UPADTE_CURRENT标记位,之前的PendingIntent会被更新,最终和最新的一条通知完全一致,并且这些通知都可以打开的。

RemoteViews没有提供findViewById方法,因此无法直接访问里面的view元素,而必须通过RemoteViews所提供的一系列set方法来完成。大部分方法是通过反射来完成的。

通知栏和桌面小部件分别由NotificationManager和AppWidgetManager通过Binder分别和SystemServer进程中的NotificationManagerService以及AppWidgetServer进行通信。因此,通知栏和桌面小部件中的布局文件实际上是在NotificationManagerServer以及AppWidgetServer中被加载的,而它们运行在系统的SystemServer中,这就就和我们的进程构成了跨进程通信的场景。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值