Android中应用前后台切换监听的实现详解
前言
最近在工作中遇到了这么一个需求:如何实现Android应用前后台切换的监听?下面来一起看看详细的介绍:
iOS内边是可以实现的,AppDelegate给了一个回调监听:
@UIApplicationMain classAppDelegate:UIResponder,UIApplicationDelegate{ funcapplicationWillResignActive(_application:UIApplication){ //Sentwhentheapplicationisabouttomovefromactivetoinactivestate.Thiscanoccurforcertaintypesoftemporaryinterruptions(suchasanincomingphonecallorSMSmessage)orwhentheuserquitstheapplicationanditbeginsthetransitiontothebackgroundstate. //Usethismethodtopauseongoingtasks,disabletimers,andinvalidategraphicsrenderingcallbacks.Gamesshouldusethismethodtopausethegame. } funcapplicationDidEnterBackground(_application:UIApplication){ //Usethismethodtoreleasesharedresources,saveuserdata,invalidatetimers,andstoreenoughapplicationstateinformationtorestoreyourapplicationtoitscurrentstateincaseitisterminatedlater. //Ifyourapplicationsupportsbackgroundexecution,thismethodiscalledinsteadofapplicationWillTerminate:whentheuserquits. } funcapplicationWillEnterForeground(_application:UIApplication){ //Calledaspartofthetransitionfromthebackgroundtotheactivestate;hereyoucanundomanyofthechangesmadeonenteringthebackground. } funcapplicationDidBecomeActive(_application:UIApplication){ //Restartanytasksthatwerepaused(ornotyetstarted)whiletheapplicationwasinactive.Iftheapplicationwaspreviouslyinthebackground,optionallyrefreshtheuserinterface. } }
我保留了系统注释。一个iOS应用周期,大概的流程是这样的。
应用从前台进入到后台:
applicationWillResignActive()->applicationDidEnterBackground()
应用从后台恢复到前台:
applicationWillEnterForeground()->applicationDidBecomeActive()
Android中也存在Application,但是并没有提供前后台切换的监听。
倒不如说,在Android中,压根就没有应用前后台的概念。
Android中基本页面单位是Activity。
Activity有自己的生命周期,但是Application却没有一个整体的生命周期。
我们可以通过监听Activity的生命周期,来模拟实现一个Application的生命周期。
Activity的生命周期不在阐述,写过Android的都应该知道。
我们假设现在有两个Activity分别是A和B,A是启动页面,那么生命周期回调是这样的:(我们忽略掉一些不关心的回调)
A被启动或者A进入前台
A.onStart() A.onResume()
从A跳转到B:
A.onPause() B.onStart() B.onResume() A.onStop()
从B返回A:
B.onPause() A.onStart() A.onResume() B.onStop()
A被关闭或者A进入后台
A.onPause() A.onStop()
注意上面两个页面回调的启动顺序。
onResume和onPause是一组,两个页面之间是顺序调用。
onStart和onStop是一组,两个页面之间是交叉调用。
也就是说,A启动到B,会先调用B.onStart(),然后再调用A.onStop();而B返回A则是相反的,会先调用A.onStart(),然后再调用B.onStop()。
利用这个特性,我们可以做一个全局计数器,来记录前台页面的数量,在所有Activity.onStart()中计数器+1,在所有Activity.onStop()中计数器-1。计数器数目大于0,说明应用在前台;计数器数目等于0,说明应用在后台。计数器从1变成0,说明应用从前台进入后台;计数器从0变成1,说明应用从后台进入前台。
有了思路,我们来实现。
Application提供了一个监听器用于监听整个应用中Activity声明周期:Application.ActivityLifecycleCallbacks。
这个监听器要求API>=14。对应API<14的情况,可以通过编写一个BaseActivity,然后让所有的Activity都集成这个类来实现整个应用Activity声明周期的监听,效果是相同的。
API>=14,实现如下:
publicclassApplicationListenerimplementsApplication.ActivityLifecycleCallbacks{ privateintforegroundCount=0;//位于前台的Activity的数目 @Override publicvoidonActivityStarted(finalActivityactivity){ if(foregroundCount<=0){ //TODO这里处理从后台恢复到前台的逻辑 } foregroundCount++; } @Override publicvoidonActivityStopped(Activityactivity){ foregroundCount--; if(foregroundCount<=0){ //TODO这里处理从前台进入到后台的逻辑 } } /* *下面回调,我们都不需要 */ @Override publicvoidonActivityCreated(Activityactivity,BundlesavedInstanceState){} @Override publicvoidonActivityResumed(Activityactivity){} @Override publicvoidonActivityPaused(Activityactivity){} @Override publicvoidonActivitySaveInstanceState(Activityactivity,BundleoutState){} @Override publicvoidonActivityDestroyed(Activityactivity){} }
我们在Application中注册这个监听器来发挥效果:
publicclassMyApplicationextendsApplication{ @Override publicvoidonCreate(){ super.onCreate(); registerActivityLifecycleCallbacks(newApplicationListener()); } }
对于API<14的情况,BaseActivity实现如下:
publicclassBaseActivityextendsAppCompatActivity{ privatestaticintforegroundCount=0;//注意是个静态变量 @Override protectedvoidonStart(){ super.onStart(); if(foregroundCount<=0){ //TODO这里处理从后台恢复到前台的逻辑 } foregroundCount++; } @Override protectedvoidonStop(){ foregroundCount--; if(foregroundCount<=0){ //TODO这里处理从前台进入到后台的逻辑 } super.onStop(); } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对毛票票的支持。