Android監(jiān)測(cè)前后臺(tái)切換

提起監(jiān)測(cè)Android前后臺(tái)切換的監(jiān)測(cè),網(wǎng)上查詢,下面的方案應(yīng)該會(huì)被看到:

public class MainApplication extends Application {

    private int count = 0;

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityStopped(Activity activity) {
                Log.v("LifecycleCallbacks", activity + "onActivityStopped");
                count--;
                if (count == 0) {
                    Log.v("LifecycleCallbacks", ">>>>>>>>>>>>>>>>>>>切到后臺(tái)  lifecycle");
                }
            }
            @Override
            public void onActivityStarted(Activity activity) {
                Log.v("LifecycleCallbacks", activity + "onActivityStarted");
                if (count == 0) {
                    Log.v("LifecycleCallbacks", ">>>>>>>>>>>>>>>>>>>切到前臺(tái)  lifecycle");
                }
                count++;
            }
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                Log.v("LifecycleCallbacks", activity + "onActivityCreated");
            }
            @Override
            public void onActivityResumed(Activity activity) {
                Log.v("LifecycleCallbacks", activity + "onActivityResumed");
            }
            @Override
            public void onActivityPaused(Activity activity) {
                Log.v("LifecycleCallbacks", activity + "onActivityPaused");
            }
            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
                Log.v("LifecycleCallbacks", activity + "onActivitySaveInstanceState");
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
                Log.v("LifecycleCallbacks", activity + "onActivityDestroyed");
            }
        });
    }
}

上面的方案在大多數(shù)情況下是沒(méi)有問(wèn)題,問(wèn)題在于當(dāng)需要支持水平模式時(shí)該方法就失效了。當(dāng)我們旋轉(zhuǎn)設(shè)備時(shí)activity將會(huì)重建,onStart方法將被再次調(diào)用,這時(shí)將會(huì)錯(cuò)誤的判斷為app第二次被打開(kāi)。所以若是APP支持水平模式,則不能采用這個(gè)辦法。

新方案

其實(shí)判斷APP是否切換到后臺(tái)的方法很簡(jiǎn)單:
只要判斷前一個(gè)頁(yè)面退出后有沒(méi)有新頁(yè)面進(jìn)入即可,如果有新頁(yè)面進(jìn)入那么則App保持在前臺(tái),如果沒(méi)有新頁(yè)面進(jìn)入,那么則表明App此刻進(jìn)入了后臺(tái)。
這里涉及到幾個(gè)問(wèn)題:
1.采用何種方式監(jiān)測(cè)Activity狀態(tài)變化:基類方式還是Application里面?
2.在哪些方法里面做手腳:不用說(shuō),肯定是onStart和onStop
3.怎么判斷前一個(gè)頁(yè)面結(jié)束之后后一個(gè)頁(yè)面進(jìn)入?
問(wèn)題1很簡(jiǎn)單,肯定是采用Application,因?yàn)榭赡軙?huì)有第三方Activity被調(diào)起,如果采用基類方式,是無(wú)法監(jiān)測(cè)第三方Activity的狀態(tài)變化的,剩下的就是問(wèn)題3了,方案是這樣的,在前一頁(yè)面結(jié)束后,開(kāi)始計(jì)時(shí),在有限時(shí)間內(nèi),新頁(yè)面如果沒(méi)有出現(xiàn),那么就認(rèn)為App進(jìn)入了后臺(tái),否則則繼續(xù)保持在前臺(tái)。
具體方案參考這個(gè)鏈接即可了(https://github.com/hehonghui/android-tech-frontier/blob/master/issue-8/%E6%A3%80%E6%B5%8BAndroid%E5%BA%94%E7%94%A8%E7%9A%84%E5%90%AF%E5%8A%A8%E4%B8%8E%E5%85%B3%E9%97%AD.md)

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

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

  • ¥開(kāi)啟¥ 【雷霆戰(zhàn)機(jī)】 〖http://pan.baidu.com/s/1kVstszX〗 《解壓源碼后直接用AI...
    小菜c閱讀 3,686評(píng)論 1 10
  • ¥開(kāi)啟¥ 【雷霆戰(zhàn)機(jī)】 〖http://pan.baidu.com/s/1kVstszX〗 《解壓源碼后直接用AI...
    小菜c閱讀 4,015評(píng)論 0 5
  • ¥關(guān)閉¥ 【雷霆戰(zhàn)機(jī)】 〖http://pan.baidu.com/s/1kVstszX〗 《解壓源碼后直接用AI...
    小菜c閱讀 9,843評(píng)論 0 19
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,175評(píng)論 25 708
  • 和叔叔阿姨出去吃飯,等烤魚(yú)端上來(lái)之前這段時(shí)間,我一直搖頭晃腦地看著滿屋子的食客。有一對(duì)情侶在一堆白色logo衫中...
    hey_阿旺閱讀 1,374評(píng)論 0 3

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