美文网首页Android技术
利用ActivityLifecycleCallbacks优雅的退

利用ActivityLifecycleCallbacks优雅的退

作者: huangandroid | 来源:发表于2017-09-02 22:33 被阅读187次

    前言

    在android开发中我们都会遇到一个需求,那就是退出应用,那么我们都会退出所有的activity。
    我们一般常用的方式有下面几种:

    第一种方式

    我们写一个BaseActivity,在activity的创建的时候添加当前activity到集合中,在activity销毁的时候把当前activity移除出activity集合。退出应用时直接遍历activity集合,然后分别调用activity的finish()方法。

    package com.huangjie.exitapplication;
    
    import android.app.Activity;
    
    import java.util.ArrayList;
    
    /**
     * 应用管理类
     */
    
    public class ActivityManager {
        private static ArrayList<Activity> mActivityList;
    
        private ActivityManager() {
        }
    
        /**
         * 添加activity
         *
         * @param activity
         */
        public static void addActivity(Activity activity) {
            if (mActivityList == null) {
                mActivityList = new ArrayList<>();
            }
            mActivityList.add(activity);
        }
    
        /**
         * 移除activity
         *
         * @param activity
         */
        public static void removeActivity(Activity activity) {
            mActivityList.remove(activity);
        }
    
        /**
         * 退出应用
         */
        public static void exit() {
            for (Activity activity : mActivityList) {
                activity.finish();
            }
            mActivityList.clear();
        }
    }
    
    package com.huangjie.exitapplication;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    
    /**
     * Activity基类
     */
    
    public class BaseActivity extends Activity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ActivityManager.addActivity(this);
        }
    
        @Override
        protected void onDestroy() {
            ActivityManager.removeActivity(this);
            super.onDestroy();
        }
    }
    

    第二种方式广播式

    BaseActivity中注册一个广播接收器,在广播接收器中finish掉当前activity。所有的Activity继承BaseActivity。

    package com.huangjie.exitapplication;
    
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    
    
    public class BaseActivity extends Activity {
        private static String ACTION = "activity_exit";
    
        private BroadcastReceiver mExitReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                finish();
            }
        };
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            IntentFilter filter = new IntentFilter();
            filter.addAction(ACTION);
            registerReceiver(mExitReceiver, filter);
        }
    
        @Override
        protected void onDestroy() {
            unregisterReceiver(mExitReceiver);
            super.onDestroy();
        }
    }
    
    

    还有杀进程的方式。抛异常方式等等,这些都不够优雅,第一种方式如果当一个activity异常退出,是不会回掉onDestroy()方法,也就意味我们静态Activity集合无法移除当前activity,会导致内存泄漏。android 系统为每个应用分配的内存都是有限的,如果内存泄漏到一定程度就会导致应用崩溃。

    第三种方式

    ActivityLifecycleCallbacks 这个接口看着名字大概都能猜出来他是activity生命周期回掉接口。

    public interface ActivityLifecycleCallbacks {
            void onActivityCreated(Activity activity, Bundle savedInstanceState);
            void onActivityStarted(Activity activity);
            void onActivityResumed(Activity activity);
            void onActivityPaused(Activity activity);
            void onActivityStopped(Activity activity);
            void onActivitySaveInstanceState(Activity activity, Bundle outState);
            void onActivityDestroyed(Activity activity);
        }
    
    

    当我们一旦给应用注册了ActivityLifecycleCallbacks,那么上面接口中对应的方法都是应用中所有activity的生命周期都会回掉的方法。不管是我们写的activity,还是我们引用的第三方库中activity的生命周期都会回掉这些方法。那么我们我们可以在这里做处理。

    package com.huangjie.exitapplication;
    
    import android.app.Activity;
    import android.app.Application;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import java.util.ArrayList;
    
    
    
    public class MyApplication extends Application {
        private ActivityLifecycleCallbacks mcallBack;
        private static ArrayList<Activity> mActiivtyList;
    
        @Override
        public void onCreate() {
            super.onCreate();
            initLifeCallBack();
            registerActivityLifecycleCallbacks(mcallBack);
        }
    
    
        private void initLifeCallBack() {
            mcallBack = new ActivityLifecycleCallbacks() {
                @Override
                public void onActivityCreated(Activity activity, Bundle bundle) {
                    if (mActiivtyList == null) {
                        mActiivtyList = new ArrayList<>();
                    }
                    mActiivtyList.add(activity);
                }
    
                @Override
                public void onActivityStarted(Activity activity) {
    
                }
    
                @Override
                public void onActivityResumed(Activity activity) {
    
                }
    
                @Override
                public void onActivityPaused(Activity activity) {
    
                }
    
                @Override
                public void onActivityStopped(Activity activity) {
    
                }
    
                @Override
                public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
    
                }
    
                @Override
                public void onActivityDestroyed(Activity activity) {
                    mActiivtyList.remove(activity);
                }
            };
        }
    
    
        /**
         * 退出应用程序
         */
        public static void exit() {
            for (Activity activity : mActiivtyList) {
                activity.finish();
            }
            mActiivtyList.clear();
        }
    
    }
    
    

    相关文章

      网友评论

        本文标题:利用ActivityLifecycleCallbacks优雅的退

        本文链接:https://www.haomeiwen.com/subject/ddxdjxtx.html