• Activity的isFinishing()判断Activity的状态


    这里写一个准备一个关闭所有Activity的ActivityCollector
    Activity的isFinishing()判断Activity的状态

    public class ActivityCollector {
        private static List<Activity> activities = new ArrayList<Activity>();
        public static void addActivity(Activity activity) {
            activities.add(activity);
        }
        public static void removeActivity(Activity activity) {
            activities.remove(activity);
        }
        public static void finishAll() {
            for (Activity activity : activities) {
                if (!activity.isFinishing()) {
                    activity.finish();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这个.finish()和.isFinishing()?

    在Activity中调用finish()或按返回键退出时,若有资源被其他对象引用不能释放(如context被某个单例对象引用或正在线程中被使用),则activity不会被调用onDestory()方法。

    isFinishing() 可用来判断Activity是否处于活跃状态(false)还是等待回收状态(true)。

    只有onDestroy()方法被调用后它才返回true

    关于onDestory()的调用:

    如果 activity 实现了一个回调接口,然后使用 this 设置给需要回调接口的方法,这种应用场景比较常见,最常见的就是实现 onClickListener 接口,然后 findViewById().setOnClickListenr(this) 【最常用】

    如果,这个回调接口设置到了一个静态对象(单例模式),当 activity finish() 的时候(按返回键,回到桌面),则activity 不会被调用 onDestroy() ,原因可能是 activity 对象还在被引用!

    此时你再点击图标回到应用,onCreate() 再次调用!

    很明显,如果你把资源释放放在了 onDestroy() 里面,就会导致内存泄露!

    网上找到的解决方法:

    你可以在 onPause() 方法里面判断 isFinishing() ,正常调用 finish() 后 activity 的回调过程是 onPause、onStop、onDestroy ,倘若出现上面的情况,只到 onPause!但是 isFinishing() 标志还是为 true !你可以释放资源了。

  • 相关阅读:
    大模型系统和应用——高效训练&模型压缩
    Vue2和Vue3的区别
    CG MAGIC分享3ds Max卡顿未保存处理方法有哪些?
    《JAVA EE》内部类(上篇)
    实践自定义弹框列表数据 slot 操作数据
    python的中秋之美
    分布式事务-TCC
    六、Spring Boot 整合 NoSQL(1)
    ORA-00600 【3948】,ORA-00600 【3949】
    深入理解 Flutter 图片加载原理
  • 原文地址:https://blog.csdn.net/weixin_43798721/article/details/127858906