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