有时候需要再某些工具类里获取当前展示的activity的实例进行操作,又怕内存泄漏,然后找到这个办法:
在自定义的application类里(如MyApplication.java)注册activity生命周期监听回调:
activity生命周期监听回调:
ActivityLifecycleCallbacks callbacks = new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
ContextBean.getInstance().setActivity(activity);
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
if (activity == ContextBean.getInstance().getActivity()) {
ContextBean.getInstance().setActivity(null);
}
}
};
然后复写方法来注册监听
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
registerActivityLifecycleCallbacks(callbacks);
}
我这里使用了一个单例实体类ContextBean类来保存当前展示的activity,静态单例一般来说不应该持有activity对象,因为这样会导致内存泄漏,然而,我这个单例里只有一个activity变量,故单例模式只能保存一个activity对象,由于每进入一个activity,该单例都会调用setActivity()来保存该activity,故所保存的activity永远都是当前展示的activity。既然当前展示的activity存在,也就不算内存泄漏了。
这样,在我需要的地方只需要调用ContextBean.getInstance().getActivity()就可以获取到当前展示的activity的实例了。
附上ContextBean.java:
public class ContextBean {
private static ContextBean contextBean;
//我们保持跟目前存活的Activity一致的话,可以无视内存泄漏
private Activity activity;
public static ContextBean getInstance() {
if(contextBean == null) {
contextBean = new ContextBean();
}
return contextBean;
}
public Activity getActivity() {
return activity;
}
public void setActivity(Activity activity) {
this.activity = activity;
}
}