public class ActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks, ActivityState {

    private List<Activity> activityList=new ArrayList<>();
private List<Activity> resumeActivity=new ArrayList<>(); @Override
public int count() {
return activityList.size();
}
@Override
public boolean isFront() {
return resumeActivity.size() > 0;
}
@Override
public Activity current() {
return activityList.size()>0 ? activityList.get(0): null;
} @Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) { activityList.add(0, activity);
}
@Override
public void onActivityStarted(Activity activity) {
} @Override
public void onActivityResumed(Activity activity) {
if (!resumeActivity.contains(activity)) {
resumeActivity.add(activity);
}
} @Override
public void onActivityPaused(Activity activity) {
} @Override
public void onActivityStopped(Activity activity) {
resumeActivity.remove(activity);
} @Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
} @Override
public void onActivityDestroyed(Activity activity) {
activityList.remove(activity);
} }

相应接口方法就可以看出对应功能。

使用方法:

在application中注册一个实例,所有activity接受生命周期管理,可以得到当前activity,activity task里activty数量等等。

public class MyApplication extends Application {
public ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks();
@Override
public void onCreate() {
super.onCreate();
this.registerActivityLifecycleCallbacks(activityLifecycleCallbacks); }

解决以baseActivity来处理的一些功能。功能代码完成与Activity隔离。减少了耦合。

1.日志,保存记录Activity的活动,以及做一些测试。

2.框架设计中,如Http请求框架,需要提供在Activity被销毁时,cancel仍在队列中的请求。

3.框架使用中,如EventBus,Xutils等IOC框架,需要在OnCreate和OnDestory中注册和卸载的场景。可以使用ActivityLifecycleCallbacks避免显式在Activity中调用其Api。

4.重点:可以轻松管理应用前后台状态。比如按home键操作相关动作处理。

至于在4.0以下获得相同效果,则需要代理系统框架中的Instrumentation类。

     Object mainThread = KernelObject.declaredGet(application.getBaseContext(), "mMainThread");
Field instrumentationField = KernelReflect.declaredField(mainThread.getClass(), "mInstrumentation");
instrumentation = new MyInstrumentation();
KernelObject.copy(KernelReflect.get(mainThread, instrumentationField), instrumentation);
KernelReflect.set(mainThread, instrumentationField, instrumentation);

ActivityLifecycleCallbacks的更多相关文章

  1. Android -- ActivityLifeCycleCallbacks

    ActivityLifeCycleCallbacks Application通过此接口提供了一套回调方法,用于让开发者对Activity的生命周期事件进行集中处理. 为什么用ActivityLifec ...

  2. 转:Android -- ActivityLifeCycleCallbacks

    http://www.cnblogs.com/yydcdut/p/4945990.html 一个不常见类的使用,名字叫ActivityLifeCycleCallbacks 通常一个项目中有很多个act ...

  3. Android开发 - ActivityLifecycleCallbacks用法初探

    ActivityLifecycleCallbacks是什么? Application通过此接口提供了一套回调方法,用于让开发人员对Activity的生命周期事件进行集中处理. 为什么用Activity ...

  4. ActivityLifecycleCallbacks 的简单使用

    转载自 http://blog.csdn.net/tongcpp/article/details/40344871 ActivityLifecycleCallbacks是什么? Application ...

  5. 记录Activity启动时间 ActivityLifecycleCallbacks

    ActivityStackManager 定义一个集合(Stack)保存所有还未销毁的 Activity public class ActivityStackManager { private Sta ...

  6. ActivityLifecycleCallbacks 如何控制activity的生命周期

    Android开发 - ActivityLifecycleCallbacks使用方法初探 初识 ActivityLifecycleCallbacks 利用ActivityLifecycleCallba ...

  7. Android使用ActivityLifecycleCallbacks管理Activity和区分App前后台

    一.ActivityLifecycleCallbacks接口介绍 官方地址:https://developer.android.com/reference/android/app/Applicatio ...

  8. css图片精灵

    <ul> <li class="top"> <em>01</em> <p><a href="http:/ ...

  9. 判断App运行是否在前台

    转自:http://notes.stay4it.com/2016/02/26/check-if-app-is-running-forground/ 在一些场景中,经常会需要判断App是否在后台运行,比 ...

随机推荐

  1. SSIS 初次接触 + 开发记录

    第一次接触SSIS,昨天终于把一套流程走通,记一下流水. 1:安装 使用SSIS需要安装插件(VS 和Sql Server都需要另外安装). 自己使用的vs2017开发,官网有专门的 VS2017 安 ...

  2. TCP/IP网络知识

    1.TCP/IP概念 TCP/IP不是单指一种传输协议,而是一组传输控制协议/互联网协议. 2.TCP/IP分层 (计算机网络中,实际应用的网络协议是TCP/IP协议族,TCP/IP的应用层大体上对应 ...

  3. innodb存储引擎之内存

    1.innoDB存储引擎体系架构 如上图所示,innoDB存储是基于磁盘存储的,并且其中的记录以页的方式进行管理,但为什么要引入一个内存池呢? 其目的就是为了协调CUP速度与磁盘速度的鸿沟,基于磁盘的 ...

  4. Windows 7上QTP11破解及java等插件破解方法

    QTP11破解方法: 1.准备文件 注册机mgn-mqt82.exe 2.安装QTP11 3.运行注册机mgn-mqt82.exe 如果运行mgn-mqt82.exe 没有反应-,请注意关掉暂时关掉杀 ...

  5. Raspberrypi 安装完MySQL之后登录不了(ERROR 1698 (28000))

    1.问题原因: 出现这是错误是因为 mysql 默认的 root 用户使用了 UNIX auth_socket_plugin 的用户认证方式,我们有下面两种方式处理问题: 修改 root 用户认证方式 ...

  6. Oracle【三表的联合查询】

    ,'北京','彰显大气'); ,'上海','繁华都市'); ,'广州','凸显舒适'); ,'深圳','年轻气氛'); ,'北上广深','不相信眼泪'); commit; ; ; ; ; ; 员工信息 ...

  7. Capture 设置pin name 不可见

    在器件库文件页面空白处双击,自动弹出OPTIONS对话框,再设计PIN NAME 可见属性为FLASE. 双击管脚.不管用,改不了.

  8. Centos下编译安装nginx

    1.安装依赖 yum install -y pcre-devel zlib-devel gcc openssl-devel gd-devel 2.下载安装包 不同版本的nginx下载地址:http:/ ...

  9. Java程序向MySql数据库中插入的中文数据变成了问号

    找到mysql的安装目录,修改my.ini文件 (1)如何找到my.ini文件 如果my.ini文件不在MySQL的安装目录下,可能放在隐藏目录,要先去找到ProgramData,(这里要先打开显示隐 ...

  10. System.nanoTime与System.currentTimeMillis

    System.nanoTime提供相对精确的计时,但是不能用他来计算当前日期.(系统计时器的当前值,以毫微秒为单位) System.currentTimeMillis返回的是从1970.1.1 UTC ...