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();
}
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对毛票票的支持。