项目背景
假如说有这样一个需求,你有N多个页面可以播放音频,但是在这过程中可能有推送通知过来,用户在点击推送通知的情况下打开新的界面,需要把当前界面的音频关掉.假如是你,会怎样设计?
解决思路
刚开始我想过在此页面onPause,或者是onStop时则执行此页面音频的暂停方法.使音频停止播放.但是此思路的一个弊端就是,当项目正常跳转到其他页面,或用户按home键退到桌面.而不是点击推送通知时,那么我们的音频也会停止,显然这不是产品经理想看到的. 后来我又想了一种方式,那就是通过观察者模式,当activity或者fragment启动时,把他们添加为观察者,当activity或者fragment关闭时,注销其观察者.所以当此时点击推送后,逐个遍历这些观察者们,通知他们去暂停音频.
如果事情到此为止的话,也没什么好记录的.无非就是观察者模式,然后点击推送后进行通知罢了.而且在实际操作中我们还要考虑到观察者的移除假如说我们没有及时移除,那就肯定会导致activity内存泄漏了.那么如何去设计这个东西才能更方便使用呢?我们知道activity实现了LifecycleOwer接口,那我就以此作为突破口让他自动去移除和添加.
实现方案
- 设置observer缓存已经静态的添加移除及notify方法,并定义LifeCycleObserver类,使其实现onCreate和oDestory方法,具有生命周期感知能力
/**
* 作者: zhangchenzhou
* 时间: 2020/10/13-14:45
* 说明:
**/
public class PushUtils {
public static ArrayList<PushObserver> observerArrayList = new ArrayList();
public static void addPushObserver(PushObserver pushObserver){
observerArrayList.add(pushObserver);
}
public static void removeObserver(PushObserver pushObserver){
observerArrayList.remove(pushObserver);
}
private static void notifyObserver(){
for(PushObserver observer:observerArrayList){
if(observer!=null){
observer.onPushClick();
}
}
}
public abstract static class PushObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
void onCreate(){
addPushObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
void onDestory(){
removeObserver(this);
}
public abstract void onPushClick();
}
}
- 推送被点击时调用:
notifyObserver();
- 在Activity的onCreate时给activity注册lifecycleObser
//添加生命周期监听,让其自动控制推送点击监听的添加与移除
getLifecycle().addObserver(new PushUtils.PushObserver() {
@Override
public void onPushClick() {
pauseMusic();
}
});
此时每个需要获得推送点击的activity只需要执行上面的方法即可获得点击推送时暂停音乐的能力,并且在activity销毁后自动把自己移除出观察者列表.做到更加简洁的使用和更加安全的销毁.