您的位置:首页 > 移动开发

[前台,后台]android 如何判断app 运行在后台

2018-01-25 22:28 483 查看
app 开发中,经常可能会涉及到判断app 是否运行在后台。比如需要在后台启动运行Service, 或者需要从后台切换回前台时,做一些update 操作的等等。这些都需要我们能够监测到app 运行到后台。

最开始的时候我们采用的是监听系统的广播来实现,主要是监听Intent.ACTION_CLOSE_SYSTEM_DIALOGS 和 Intent.ACTION_SCREEN_OFF 这两个系统广播,监听的代码放在我们app 的 RootActivity (启动方式为 singleTask )里面。

Receiver 的大概代码如下:

final String SYSTEM_DIALOG_REASON_KEY = "reason";
final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
final String SYSTEM_DIALOG_REASON_LOCK_KEY = "lock";

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();

if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
if (reason != null && (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)
|| reason.equals(SYSTEM_DIALOG_REASON_LOCK_KEY))) {
setAppGoBackground(true);
}
} else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
setAppGoBackground(true);
}
}
}

这种方式虽然能够监听到用户按HOME键以及锁屏使app切换到后台的动作。但是总觉得这种方式不够优雅。

其实 android 在从sdk14 开始为我们提供了一个新的api 用于检测app 中activity 的生命周期,正好我们app 的minSdkVersion 已经设置为 14 了。 所以现在我们可以使用ActivityLifecycleCallbacks来 监听app 是否运行在后台的行为了。

public interface ActivityLifecycleCallbacks {
void onActivityCreated(Activity activity, Bundle savedInstanceState);
void onActivityStarted(Activity activity);
void onActivityResumed(Activity activity);
void onActivityPaused(Activity activity);
void onActivityStopped(Activity activity);
void onActivitySaveInstanceState(Activity activity, Bundle outState);
void onActivityDestroyed(Activity activity);
}

根据 Activity 的生命周期,知道onStart() 一般表示一个Activity 处于前台,onStop() 一般表示Activity在后台不可见。所以我们设置一个int refCount 变量, onActivityStarted 的时候refCount++, onActivityStopped的时候refCount–。当onActivityStopped之后如果refCount == 0 了。那么表示我们的app里面没有处于onStart的Activity 了,

也就相当于 app 已经处于后台了。

class ActivityLifecycleListener implements ActivityLifecycleCallbacks{

private int refCount = 0;

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

}

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

@Override
public void onActivityResumed(Activity activity) {

}

@Override
public void onActivityPaused(Activity activity) {

}

@Override
public void onActivityStopped(Activity activity) {
refCount--;
if(refCount == 0){
setAppGoBackGround(true);
}
}

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

}

@Override
public void onActivityDestroyed(Activity activity) {

}
}

然后在app 里面的 Application onCreate()方法注册即可:

registerActivityLifecycleCallbacks(new ActivityLifecycleListener());

是不是超级EASY.

更多关于App运行在后台的判断方法,你还可以参考AndroidProcess 这个项目。

参考:
https://github.com/wenmingvs/AndroidProcess

https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html

转自:https://www.jianshu.com/p/0879b6b6d952
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: