如何判斷APP應(yīng)用程序前臺和后臺切換

1、問題的緣由

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

2、解決問題方式

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

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

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

3、代碼code

創(chuàng)建全局的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, "當(dāng)前狀態(tài)處于前臺>>>>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, "當(dāng)前狀態(tài)處于后臺>>>>Stopped" + activity);
        }
    }

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

    }

    @Override
    public void onActivityDestroyed(Activity activity) {

    }
}

一般在BaseActivity進(jìn)行對一下代碼添加

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

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

    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、對于這樣的狀態(tài),我們已經(jīng)完成了,所以大家可以在試試這樣的方式,簡潔的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容