如何判斷APP應用程序前臺和后臺切換

1、問題的緣由

當APP應用程序是通過socket通信,或者SignalR通信時,或者像某些長連接如聊天的一些應用,為了讓APP應用處于一個與服務器進行連接通信的長連接狀態時,減少資源的耗損等時。需要解決該現象問題。當然,如果我們一直進行長連接通信也行,如QQ、微信等,但是有些應用沒必要怎么做,畢竟這只是改應用的一個小模塊。

2、解決問題方式

由以上問題,我們可以發現,一般是在APP處于后臺時關閉通信,然后處于前臺時,進行通信連接就可以了,那么我們該怎么做呢?

1、一般在什么情況下會出現APP處于后臺,這是一個我們必須探討的問題,然后呢,當APP處于前臺時,要如何進行邏輯代碼編寫方式進行通信呢等等?

2、在一般情況下,我們都知道當點擊HOME鍵時,APP會處于后臺,并執行Activity的 onPuase()、onStop() 兩個生命周期,但是問題是并不是只有點擊HOME鍵才出現APP在后臺。所以我們可以同=通過Application的全局狀態來監聽當前APP應用是否處于后臺,或者運行在前臺的作用。

3、代碼code

創建全局的MyApp 記得在manifests添加 android:name="MyApp"屬性

public class MyApp extends Application implements Application.ActivityLifecycleCallbacks {

    int lifecyclecount = 0;
    private static final String TAG = MyApp.class.getSimpleName();
    @Override
    public void onCreate() {
        super.onCreate();

        initLifecycleCallback();
        }
        
    private void initLifecycleCallback() {
        registerActivityLifecycleCallbacks(this);
    }
    
    @Override
    public void onActivityCreated(Activity activity, Bundle bundle) {

    }

    @Override
    public void onActivityStarted(Activity activity) {
        if(lifecyclecount == 0){
            Log.e(TAG, "當前狀態處于前臺>>>>Started" + activity);
        }
        lifecyclecount++;
    }

    @Override
    public void onActivityResumed(Activity activity) {

    }

    @Override
    public void onActivityPaused(Activity activity) {

    }

    @Override
    public void onActivityStopped(Activity activity) {
        lifecyclecount--;
        if (lifecyclecount == 0) {
            Log.e(TAG, "當前狀態處于后臺>>>>Stopped" + activity);
        }
    }

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

    }

    @Override
    public void onActivityDestroyed(Activity activity) {

    }
}

一般在BaseActivity進行對一下代碼添加

private boolean isCurrenApptRunningForeground = true;
    private static final String TAG = BaseActivity.class.getSimpleName();
    @Override
    protected void onStart() {
        super.onStart();
        if (!isCurrenApptRunningForeground) {
            Log.e(TAG, "App應用程序處于前臺中...");
            //進行邏輯處理如果與服務器連接斷開,就重新連接
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        isCurrenApptRunningForeground = isAppRunningForeground();
        if (!isCurrentRunningForeground) {
            Log.e(TAG, "App應用程序處于后臺中...");
            //可以斷開服務器連接,相關需要等
        }
    }

    public boolean isAppRunningForeground() {
        ActivityManager activityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessInfos) {
            if (appProcessInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                if (appProcessInfo.processName.equals(this.getApplicationInfo().processName)) {
                    Log.e(TAG, "處于前臺運行中...");
                    return true;
                }
            }
    }
    Log.e(TAG, "處于后臺運行中...");
    return false;           
}

4、對于這樣的狀態,我們已經完成了,所以大家可以在試試這樣的方式,簡潔的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容