Activity进行全局管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HUandroid/article/details/79753935

Activity进行全局管理
经常会用到app退出的功能,一般实现为以下几种:

  1. System.exit(0) 使用系统的方法,强制退出 太暴力
  2. 抛出异常,强制退出 体验更差
  3. 广播退出 性能浪费
  4. Application退出 比较常用的方法
    优点:当应用程序启动时,会自动帮我们创建一个Application,而且一个应用程序只能存在一个Application,它的生命周期也是跟应用同步的,所以这里可以对activity进行全局管理:创建一个维护activity的list,创建activity就往里面添加,退出activitiy就移除activity。看代码:
public abstract class AbsSuperApplication extends Application {
    protected static Context context;
    protected static String appName;

    /**
     * 维护Activity 的list
     */
    private static List<Activity> mActivitys = Collections
            .synchronizedList(new LinkedList<Activity>());

    @Override
    public void onCreate() {
        super.onCreate();
        context = this.getApplicationContext();
        appName =  getAppNameFromSub();
        registerActivityListener();
    }

    public static String getAppName() {
        return appName;
    }

    public static Context getContext() {
        return context;
    }

    protected abstract String  getAppNameFromSub();


    /**
     * @param activity 作用说明 :添加一个activity到管理里
     */
    public void pushActivity(Activity activity) {
        mActivitys.add(activity);
        Loger.d("activityList:size:"+mActivitys.size());
    }

    /**
     * @param activity 作用说明 :删除一个activity在管理里
     */
    public void popActivity(Activity activity) {
        mActivitys.remove(activity);
        Loger.d("activityList:size:"+mActivitys.size());
    }



    /**
     * get current Activity 获取当前Activity(栈中最后一个压入的)
     */
    public static Activity currentActivity() {
        if (mActivitys == null||mActivitys.isEmpty()) {
            return null;
        }
        Activity activity = mActivitys.get(mActivitys.size()-1);
        return activity;
    }

    /**
     * 结束当前Activity(栈中最后一个压入的)
     */
    public static void finishCurrentActivity() {
        if (mActivitys == null||mActivitys.isEmpty()) {
            return;
        }
        Activity activity = mActivitys.get(mActivitys.size()-1);
        finishActivity(activity);
    }

    /**
     * 结束指定的Activity
     */
    public static void finishActivity(Activity activity) {
        if (mActivitys == null||mActivitys.isEmpty()) {
            return;
        }
        if (activity != null) {
            mActivitys.remove(activity);
            activity.finish();
            activity = null;
        }
    }

    /**
     * 结束指定类名的Activity
     */
    public static void finishActivity(Class<?> cls) {
        if (mActivitys == null||mActivitys.isEmpty()) {
            return;
        }
        for (Activity activity : mActivitys) {
            if (activity.getClass().equals(cls)) {
                finishActivity(activity);
            }
        }
    }

    /**
     * 按照指定类名找到activity
     *
     * @param cls
     * @return
     */
    public static Activity findActivity(Class<?> cls) {
        Activity targetActivity = null;
        if (mActivitys != null) {
            for (Activity activity : mActivitys) {
                if (activity.getClass().equals(cls)) {
                    targetActivity = activity;
                    break;
                }
            }
        }
        return targetActivity;
    }

    /**
     * @return 作用说明 :获取当前最顶部activity的实例
     */
    public Activity getTopActivity() {
        Activity mBaseActivity = null;
        synchronized (mActivitys) {
            final int size = mActivitys.size() - 1;
            if (size < 0) {
                return null;
            }
            mBaseActivity = mActivitys.get(size);
        }
        return mBaseActivity;

    }

    /**
     * @return 作用说明 :获取当前最顶部的acitivity 名字
     */
    public String getTopActivityName() {
        Activity mBaseActivity = null;
        synchronized (mActivitys) {
            final int size = mActivitys.size() - 1;
            if (size < 0) {
                return null;
            }
            mBaseActivity = mActivitys.get(size);
        }
        return mBaseActivity.getClass().getName();
    }

    /**
     * 结束所有Activity
     */
    public static void finishAllActivity() {
        if (mActivitys == null) {
            return;
        }
        for (Activity activity : mActivitys) {
            activity.finish();
        }
        mActivitys.clear();
    }

    /**
     * 退出应用程序
     */
    public  static void appExit() {
        try {
            Loger.e("app exit");
            finishAllActivity();
        } catch (Exception e) {
        }
    }


    private void registerActivityListener() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
                @Override
                public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                    /**
                     *  监听到 Activity创建事件 将该 Activity 加入list
                     */
                    pushActivity(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 outState) {

                }

                @Override
                public void onActivityDestroyed(Activity activity) {
                    if (null==mActivitys&&mActivitys.isEmpty()){
                        return;
                    }
                    if (mActivitys.contains(activity)){
                        /**
                         *  监听到 Activity销毁事件 将该Activity 从list中移除
                         */
                        popActivity(activity);
                    }
                }
            });
        }
    }
}

部分解释:

1.private static List mActivitys = Collections
.synchronizedList(new LinkedList());`

使用Collections.synchronizedList可以保证线程安全
2.registerActivityLifecycleCallbacks为activity的生命周期监听的回调方法。
3.
退出应用,循环遍历finish关掉所有activity,清空集合,使用try/catch防止退出方法异常。

/**
     * 退出应用程序
     */
    public  static void appExit() {
        try {
            Loger.e("app exit");
            finishAllActivity();
        } catch (Exception e) {
        }
    }
 /**
     * 结束所有Activity
     */
    public static void finishAllActivity() {
        if (mActivitys == null) {
            return;
        }
        for (Activity activity : mActivitys) {
            activity.finish();
        }
        mActivitys.clear();
    }

使用:创建其子类继承AbsSuperApplication,并实现其抽象方法就行了

 @Override
    protected String getAppNameFromSub() {
        PackageManager pm = this.getPackageManager();
        String appName = getApplicationInfo().loadLabel(pm).toString();
        return appName;
    }

全局管理好处可以帮助我们结束应用,或者创建全局Dialog。实现更加便捷

猜你喜欢

转载自blog.csdn.net/HUandroid/article/details/79753935
今日推荐