《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
完整开源地址:https://docs.qq.com/doc/DSkNLaERkbnFoS0ZF
和资源ID就能创建一个RemoteView。而更新RemoteView则要通过RemoteView的一系列方法比如setTextViewText,里面通过资源id来设置想要显示的内容。如果要给控件添加单击事件则要使用PendingIntent 并通过setOnClickPendingIntent来实现。最后通过Notification的contentView来布局RemoteView。
RemoteView在桌面小窗口上的应用
就是在小窗口的AppWidgetProvider中的方法去更新RemoteView。
当广播到来以后,小窗口会根据Action来通过onReceive来分发广播。
onReceive可以分发到onEnable(第一次创建时调用)、onUpdate(更新时调用)、onDelete(删除时调用)、onDisable(最后一个该类型小窗口删除时调用)。都可以操作RemoteView。
PendingIntent的描述
PendingIntent表示一种处于pending状态的意图。就是表示接下来有一个intent(意图)在某个时候发生。PendingIntent的适用场景是给RemoteView添加点击事件,因为RemoteView不能直接像View那样更改UI,所以我们必须要设置PendingIntent,PendingIntent通过send和cancel方法来发送和取消特定的Intent。
Pending有三种待定意图:启动Activity(未加载时候的意图)、启动服务、发送广播,对应三个接口:
方法参数中第一个和第三个好理解,第二个requestCode为请求码,一般设为0即可。首先要了解两个PendingIntent什么时候是相同的:就是他们的requestCode和Intent都相同,则这两个是相同的。而Intent什么时候是相同的:当他们CompentName和intent-filter相同,就算Extras不同(Extras不参与匹配过程)则两个Intent相同。接下来通过这些匹配规则来了解第四个参数flags:
(1)FLAG_ONE_SHOT
当前描述的PendingIntent只能使用一次,然后它就会被自动cancel,如果后续还有相同PendingIntent则它们的send方法就会失效。即同类的通知只能使用一次后续的通知单击后无法打开。
(2)FLAG_NO_CREATE
当前描述的PendingIntent不会主动创建,如果当前PendingIntent不存在,则getActivity、getService、getBroadcast都会返回null。日常开发基本用不到
(3)FLAG_CANCEL_CURRENT
当前描述的PendingIntent如果已经存在,那么它就会被cancel,然后系统就会新创建一个PendingIntent,对于通知栏来说,那些已经cancel的通知被单击后无法打开。
(4)FLAG_UPDATE_CURRENT
当前的PendingIntent如果已存在,那么它将被更新。即它们Intent中的Extras会被替换成最新的。
manager.notify(1,notification)如果第一个参数id是一个常量,那么多次调用notify只能弹出一个通知,后续的通知会把前面的通知替代掉,如果每次的id都不同,那么多次调用notify会弹出多个通知。而这个id可以是上述的4个flags,这时候的单击效果就和上述的一样了。