提起監(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)