app 開發(fā)中拒名,經(jīng)常可能會涉及到判斷app 是否運行在后臺厕妖。比如需要在后臺啟動運行Service, 或者需要從后臺切換回前臺時第美,做一些update 操作的等等蝶锋。這些都需要我們能夠監(jiān)測到app 運行到后臺。
最開始的時候我們采用的是監(jiān)聽系統(tǒng)的廣播來實現(xiàn)什往,主要是監(jiān)聽Intent.ACTION_CLOSE_SYSTEM_DIALOGS 和 Intent.ACTION_SCREEN_OFF 這兩個系統(tǒng)廣播扳缕,監(jiān)聽的代碼放在我們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);
}
}
}
這種方式雖然能夠監(jiān)聽到用戶按HOME鍵以及鎖屏使app切換到后臺的動作别威。但是總覺得這種方式不夠優(yōu)雅躯舔。
其實 android 在從sdk14 開始為我們提供了一個新的api 用于檢測app 中activity 的生命周期,正好我們app 的minSdkVersion 已經(jīng)設置為 14 了兔港。 所以現(xiàn)在我們可以使用ActivityLifecycleCallbacks來 監(jiān)聽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);
}
根據(jù) Activity 的生命周期,知道onStart() 一般表示一個Activity 處于前臺衫樊,onStop() 一般表示Activity在后臺不可見。所以我們設置一個int refCount 變量利花, onActivityStarted 的時候refCount++科侈, onActivityStopped的時候refCount--。當onActivityStopped之后如果refCount == 0 了炒事。那么表示我們的app里面沒有處于onStart的Activity 了臀栈,
也就相當于 app 已經(jīng)處于后臺了。
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