看了 stay 的視頻瞭解到判斷 app 是否在後臺運行除了使人蛋疼的判斷當前 runningProcess 或者 runningTasks 方法, 還有一種更爲簡便的方法, 那就是 ActivityLifecycleCallbacks.html
###官方文檔 官方文檔居然連介紹都沒有, 官方文檔android
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 從建立到銷燬的回調方法.app
咱們使用的時候實現這個接口, 而後在咱們自定義的 Application 調用初始化. 全部 Activity 的生命週期都會回調上面的方法.
初始化的時候須要註冊它 application.registerActivityLifecycleCallbacks(this);
ide
那咱們判斷 app 在不在前臺的依據是什麼呢?ui
首先來看一張 Activity 的生命週期圖:
this
它每一個方法的說明: spa
官方文檔 Activity 連接code
能夠看到, onStart() 是即將對用戶可見時調用, 也就是即將在前臺的時候, 對應的就是 onStop() , 對用戶再也不可見時調用. 因此在這 2 個方法來對 app 是否在前臺作出判斷.component
咱們定義一個計數器 int activeCount
來記錄 Activity 活動的個數, Activity 調用 onStart 就 +1, onStop 就 -1. 在 onResumed 的時候就是在前臺的時候. 同時也能夠定義一個 long time
, 定義在 app 在前臺呆了多長時間.視頻
public class AppStatusTracker implements Application.ActivityLifecycleCallbacks {
private static final long MAX_INTERVAL = 5 * 60 * 1000;
private static AppStatusTracker tracker;
private Application application;
private boolean isForground;
private int activeCount;
private long timestamp;
private AppStatusTracker(Application application) {
this.application = application;
application.registerActivityLifecycleCallbacks(this);
}
public static void init(Application application) {
tracker = new AppStatusTracker(application);
}
public static AppStatusTracker getInstance() {
return tracker;
}
public boolean isForground() {
return isForground;
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
if (activeCount == 0){
timestamp = System.currentTimeMillis();
}
activeCount++;
}
@Override
public void onActivityResumed(Activity activity) {
isForground = true;
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
activeCount--;
if (activeCount == 0) {
isForground = false;
timestamp = System.currentTimeMillis() - timestamp;
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
複製代碼
而後在本身的 application 裏面初始化就能夠了.
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AppStatusTracker.init(this
);
}
}
複製代碼
邏輯挺簡單的呵呵. 不過這個功能只在 4.0 之上可用, 不過如今應該基本都是 4.0 以上的手機了吧. 除了這個簡單的功能, 還能夠加入一個廣播來判斷屏幕熄滅後要作的邏輯. 後面等我摸索熟了再來實現.