一、说明
笔记主要是记录一些本人在开发当中的学习和使用笔记。笔记内容包含一些本人觉得重要的知识点、本人易犯的错误等。
由于本人水平有限,其中出现的错误或者不合理的地方望各位读者多多包含,并指出其中不合理和错误的地方,以便我来修改正。谢谢!
二、笔记时间
2018年12月17日
三、简述
本文主要讲述Activity统一管理,主要是如何判断应用是否处于前后台。
四、详情
1 应用前后台判断
我们先讲讲如何判断应用是处于前台还是后台。在我们需要统计用户在线时长,或者统计用户使用时间段等业务需求的时候,应用前后台的判断就显得尤为重要。下面讲讲前后台判断的几种方式。
1.1 通过包名判断
我们可以通过应用包名来判断当前应用是处于前台还是处于后台。代码如下:
public static boolean isRunningOnBackground(Context context){
ActivityManager acm = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
if(acm != null){
List<RunningAppProcessInfo> runApps = acm.getRunningAppProcesses();
if(runApps != null && !runApps.isEmpty()){
for(RunningAppProcessInfo app : runApps){
if(app.processName.equals(context.getPackageName())){
if(app.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND){
return true;
}
}
}
}
}
return false;
}
1.2 通过ActivityManager来统计
通过ActivityManager来管理,其实是自定义一个ActivityManager类。该类的作用是对Activity的生命周期进行统一的管理,这样我们就知道每一个Activity是否处于前台,这样我们就只需要查是否有处于前台的Activity就知道应用是否处于前台。
1.2.1 通过BaseActiviy统计实现
我们也可以使所有Activity继承BaseActivity,进行前台Activity的统计,来判断应用是否处于前台。其实我觉得这种方式就是实现了一个简单的ActivityManager,ActivityManager只做了一个事情,就是统计前台Activity。
1.2.2 通过一个ActivityManager管理类实现
通过一个ActivityManager管理类来管理所有Activity使用周期。这是一个比较完善的Activity管理方式。此处举一个简单些的例子,只管理Activity的创建、销毁、和暂停。
private static LinkedList<Activity> mActivitys= new LinkedList<>();
private static int mActiveActivity = 0;
/**
* 添加Activity
*/
private static add(Activity activity) {
mActivitys.add(activity);
mActiveActivity ++;
}
/**
* 删除Activity
*/
private static remove(Activity activity) {
mActivitys.remove(activity);
}
/**
* 设置不活跃
*/
private static setNoActive(Activity activity) {
if(mActiveActivity >= 1){
mActiveActivity --;
}
}
1.2.3 通过ActivityLifecycleCallbacks监听Activity生命周期
通过在Application中实现ActivityLifecycleCallbacks接口,我们就可以监听到所有Activity的生命周期。当然,我们还是需要配合ActivityManager才能知道当前应用是否处于前台。
public class MyApplication extends Application implements ActivityLifecycleCallbacks {
private LinkedList<Activity> mActivitys;
private int mActiveActivityCount = 0;
@Override
public void onCreate() {
super.onCreate();
mActivitys = new LinkedList<>();
registerActivityLifecycleCallbacks(this);
}
/**
* 是否处于前台
*/
public boolean isInForeground() {
if (mActiveActivityCount > 0) {
return true;
} else {
return false;
}
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if (null != mActivitys&& null != activity) {
mActivitys.add(activity);
}
}
@Override
public void onActivityStarted(Activity activity) {
// TODO Auto-generated method stub
}
@Override
public void onActivityResumed(Activity activity) {
if (null != mActivitys&& null != activity) {
mActiveActivityCount ++;
}
}
@Override
public void onActivityPaused(Activity activity) {
if (null != mActivitys&& null != activity) {
mActiveActivityCount --;
}
}
@Override
public void onActivityStopped(Activity activity) {
// TODO Auto-generated method stub
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
// TODO Auto-generated method stub
}
@Override
public void onActivityDestroyed(Activity activity) {
if (null != mActivitys&& null != activity) {
mActivitys.remove(info);
}
}
}
当然,我们也可以在Activity里面实现ActivityLifecycleCallbacks方法,监听该Activity的生命周期变化。
最后一点,我们也可以通过unregisterActivityLifecycleCallbacks来注销监听。