勇哥的随笔记 - 生命周期管理
type: channel
link: https://blog.nas.hi.cn/tag/%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E7%AE%A1%E7%90%86/
items: 应用生命周期管理实现

应用生命周期管理实现
type: item
date: 2018-05-06T10:50:00+08:00
description: 一个问题最近被一个同行大佬问到一个小的技术点难住了，问题很简单。问：如何在所有Activity的OnResume里面打印出来Log？答：可以在所有Activity继承的BaseActivity里面OnResume方法添加打印日志。问：如果有Activity没有继承BaseActivity怎么办？如果有一些SDK里面有第三方的Activity怎么办？答：使用AOP的方式，通过正则匹配，把代码织入到指定位置。问：如果Activity使用Kotlin和Lambda表达式等其他语言混合写的，通过AOP无法织入怎么办？答：......二次学习后来大佬告诉我一个原本系统在Android 4.0（API Level 14）提供的新的接口，就是本文标题说的 ActivityLifecycleCallbacks于是到android developer官网查了下这个接口，以下就是一些心得记录下。在Android开发中Activity的管理 对于一个App是至关重要的，管理所有Activity不仅能实现在应用推出时关闭所有Activity,还能实现获取当前Activity上一个Activity、寻找某个类型的Activity、结束某个Activity，以及Activity之间的跳转等多种交互操作；除此之外还可以加入一些统计的代码，统计用户在Activity的停留时间等。使用方法在Application 的onCreate方法中使用registerActivityLifecycleCallbacks(callback)注册你的CallBack，如下：registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { mCurrentActivity = new WeakReference<>(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) { } });扩展思考学习完上个接口后，我们发现ActivityLifecycleCallbacks只能支持到Android 4.0，那针对低版本如何兼容呢？关键类 InstrumentationInstrumentation这个类平时开发的时候可能接触的比较少，但如果弄过Android组件单元测试的话应该会接触过。这个类很强大，比如通过这个类我们可以在Activity创建之前做一些我们自己的事情，比如拦截掉启动的Activity，换成另外一个Activity，再比如获取Activity的生命周期。怎么获取的Activity生命周期？在Instrumentation类中有callActivityOnCreate、callActivityOnResume等一些生命周期的方法。既然有生命周期的这些方法，那我们只要Hook Instrumentation这个类，就可以实现Activity生命周期的监听。实现方法1、首先先定义一个MyInstrumentation继承自Instrumentation，重写callActivityOnCreate、callActivityOnResume等Activity生命周期的方法代码如下：public class MyInstrumentation extends Instrumentation { @Override public void callActivityOnCreate(Activity activity, Bundle icicle) { super.callActivityOnCreate(activity, icicle); ActivityLifeMan…