android全局获取当展示的activity

有时候需要再某些工具类里获取当前展示的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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43115440/article/details/89956600