(十一)RemoteViews的使用解析

使用场景:桌面小部件和通知栏。

PendingIntent:待定的意图。
  支持三种待定意图:getActivity(Context context,int requsetCode,Intent intent,int Flag)相当于Context.startActivity(intent)
                                getService(Context context,int requsetCode,Intent intent,int Flag)相当于Context.startService(intent)
                                getBroadcast(Context context,int requsetCode,Intent intent,int Flag)相当于Context.startBroadcast(intent)

注:requsetCode多数情况下设置为0即可,他会影响到flags的效果。

PendingIntent的匹配规则:requestCode相同 ,内部Intent相同:ComponentName和intent-filter都相同,Extras不参与匹配。

flags分类:
    FLAG_ONE_SHOT : PendingIntent只能被使用一次,就会被自动cancel。后续相同的PendingIntent的send方法会失效。
    FLAG_NO_CREATE : 当前描述的PendingIntent不会主动创建,如果之前不存在,getXXX方法返回null。不怎么使用
    FLAG_CANCEL_CURRENT: 当前描述的PendIntent若已经存在,那么他们都会被cancel,然后系统创建新的,被cancel的将不会被打开
    FLAG_UPDATE_CURRENT: 当前描述的PendIntent若已经存在,会被更新。数据会被替换成新的。


RemoteView的内部机制
 
RemoteView只支持特定的View。
     布局:Framelayout、LinearLayout、RelativeLayout、GridLayout。
     View:Button  、ListView、GridView、ImageButton、ImageView、TextView、ViewStub、ProgressBar等。

首先RemoteView会通过Binder传递到SystemServer进程,系统会根据RemoteViews的包名等信息去得到相应的资源。然后通过LayoutInflate去加载RemoteViews中的布局文件,在SystemServer中加载后的布局文件只是一个普通的View,相对于我们的进程它是RemoteViews,接着系统会对他进行一系列的更新操作,是通过set提交的。但set方法对界面更新并不立即执行,在RemoteView的内部会记录所有的更新操作,等RemoteViews被加载后才会执行,这样RemoteViews就可以在SystemServer中显示了。

每个set操作会封装到RemoteViews内部的Action中,在远程进程中会通过RemoteViews的Action的apply方法和reApply方法。
apply和reAppLY方法异同:apply加载布局更新界面,reApply方法只更新界面。内部通过反射方式来调用所需的方法。






构造函数:




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值