1遭商、問題的緣由
當(dāng)APP應(yīng)用程序是通過socket通信,或者SignalR通信時(shí)斟叼,或者像某些長連接如聊天的一些應(yīng)用秤朗,為了讓APP應(yīng)用處于一個(gè)與服務(wù)器進(jìn)行連接通信的長連接狀態(tài)時(shí),減少資源的耗損等時(shí)昼汗。需要解決該現(xiàn)象問題肴熏。當(dāng)然,如果我們一直進(jìn)行長連接通信也行顷窒,如QQ蛙吏、微信等,但是有些應(yīng)用沒必要怎么做鞋吉,畢竟這只是改應(yīng)用的一個(gè)小模塊鸦做。
2、解決問題方式
由以上問題谓着,我們可以發(fā)現(xiàn)泼诱,一般是在APP處于后臺(tái)時(shí)關(guān)閉通信,然后處于前臺(tái)時(shí)赊锚,進(jìn)行通信連接就可以了治筒,那么我們該怎么做呢?
1改抡、一般在什么情況下會(huì)出現(xiàn)APP處于后臺(tái)矢炼,這是一個(gè)我們必須探討的問題,然后呢阿纤,當(dāng)APP處于前臺(tái)時(shí)句灌,要如何進(jìn)行邏輯代碼編寫方式進(jìn)行通信呢等等?
2欠拾、在一般情況下胰锌,我們都知道當(dāng)點(diǎn)擊HOME鍵時(shí),APP會(huì)處于后臺(tái)藐窄,并執(zhí)行Activity的 onPuase()资昧、onStop() 兩個(gè)生命周期,但是問題是并不是只有點(diǎn)擊HOME鍵才出現(xiàn)APP在后臺(tái)荆忍。所以我們可以同=通過Application的全局狀態(tài)來監(jiān)聽當(dāng)前APP應(yīng)用是否處于后臺(tái)格带,或者運(yùn)行在前臺(tái)的作用撤缴。
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)處于前臺(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)處于后臺(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)用程序處于前臺(tái)中...");
//進(jìn)行邏輯處理如果與服務(wù)器連接斷開叽唱,就重新連接
}
}
@Override
protected void onStop() {
super.onStop();
isCurrenApptRunningForeground = isAppRunningForeground();
if (!isCurrentRunningForeground) {
Log.e(TAG, "App應(yīng)用程序處于后臺(tái)中...");
//可以斷開服務(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, "處于前臺(tái)運(yùn)行中...");
return true;
}
}
}
Log.e(TAG, "處于后臺(tái)運(yùn)行中...");
return false;
}
4屈呕、對于這樣的狀態(tài),我們已經(jīng)完成了棺亭,所以大家可以在試試這樣的方式虎眨,簡潔的。