1. 程式人生 > >Android App如何判斷應用是否在前臺還是處於後臺

Android App如何判斷應用是否在前臺還是處於後臺

1.實現ActivityLifecycleCallbacks介面,這裡考慮了應用遇到異常重啟的情況,

resetVariables()方法可以重置狀態。
package com.sohu.newsclient;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;

/**
 * 用於判斷App是否在後臺
 * Created by kriszhang on 16/1/4.
 */
public class NewsLifecycleHandler implements Application.ActivityLifecycleCallbacks {

    // I use four separate variables here. You can, of course, just use two and
    // increment/decrement them instead of using four and incrementing them all.
    private static int resumed;
    private static int paused;
    private static int started;
    private static int stopped;

    public NewsLifecycleHandler(){
        resetVariables();
    }

    public void resetVariables(){
        resumed=0;
        paused=0;
        started=0;
        stopped=0;
    }


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

    @Override
    public void onActivityDestroyed(Activity activity) {
    }

    @Override
    public void onActivityResumed(Activity activity) {
        ++resumed;
    }

    @Override
    public void onActivityPaused(Activity activity) {
        ++paused;
        android.util.Log.w("test", "application is in foreground: " + (resumed > paused));
    }

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

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

    @Override
    public void onActivityStopped(Activity activity) {
        ++stopped;
        android.util.Log.w("test", "application is visible: " + (started > stopped));
    }

    // If you want a static function you can use to check if your application is
    // foreground/background, you can use the following:


    public  static boolean isApplicationVisible() {
        return started > stopped;
    }

    public  static boolean isApplicationInForeground() {
        return resumed > paused;
    }

    public static boolean isApplicationInBackground(){
        return started==stopped;
    }

}
2.然後再自定義Application中
registerActivityLifecycleCallbacks(new NewsLifecycleHandler());
</pre><pre code_snippet_id="1555966" snippet_file_name="blog_20160113_5_6266074" name="code" class="java">3.在你想要判斷的地方,比如home鍵或鎖屏的時候,延遲一兩分鐘再去呼叫<pre name="code" class="java">isApplicationInBackground()
判斷應用是否處於後臺/前臺,延遲判斷是為了防止使用者在很快的時間裡切回前臺繼續使用,我們就曾經給某一廠商坐過一個OEM版,要求後臺不允許駐留程序和服務。