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