通常我们设计APP退出功能的时候,常常是设计一个基类Activity,基类里定义一个ArrayList,然后程序里所有的activity都继承自该基类,每个子类创建时都去把该子类activity加入到ArrayList,退出activity页面时把该子类activity移除出ArrayList,当需要退出APP时,就是把ArrayList中所有activity依次finish().
但是,我们程序中通常不只Activity,可能还会存在有些页面需要继承自FragmentActivity实现Fragment功能,这时候基类定义成Activity就不合适了,因为只能有一个父类。可能有人会想,基类定义成FragmentActivity类型不就好了,但是这里有些页面不需要fragment功能,这样继承该父类,会不会对性能有影响(没研究过),而且总感觉怪怪的。
那么有木有其它方法呢?恰好最近看到一种写法,可以分享一下
在application类中实现所有功能,首先还是将所有activity用ArrayList管理起来
//activity的列表,用于管理程序所有的activity private List<Activity> activityList; /** * 初始化activityList */ public void initActList(){ activityList = Collections.synchronizedList(new ArrayList<Activity>()); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { //Log.i(TAG, "create"); activityList.add(activity); } @Override public void onActivityStarted(Activity activity) { //Log.i(TAG, "start"); } @Override public void onActivityResumed(Activity activity) { //Log.i(TAG, "resume"); } @Override public void onActivityPaused(Activity activity) { //Log.i(TAG, "pause"); } @Override public void onActivityStopped(Activity activity) { //Log.i(TAG, "stop"); } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { //Log.i(TAG, "SaveInstanceState"); } @Override public void onActivityDestroyed(Activity activity) { Log.i(TAG, "destroy " + activity.getLocalClassName()); activityList.remove(activity); } }); }
然后是关闭activity的方法
/** * 关闭APP,此方法用于解决52443,某些情况下不能正常完全退出APP */ public void closeApp(){ Iterator<Activity> iterator = activityList.iterator(); while (iterator.hasNext()){ Activity activity = iterator.next(); activity.finish(); iterator.remove(); } activityList.clear(); }
在application类的oncreate()中调用initActList(),然后在需要关闭APP的地方调用closeApp()。经验证,即使使用的FragmentActivity作为父类,依然可以正确的进行管理监听,而且此方法的好处还在于不用写基类。