您当前的位置: 首页 >  面试
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Android面试:如何能保证随时随地都能拿到一个 Activity 的当前生命周期

沙漠一只雕得儿得儿 发布时间:2021-03-13 15:26:25 ,浏览量:0

方式一:使用生命周期回调

1、Application中registerActivityLifecycleCallbacks注册Activity生命周期回调

public class App extends MultiDexApplication {
   
 
    @Override
    public void onCreate() {
        super.onCreate();
    
 
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            }
            @Override
            public void onActivityStarted(Activity activity) {
            }
            @Override
            public void onActivityResumed(Activity activity) {
                MyActivityManager.getInstance().setCurrentActivity(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) {
            }
        });
    }   
 
}

2、ActivityMananager对Activity进行保存,使用WeakReference防止内存泄漏

public class MyActivityManager {
    private static MyActivityManager sInstance = new MyActivityManager();
 
    private WeakReference sCurrentActivityWeakRef;
 
 
    private MyActivityManager() {
 
    }
 
    public static MyActivityManager getInstance() {
        return sInstance;
    }
 
    public Activity getCurrentActivity() {
        Activity currentActivity = null;
        if (sCurrentActivityWeakRef != null) {
            currentActivity = sCurrentActivityWeakRef.get();
        }
        return currentActivity;
    }
 
    public void setCurrentActivity(Activity activity) {
        sCurrentActivityWeakRef = new WeakReference(activity);
    }
 
}

 

方式二:Jetpack的LifeCycle获取生命周期

Lifecycle获取Activity和Fragment生命周期,可以参考下LifeCycle的使用方法:

方式三:使用AOP的方式打印当前activity的生命周期

首先追踪了Activity生命周期的调用到底来自何处, 在Activity的onCreate方法中瞧见

 

getApplication().dispatchActivityCreated(this, savedInstanceState);

去Application类中找dispatchActivityCreated方法

 

void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
    Object[] callbacks = collectActivityLifecycleCallbacks();
    if (callbacks != null) {
        for (int i=0; i activityLifecycleCallbacksClass = Class.forName("android.app.Application$ActivityLifecycleCallbacks");
            //创建一个ActivityLifecycleCallbacks的实现对象
            final VirtualActivityLifecycleCallbacks callbacks = new VirtualActivityLifecycleCallbacks();
            //创建一个ActivityLifecycleCallbacks的代理对象
            Object proxyActivityLifecycleCallbacks =
                    Proxy.newProxyInstance(activityLifecycleCallbacksClass.getClassLoader(),
                            new Class[]{activityLifecycleCallbacksClass},
                            new InvocationHandler() {
                                @Override
                                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                                    Log.i(TAG, activity.getClass().getSimpleName() + "---" + method.getName());
                                    return method.invoke(callbacks, args);
                                }
                            });
            //将代理对象添加到callbacksList集合中
            callbacksList.add((Application.ActivityLifecycleCallbacks) proxyActivityLifecycleCallbacks);

        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

 

    /**
     * 创建ActivityLifecycleCallbacks的实现类
     */
    private static class VirtualActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        }

        @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) {
        }
    }

我们只需要在基类Activity的onCreate方法中调用 LifeCycleListenerHelper.hook(this);

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.0385s