安卓应用进后台要释放资源、进前台执行一些逻辑(比如执行接口刷数据、打开手势密码、启动服务等等)。
要解决2个问题:
1、 如何判断应用当前是否在前台?
2、如何得到用户按Home键、再次打开应用的事件?
Android5.0之前可以用ActivityManager的getRunningTasks方法, 但5.0及后续版本该方法被注释为@Deprecated。 下面函数可以用来判断app是否在前台, 从Android5.0开始通过判断进程优先级得出是否在前台。PS:进程分为5大优先级:前台进程、可视进城、服务进程、后台进程、空进程等。
/**
* 判断程序是否在前台运行
* @param context
* @return true在前台,false在后台
*/
private boolean isAppForeground(Context context) {
boolean isForground = false;
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
//前台程序
if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
for (String pkgName : processInfo.pkgList) {
if (pkgName.equals(context.getPackageName())) {
isForground = true;
}
}
}
}
} else {
//@deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, 从Android5.0开始不能使用getRunningTask函数
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
if (componentInfo.getPackageName().equals(context.getPackageName())) {
isForground = true;
}
}
return isForground;
}
应用退后台、进前台都是通过判断当前进程的Activity是否处于活跃状态。 可通过2个具体方法实现:
1、 自定义一个Activity/FragmentActivity的派生类, 项目中所有的Activity都继承于自定义类。 覆盖onStart、onStop方法, 并设置单例整型变量自增1或者自减1。 具体逻辑参考第2种方式。
2、 Android还支持在Application类中注册Activity的回调, 我们可以在Application类里实现对应的逻辑。 count为1时表示应用切换到前台, 为0时表示切换到后台。
配置AndroidManifest.xml:
<application android:name=".TheApplication" ...
/>
public class TheApplication extends Application {
private int mCount;
....
@Override
public void onCreate() {
super.onCreate();
...
mCount = 0;
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
mCount++;
//如果mCount==1,说明是从后台到前台
if (mCount == 1){
//执行app跳转到前台的逻辑
...
}
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
mCount--;
//如果mCount==0,说明是前台到后台
if (mCount == 0){
//执行应用切换到后台的逻辑
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
}
@Override
public void onTerminate() {
super.onTerminate();
}
....
}