安卓根据不同的需求,经常会遇到需要判断app处于前后台的状况。
本人在开发中就遇到了需要判断前后台来展示广告的需求。
一开始,我是想要根据生命周期来进行判断展示,但是使用生命周的判断,在对于多界面activity之间跳转时就无法准确的判断前后状况。于是在网上找了不少资料,但是找到的代码好多,最终我整合了多方资料完成了此功能,在这书写整理一下,同时希望能帮助到他人。
下面上代码:
代码最好写在自定义继承activity的通用类中,如baseactivity:
1.最关键的判断部分,当返回false时表明处于后台,为true时是在前台展示:
/**
* 程序是否在前台运行
*
* @return
*/
public boolean isAppOnForeground() {
ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
String packageName = getApplicationContext().getPackageName();
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
.getRunningAppProcesses();
if (appProcesses == null)
return false;
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(packageName)
&& appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
return true;
}
}
return false;
}
2.我们在onstop方法中使用
isAppOnForeground()判断处于后台的状态:
@Override
protected void onStop() {
super.onStop();
if (!isAppOnForeground()){
//isAppOnForeground是用来判断是否处于后台的boolean变量
//当isAppOnForeground为true时表明我们的程序已经处于后台
isAppOnForeground = true;
}
}
3.同理我们需要在 onresume方法中判断app是否已回到前台:
protected void onResume() {
super.onResume();
if (isAppOnForeground()){
//在onResume中判断app是否处于前台更改变量值
isAppOnForeground = false;
}
}
4.下面在你需要用到的activity中使用isapponforeground参数进行判断,最好将判断的代码写在onrestart的生命周期中(个人认为这样比叫好,因为从别的activity或者后台回到app时系统会先调用onRestart方法,然后在调用onstart方法,最后调用onResume方法,再次进入运行状态
。)
@Override
protected void onRestart() {
super.onRestart();
if (isAppOnForeground&&isWowifi){
}
}
每当app退到后台回来时我们可以在onrestart方法先于onresume方法进行判断,此时判断的参数还未更改,我们可以依据此参数来判断是否要展示广告,做某些特定处理等功能。当运行到onresume方法时判参数isapponforeground又变为tfalse的前台状态,这样就不会影响到在app内部,多activity相互跳转时再次走过onrestart方法是出现误判的情况,这样我们就完成了android app前后台状态的判断。