Android实现全局前后台监听
关于
前段时间工作的时候有一个小需求,做一个登出的监听功能并在任何界面弹窗提示,因为没有用到一些推送通知(后台接口没有添加这个功能)来判断是否被其他人登录,所以就没有用到广播机制。但是因为我们做的项目用到了视频服务是会有登录登出顶号的监听的,那是不是可以用这个来监听并通过registerActivityLifecycleCallbacks接口监听activity生命周期获取当前对应actiivty,来做全局弹窗的载体。此篇文章也会作为简易音乐博客系列的使用工具类之一。
第一步,编写activity堆栈式管理类
/**
* Created by tobey on 2021/6/7.
* activity堆栈式管理
*/
public class AppManager {
private static final String TAG = "ActivityStackManager";
//使用弱引用持有activity,防止内存泄露
private static Stack<WeakReference<Activity>> activityStack;
private static Stack<Fragment> fragmentStack;
private static AppManager instance;
private AppManager() {
}
/**
* 单例模式
*
* @return AppManager
*/
public static AppManager getAppManager() {
if (instance == null) {
instance = new AppManager();
}
return instance;
}
/**
* 获取Activity栈
* @return Activity栈
*/
public Stack<WeakReference<Activity>> getActivityStack() {
return activityStack;
}
public static Stack<Fragment> getFragmentStack() {
return fragmentStack;
}
/**
* 添加Activity到堆栈
*/
public void addActivity(WeakReference<Activity> activity) {
if (activityStack == null) {
activityStack = new Stack<>();
}
activityStack.add(activity);
}
/**
* 移除指定的Activity
*/
public void removeActivity(WeakReference<Activity> activity) {
if (activity != null) {
activityStack.remove(activity);
}
}
/**
* 是否有activity
*/
public boolean isActivity() {
if (activityStack != null) {
return !activityStack.isEmpty();
}
return false;
}
/**
* 获取当前Activity(堆栈中最后一个压入的)
*/
public Activity currentActivity() {
Activity activity = activityStack.lastElement().get();
return activity;
}
/**
* 结束当前Activity(堆栈中最后一个压入的)
*/
public void finishActivity() {
try {
WeakReference<Activity> activity = activityStack.lastElement();
finishActivity(activity);
}catch (Exception e){
Log.e(TAG, e.getMessage());
}
}
/**
* 结束指定的Activity
*/
public void finishActivity(WeakReference<Activity> activity) {
try {