深入解析Android系统中应用程序前后台切换的实现要点

2019-12-10 18:07:56丽君

这里需要在配置文件中设置每个Activity以单任务运行,否则,每次返回原Activity时会新增加一个Activity,而不会返回到原Activity。

在使用FLAG_ACTIVITY_NEW_TASK控制标识时也会出现不会返回到原Activity的现象。如果该标识使一个Activity开始了一个新的Task,然后当用户按了HOME键离开这个Activity,在用户按下BACK键时将无法再返回到原Activity。一些应用(例如Notification)总是在一个新的Task里打开Activity,而从来不在自己的Task中打开,所以它们总是将包含FLAG_ACTIVITY_NEW_TASK的Intent传递给startActivity()。所以如果有一个可以被其他的东西以这个控制标志调用的Activity,请注意让应用程序有独立的回到原Activity的方法。 代码如下:

<activity android:name="ShowMessageActivity" 
       android:launchMode="singleTask"></activity>  

Android应用前后台切换的判断
Android中没有提供一个应用前后台切换的回调或广播,这个功能只能我们自己来处理。以前遇到这个问题的处理方式是,实现一个BaseActivity,然后让其他所有Activity都继承自它,然后在生命周期函数中做相应的检测。具体检测方法如下:
       在Activity的onStart和onStop方法中进行计数,计数变量为count,在onStart中将变量加1,onStop中减1,假设应用有两个Activity,分别为A和B。
       情况一、首先启动A,A再启动B:启动A,count=1,A启动B,生命周期的顺序为B.onStart->A.onStop,count的计数仍然为1。
       情况二、首先启动A,然后按Home键返回桌面:启动A,count=1,按Home键返回桌面,会执行A.onStop,count的计数变位0。
       从上面的两种情况看出,可以通过对count计数为0,来判断应用被从前台切到了后台。同样的,从后台切到前台也是类似的道理。具体实现看后面的代码。
       但是如果项目中不是所有的Activity都继承自同一个BaseActivity,就无法实现这个功能了。幸运的是,Android在API 14之后,在Application类中,提供了一个应用生命周期回调的注册方法,用来对应用的生命周期进行集中管理,这个接口叫registerActivityLifecycleCallbacks,可以通过它注册自己的ActivityLifeCycleCallback,每一个Activity的生命周期都会回调到这里的对应方法。其实这个注册方法的本质和我们实现BaseActivity是一样的,只是将生命周期管理移到了Activity本身的实现中。