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;
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值