android 判斷切換後臺 判斷按下home鍵
(本文是原來的博客用markdown進行重新排版)
寫這個博客不是爲了實現監聽home鍵,而是判斷切換後臺 ,說過不寫一些沒意思的博客,監聽home鍵 或者屏蔽home鍵的方法,請百度。
我這個篇博客只是想寫兩種狀態的判斷:
1.應用切換到後臺的監聽或者說是判斷。
2.應用切換到後臺後重新打開的監聽判斷。
那麼,問題來了,假如你的公司有個需求:在app每次切換到後臺之後,判斷當前跟一個建立socket連接的服務器是否斷開。
臥槽,你們城裏人需求真多,好煩,這個好難實現。
解決方案大概有兩種方案,應用後臺後重新開的的時候走了那些方法,這個看下activity的生命週期,看下好像沒法做判斷。有些情況比較複雜,每次都走resume,但又不是每次都走onreate onstart一些列的方法。
那麼這個套路走步不通,我們試着在activity被隱藏的地方入手,activity a跳轉到activity b的時候pause了,stop了,那麼,在自己的應用內activity的跳轉也會觸發這個東西。
但是他跟按下home鍵,或者在我們的app裏打開其他應用的區別在哪裏呢?
解:區別在於切換到其他應用,當前在前臺的應用就不是我們自己的包了。那麼,我們可以用過獲取當前app的前臺應用的包名來判斷是否是我們自己的app,即可實現。
但是,問題又來了,如果我們最後一個頁面finish了呢,不也是的嗎 ?
這個切換後臺和finish能否區分分開呢?
解: 可以。
那麼,這樣子所有的問題都解決了切換到後臺的判斷了。切換到後臺的時候做一個記錄就行了,記錄下當前是否被後臺,下次重新打開的時候判斷下是否之前被後臺過,如果被後臺過,就去判斷下sokect是否在連接中即可,還要把後臺的記錄給重置。
理論上流程就是這樣子,stop的時候,判斷activitymanage中獲取最前臺的那個應用是否是本應用 ,不是的話就被後臺了,還有就是價格判斷如果被finish了,就不做記錄了。
好了,上代碼:
private boolean isFinished = false;
private final String RUN_SP_KEY="isRunningBackGround";
@Override
public void finish() {
super.finish();
isFinished = true;
}
//如果isFinished等於false,表示當前Activity僅切換到後臺運行,並沒有退出。
@Override
protected void onStop() {
super.onStop();
if (!isFinished) {
//括號內部的代碼請單獨提成一個方法 我這裏是爲了視覺 懶了
String packageName="com.XXX.mypackagename";//我們自己的應用的包名
String topActivityClassName= PackageUtils.getTopActivityName(this);
if (packageName!=null&&topActivityClassName!=null && !topActivityClassName.startsWith(packageName))
{
//app已經後臺
SPUtils.put(this, RUN_SP_KEY, true);
}
}
}
上面這是在stop的時候的處理,接下來的是啓動的時候的處理。
protected void onResume() {
super.onResume();
boolean isReOpen = (Boolean) SPUtils.get(this, RUN_SP_KEY, false);
if (isReOpen) {已經斷開
if (isConnect()) {
//這個值需要重置
SPUtils.put(this, RUN_SP_KEY, false);
}else {
showConnectPopupWindow();//彈出斷開連接提示的poupwindow
}
}
}