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

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

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<Activity> 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>(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<callbacks.length; i++) {
            ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                    savedInstanceState);
        }
    }
}

再去查找onActivityCreated方法,有种莫名的伤感

public interface ActivityLifecycleCallbacks {
    void onActivityCreated(Activity activity, Bundle savedInstanceState);
    void onActivityStarted(Activity activity);
    void onActivityResumed(Activity activity);
    void onActivityPaused(Activity activity);
    void onActivityStopped(Activity activity);
    void onActivitySaveInstanceState(Activity activity, Bundle outState);
    void onActivityDestroyed(Activity activity);
}

原来Application中有所有和Activity生命周期相关的方法, 以前怎么没注意,接下来该怎么做?

根据hook机制,我们得获取ActivityLifecycleCallbacks对象,并且需要创建持有ActivityLifecycleCallbacks对象的代理,最后将代理对象添加到ActivityLifecycleCallbacks集合中

一.获取ActivityLifecycleCallbacks对象

//获取到Application中的mActivityLifecycleCallbacks字段
            Field activityLifecycleCallbacksField = Application.class.getDeclaredField("mActivityLifecycleCallbacks");
            //保证访问权限
            activityLifecycleCallbacksField.setAccessible(true);
            //获取当前activity的application对象
            Application application = activity.getApplication();

            //和Activity生命周期相关的持有者集合,通过反射机制获得
            ArrayList<Application.ActivityLifecycleCallbacks> callbacksList =
                    (ArrayList<Application.ActivityLifecycleCallbacks>) activityLifecycleCallbacksField.get(application);

            //获取activityLifecycleCallbacksClass类
            Class<?> activityLifecycleCallbacksClass = Class.forName("android.app.Application$ActivityLifecycleCallbacks");
            //创建一个ActivityLifecycleCallbacks的实现对象
            final VirtualActivityLifecycleCallbacks callbacks = new VirtualActivityLifecycleCallbacks();

二.创建持有ActivityLifecycleCallbacks对象的代理

//创建一个ActivityLifecycleCallbacks的代理对象
Object proxyActivityLifecycleCallbacks =
             Proxy.newProxyInstance(activityLifecycleCallbacksClass.getClassLoader(),
                            new Class[]{activityLifecycleCallbacksClass},
                            new InvocationHandler() {
                                @Override
                                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                                    return method.invoke(callbacks, args);
                                }
                            });

三.将代理对象添加到callbacksList集合中

callbacksList.add((Application.ActivityLifecycleCallbacks) proxyActivityLifecycleCallbacks);

完整代码如下:

public static void hook(Activity activity) {
        try {
            //获取到Application中的mActivityLifecycleCallbacks字段
            Field activityLifecycleCallbacksField = Application.class.getDeclaredField("mActivityLifecycleCallbacks");
            //保证访问权限
            activityLifecycleCallbacksField.setAccessible(true);
            //获取当前activity的application对象
            Application application = activity.getApplication();

            //和Activity生命周期相关的持有者集合,通过反射机制获得
            ArrayList<Application.ActivityLifecycleCallbacks> callbacksList =
                    (ArrayList<Application.ActivityLifecycleCallbacks>) activityLifecycleCallbacksField.get(application);

            //获取activityLifecycleCallbacksClass类
            Class<?> 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);

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/114748447