如何监控Activity的生命周期

如何在任意的地方监控指定的Activity的生命周期呢,首先想到的方式就是创建一个BaseActivtiy,让所有的Activity都继承自BaseActivity,当然这样也可以实现,就是比较麻烦一点,以下我会把两种方式都实现来对比一下(完整代码附在最后):

首先用BaseActivity的方式,我们需要一个全局的map存储对应Activity的监听器,每个Activity维护一个监听器列表,这样可以保证前后设置不会覆盖,互不干扰:


    public static final HashMap<Activity, List<LifecycleCallback>> lifecycleListeners = new HashMap<>();

    public static void addLifecycleListener(Activity activity, LifecycleCallbackAdapter callbackAdapter) {
        if (activity == null || callbackAdapter == null)
            return;
        List<LifecycleCallback> callbacks = lifecycleListeners.get(activity);
        if (callbacks == null) {
            ArrayList<LifecycleCallback> calllist = new ArrayList<>();
            calllist.add(callbackAdapter);
            lifecycleListeners.put(activity, calllist);
        } else {
            callbacks.add(callbackAdapter);
        }
    }

然后新建BaseActivity在Activity每个生命周期里面找到该Activity对应的监听器列表去遍历回调,这样确实复杂一点,为了节省代码,新建一个枚举类(这是个错误的示范,我是想练习一下敲代码。别跟我学,大家可以用字符串),代表回调方法的名称,如下:

public enum ActivityStateEnum {

    ON_CREATE("onCreate"),
    ON_START("onStart"),
    ON_RESUME("onResume"),
    ON_PAUSE("onPause"),
    ON_STOP("onStop"),
    ON_DESTROY("onDestroy");

    String methodName;

    ActivityStateEnum(String methodName) {
        this.methodName = methodName;
    }

    public String getMethodName() {
        return methodName;
    }
}

然后回到BaseActivity来回调添加的监听器,这里图省事,用了反射:

public class BaseActivity extends AppCompatActivity {

    public final static ArrayList<Activity> activities = new ArrayList<>();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        callbackLifecycle(ActivityStateEnum.ON_CREATE);
    }

    @Override
    protected void onStart() {
        super.onStart();
        callbackLifecycle(ActivityStateEnum.ON_START);
    }

    @Override
    protected void onResume() {
        super.onResume();
        callbackLifecycle(ActivityStateEnum.ON_RESUME);
    }
    // ...... 剩下的回调我就不多写了,以此类推


    private void callbackLifecycle(ActivityStateEnum state) {
        // 查找Activity 是否有设置回调监控
        List<ActivityPluginUtil.LifecycleCallback> callbacks = ActivityPluginUtil.lifecycleListeners.get(this);
        if (callbacks != null && callbacks.size() > 0) {
            for (ActivityPluginUtil.LifecycleCallback callback : callbacks) {
                if (callback != null) {
                    // 反射获取方法名 直接调用对应的回调
                    Class<?> clazz = callback.getClass();
                    Method method = null;
                    try {
                        method = clazz.getDeclaredMethod(state.getMethodName(), Activity.class);
                        method.setAccessible(true);
                        method.invoke(callback, this);

                        Log.e("callbackLifecycle","反射调用成功->"+state.getMethodName());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

这就是第一种方式监控生命周期,确实比较麻烦,接下来上强度:可以引入Google官方推荐的Jetpack组件 Lifecycle 来监控,具体实现方法很简单:

if (activity instanceof LifecycleOwner) {
    ((LifecycleOwner) activity).getLifecycle().addObserver(new LifecycleEventObserver() {
        @Override
        public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
            if (event == Lifecycle.Event.ON_CREATE) {
               
            } else if (event == Lifecycle.Event.ON_START) {
                
            } else if (event == Lifecycle.Event.ON_RESUME) {
                
            } else if (event == Lifecycle.Event.ON_PAUSE) {
               
            } else if (event == Lifecycle.Event.ON_STOP) {
                
            } else if (event == Lifecycle.Event.ON_DESTROY) {
                
            }
        }
    });
}

这种方式实现起来很简单,没有那么多的代码逻辑,只需要注意测一个观察者就可以监控到Activity的生命周期,原理也比较简单,看源码可以发现他的实现原理是在Activity添加了一个Fragment,通过ReportFragment的生命周期给观察者分发,实现了对Activity无代码入侵,达到了解耦的效果,非常方便,不得不说角度很厉害:

如果需要详细了解的可以去看看源码,这里不多说了,下面附上源码:

Github Demo请点我

源代码写在最后:

import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 监控 Activity 生命周期
 */
public class ActivityPluginUtil {

    public static final HashMap<Activity, List<LifecycleCallback>> lifecycleListeners = new HashMap<>();

    public static void addLifecycleListener(Activity activity, LifecycleCallbackAdapter callbackAdapter) {
        if (activity == null || callbackAdapter == null)
            return;
        if (activity instanceof LifecycleOwner) {
            ((LifecycleOwner) activity).getLifecycle().addObserver(new LifecycleEventObserver() {
                @Override
                public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
                    if (event == Lifecycle.Event.ON_CREATE) {
                        callbackAdapter.onCreate(activity);
                    } else if (event == Lifecycle.Event.ON_START) {
                        callbackAdapter.onStart(activity);
                    } else if (event == Lifecycle.Event.ON_RESUME) {
                        callbackAdapter.onResume(activity);
                    } else if (event == Lifecycle.Event.ON_PAUSE) {
                        callbackAdapter.onPause(activity);
                    } else if (event == Lifecycle.Event.ON_STOP) {
                        callbackAdapter.onStop(activity);
                    } else if (event == Lifecycle.Event.ON_DESTROY) {
                        callbackAdapter.onDestroy(activity);
                    }
                }
            });
        } else {
            List<LifecycleCallback> callbacks = lifecycleListeners.get(activity);
            if (callbacks == null) {
                ArrayList<LifecycleCallback> calllist = new ArrayList<>();
                calllist.add(callbackAdapter);
                lifecycleListeners.put(activity, calllist);
            } else {
                callbacks.add(callbackAdapter);
            }
        }
    }

    public static class LifecycleCallbackAdapter implements LifecycleCallback {
        @Override
        public void onCreate(Activity activity) { }

        @Override
        public void onStart(Activity activity) { }

        @Override
        public void onResume(Activity activity) { }

        @Override
        public void onPause(Activity activity) { }

        @Override
        public void onStop(Activity activity) { }

        @Override
        public void onDestroy(Activity activity) { }
    }

    public interface LifecycleCallback {
        void onCreate(Activity activity);
        void onStart(Activity activity);
        void onResume(Activity activity);
        void onPause(Activity activity);
        void onStop(Activity activity);
        void onDestroy(Activity activity);
    }
}
public enum ActivityStateEnum {

    ON_CREATE("onCreate"),
    ON_START("onStart"),
    ON_RESUME("onResume"),
    ON_PAUSE("onPause"),
    ON_STOP("onStop"),
    ON_DESTROY("onDestroy");

    String methodName;

    ActivityStateEnum(String methodName) {
        this.methodName = methodName;
    }

    public String getMethodName() {
        return methodName;
    }
}

public class BaseActivity extends AppCompatActivity {

    private final Handler handler = new Handler(Looper.getMainLooper());
    public final static ArrayList<Activity> activities = new ArrayList<>();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activities.add(this);
        callbackLifecycle(ActivityStateEnum.ON_CREATE);
    }

    @Override
    protected void onStart() {
        super.onStart();
        callbackLifecycle(ActivityStateEnum.ON_START);
    }

    @Override
    protected void onResume() {
        super.onResume();
        callbackLifecycle(ActivityStateEnum.ON_RESUME);
    }
    // 剩下的回调我就不多写了,以此类推

    @Override
    protected void onPause() {
        super.onPause();
        callbackLifecycle(ActivityStateEnum.ON_PAUSE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        callbackLifecycle(ActivityStateEnum.ON_STOP);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        activities.remove(this);
        callbackLifecycle(ActivityStateEnum.ON_DESTROY);
    }

    private void callbackLifecycle(ActivityStateEnum state) {
        // 查找Activity 是否有设置回调监控
        List<ActivityPluginUtil.LifecycleCallback> callbacks = ActivityPluginUtil.lifecycleListeners.get(this);
        if (callbacks != null && callbacks.size() > 0) {
            for (ActivityPluginUtil.LifecycleCallback callback : callbacks) {
                if (callback != null) {
                    // 反射获取方法名 直接调用对应的回调
                    Class<?> clazz = callback.getClass();
                    Method method = null;
                    try {
                        method = clazz.getDeclaredMethod(state.getMethodName(), Activity.class);
                        method.setAccessible(true);
                        method.invoke(callback, this);

                        Log.e("callbackLifecycle","反射调用成功->"+state.getMethodName());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public void showToast(CharSequence message) {
        if (Looper.myLooper() != Looper.getMainLooper()) {
            handler.post(() -> showToast(message));
            return;
        }
        try {
            Toast toast = new Toast(this);
            toast.setDuration(Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.CENTER, 0, 0);
            View view = LayoutInflater.from(this).inflate(R.layout.common_toast_layout, null);
            ((TextView) view.findViewById(R.id.message)).setText(message);
            toast.setView(view);
            toast.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static Activity getTopActivity() {
        if (activities.isEmpty())
            return null;
        return activities.get(activities.size() - 1);
    }
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: activityAndroid中的一个组件,用于构建用户界面和处理用户交互。其工作流程如下: 1. 创建activity:当用户启动应用程序或从其他activity转换到当前activity时,系统会创建一个新的activity实例。 2. 加载布局:activity创建后,系统会加载与之关联的布局文件,并将其显示在屏幕上。 3. 处理用户交互:用户与activity交互时,系统会调用相应的回调方法,例如onCreate、onStart、onResume等。 4. 处理生命周期:当用户离开当前activity或者屏幕被覆盖时,系统会调用相应的回调方法,例如onPause、onStop、onDestroy等。 5. 保存和恢复状态:当activity被销毁并重新创建时,系统会保存和恢复其状态,以确保用户体验的连续性。 总之,activityAndroid应用程序中最重要的组件之一,负责处理用户界面和用户交互,同时也需要处理生命周期和状态保存等问题。 ### 回答2: activity工作流程是指在软件开发过程中,将一个复杂的业务流程拆分成一系列的简单的活动或任务,并通过定义这些活动之间的逻辑关系,实现任务的协作和执行。 首先,需要明确定义业务流程的目标和要求。然后,通过业务分析,将业务流程拆分成各个子任务或活动,并确定它们的执行顺序和依赖关系。 接下来,需要对每个活动进行详细设计和实现。这包括确定活动的输入和输出,定义活动所需的资源和工具,以及编写执行该活动的代码。 在实际执行过程中,根据活动之间的关系,可以采用串行、并行或条件分支的方式来组织活动的执行顺序。每个活动在执行时,需要根据预设条件进行判断,确定是否满足执行条件。如果满足条件,则执行该活动;如果不满足条件,则等待条件满足后再执行。 在活动执行过程中,还需要及时记录活动的执行结果和状态,并根据需要进行相应的处理。如果某个活动执行失败,可以根据事先定义的异常处理策略,进行异常处理,并进行相应的后续操作。 最后,根据整个业务流程的执行结果,进行相应的汇总和统计,并输出相应的报告或结果。 总结来说,activity工作流程是通过将复杂的业务流程拆分成若干个简单的活动,并通过定义它们之间的逻辑关系和执行顺序,实现业务流程的自动化执行和协作。它可以提高工作效率,减少人为操作的错误,并方便对业务流程进行管理和监控。 ### 回答3: Activity工作流程是一种流行的、灵活的工作流程管理框架。它适用于各种类型的应用程序,包括企业、电子商务和科学应用。下面是Activity工作流程的详细解释。 Activity工作流程由一系列活动(Activity)组成,这些活动表示可以在应用程序中执行的任务或操作。每个活动都有一个特定的目标,并且通常是按照特定的顺序进行的。 工作流程开始于一个起始活动(Start Activity),表示工作流程的起点。然后,根据定义的规则和条件,系统将根据不同的条件选择执行不同的活动。 在Activity工作流程中,活动可以是串行的(Sequential),也可以是并行的(Parallel)。串行活动按顺序执行,而并行活动可以同时执行。这使得Activity工作流程非常灵活,可以适应各种业务场景的需求。 每个活动都可以定义输入和输出数据,以及执行的规则和条件。这些规则和条件可用于控制工作流程的流转,并在需要时触发特定的行为或决策。 在Activity工作流程中,活动之间可以有依赖关系,也可以有分支和合并。这些依赖关系和控制结构可以用来管理工作流程的执行顺序和条件。例如,如果某个活动的执行条件不满足,工作流程可以跳过该活动并继续执行其他活动。 工作流程的最后一个活动通常是结束活动(End Activity),表示工作流程的终点。当活动执行到结束活动时,工作流程就完成了。 总的来说,Activity工作流程是一种灵活而强大的工作流程管理框架,可以在各种场景中使用。它的特点包括定义明确的活动、支持串行和并行执行、具有条件和规则控制等。通过使用Activity工作流程,可以更加有效地管理和执行复杂的业务流程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值