《Andoird开发艺术探索第五章笔记》-理解RemoteView

RemoteView的应用

实现系统默认的通知栏效果:
第一步:获取状态通知栏管理:

NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);  

第二步:实例化通知栏构造器NotificationCompat.Builder:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);  

第三步:对Builder进行配置:

mBuilder.setContentTitle("测试标题")//设置通知栏标题  
    .setContentText("测试内容") /<span style="font-family: Arial;">/设置通知栏显示内容</span>  
    .setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL)) //设置通知栏点击意图  
//  .setNumber(number) //设置通知集合的数量  
    .setTicker("测试通知来啦") //通知首次出现在通知栏,带上升动画效果的  
    .setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间  
    .setPriority(Notification.PRIORITY_DEFAULT) //设置该通知优先级  
//  .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消    
    .setOngoing(false)//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)  
    .setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合  
    //Notification.DEFAULT_ALL  Notification.DEFAULT_SOUND 添加声音 // requires VIBRATE permission  
    .setSmallIcon(R.drawable.ic_launcher);//设置通知小ICON  
    Notification notify = mBuilder.getNotification();
   manager.notify(sId, notify);

参考:Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)

更新RemoteViews时,无法直接访问里面的VIew,而必须通过RemoteViews所提供的一系列方法来更新View.

RemoteView在桌面小部件的应用

本质是一个广播,可以把AppWIdgetProvider当成一个BroadcastReceiver。
其中几个方法的调用:

  • onEnable:当该窗口小部件第一次添加到桌面时调用该方法,可以添加多次但只在第一次调用
  • onUpdate ;小部件被添加时或者每次小部件更新时都会调用一次该方法,每个周期小部件自动更新一次
  • onDeleted:没删除一次桌面小部件就调用一次
  • onDisabled:当最后一个该类型的桌面小部件被删除时调用该方法,注意是最后一个
  • onReceive:这是广播内置方法,用于分发具体的事件给其他方法。

PendingIntent概述

指:PendingIntent是在将来的某个不确定的时刻发生,而Intent是立刻发生。
1. Pending支持三种待定意图:启动Activity、启动Service和发送广播
2. PendingInten匹配规则:如果两个PendingIntent它们内部的INtent相通并且requestCode也相同,那么这两个PendingIntent就是相同。
3. flags参数的含义:

  • FLAG_ONE_SHOT
    采用此标记位,那么同类的通知只能使用一次,后续的通知单击后将无法打开
  • FLAG_NO_CREATE
    描述PendingIntent不会主动创建
  • FLAG_CANCEL_CURRENT
    如果已经存在,那么他们都会被cancel,然后系统会创建一个新的PendingIntent
  • FALG_UPDATE_CURRENT
    如果已经存在,他们都会被更新

根据manager.notify(1, notigication),根据id来判断是否会弹出 P230

RemoteViews内部机制

  1. RemoteViews的构造方法:public RemoteViews(String packagetName, inte layoutId),第一个参数表示当前应用的包名,第二个参数表示待加载在的布局文件
  2. 大部分set都是通过反射来完成的,例如setInt, setLong,setBoolean,
  3. 通知栏小部件分别由Botificationmanager和AppWidgetMAnager管理,而NoticationManager和AppWIdgetManager通过BInder分别和SystemServer进程中的NoticationManagerService以及AppWidgetService进行通信。
  4. 从理论上讲系统完全可以通过BInder去支持所有的View和VIew操作,但是这样做的话代价太大,因为VIew的方法太多了,另外就是大量的IPC操作会影响效率。
  5. 所以改成提供一个Action的概念。(Action代表一个VIew操作,Action同样实现了Parcelable接口),将View操作封装到Action对象中,并传输到远程进程。
  6. 每调用一次set方法,RemoteView中会添加一个对应的Action对象,通过NoticationManager和AppWIdgetManager更新时,就会传输到远程进程依次执行。
  7. 远程进程会通过RemoteVIews的apply方法来进行VIew的更新操作,RemoteViews的apply方法内部则会去遍历所有的Action对象并调用他们的apply方法,最终View更新操作是由Action对象的apply方法来完成的。
  8. apply和Repply的区别是:apply会加载布局并更新画面,而reApply则只会更新画面。
  9. 单击 事件,RemoteView只支持发起PendingIntent,不支持onClickLIstener那种模式,还有一点要注意,setOnClickPendingIntent用于给普通VIew设置点击事件,但是不能给集合中的VIew设置单击事件。

android-art-res-charpter-5-mainActivity

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值