这里写一个准备一个关闭所有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();
}
}
}
}
这个.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 !你可以释放资源了。