您的位置:首页 > Web前端

神奇的ActivityLifecycleCallbacks

2018-01-20 18:28 369 查看
Android自 API 14开始引入了一个方法,即Application的
registerActivityLifecycleCallbacks
方法,用来监听所有Activity的生命周期回调。通过这个方法,我们可以轻松获取到当前运行的
Activity
的实例,还可以判断应用是在前台运行还是后台运行。

我们先来看下面的一个简单代码块:

public class MyApplication extends Application {

@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) {
ActivityManager.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) {

}
});
}
}


可能有人会有个疑问,
ActivityManager
是个什么鬼东西来的,ok,我们现在看一下这个类的实现:

public class ActivityManager {

private static ActivityManager mInstance = new ActivityManager();
private WeakReference<Activity> mCurrentActivityWeakRef;

private ActivityManager() {
}

public static ActivityManager getInstance() {
return mInstance;
}

public Activity getCurrentActivity() {
if (mCurrentActivityWeakRef != null) {
return mCurrentActivityWeakRef.get();
}
return null;
}

public void setCurrentActivity(Activity activity) {
mCurrentActivityWeakRef = new WeakReference<>(activity);
}
}


这里使用饿汉式单例模式来弱引用保存了
Activity
的实例。这个实例保存下来可以说有非常多的用处,特别是在处理
Serivice
里面来触发对应
Activity
的跳转之类的需求。这里感谢一下技术小黑屋 ,提供了这个个非常有用的方法。

正如上面说,
registerActivityLifecycleCallbacks
方法还可以帮助我们判断应用是处于前台运行还是后台运行。这个判断方法也很简单,直接看下面的代码:

public class MyApplication extends Application {
private int activityCounter = 0;

@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}

@Override
public void onActivityStarted(Activity activity) {
activityCounter++;
}

@Override
public void onActivityResumed(Activity activity) {
}

@Override
public void onActivityPaused(Activity activity) {
}

@Override
public void onActivityStopped(Activity activity) {
activityCounter--;
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

}

@Override
public void onActivityDestroyed(Activity activity) {

}
});
}

public boolean getAppFrontRunning() {
return activityCounter>0;
}
}


想必大家都了解两个
Activity
之间的跳转的生命周期:

A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop()


因为我们可以通过
Activity
的生命周期的追踪回调,对
activityCounter
进行简单的加减处理,从而只需要判断
activityCounter
是否大于0即可知道当前应用是否处于前台运行。

结语

综上所述,
registerActivityLifecycleCallbacks
一个很好用的方法,但是如果你的应用需要兼容到 API 14版本以下,就不能采取这种方式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android