单例模式——activity的管理

在开发中很多时候会碰到从A activity跳转到B activity,当用户提交完数据后,要关闭B activity,同时也要关闭A activity,其实要实现该功能有很多种方式:使用EventBus、使用广播、activity启动模式等,这里的话是从用单例管理activity方式,刚好在整个应用中也需要对开启和finish的activity进行管理;

public class AppActivityManager {
    private Stack<Activity> mActivitys;

    private AppActivityManager() {
        mActivitys = new Stack<>();
    }

    private static class AppActivityInnerManager {
        private static AppActivityManager activityManager = new AppActivityManager();
    }

    public static AppActivityManager getInstance() {
        return AppActivityInnerManager.activityManager;
    }

    /**
     * 添加activity
     *
     * @param activity
     */
    public void addActivity(Activity activity) {
        mActivitys.add(activity);
    }

    /**
     * 移除activity
     *
     * @param activity
     */
    public void removeActivity(Activity activity) {
        int size = mActivitys.size();
        for (int i = 0; i < size; i++) {
            Activity activity1 = mActivitys.get(i);
            if (activity1 == activity) {
                mActivitys.remove(i);
                i--;
                size--;
            }
        }
    }

    /**
     * 关闭指定的activity
     *
     * @param activity
     */
    public void finishActivity(Activity activity) {
        int size = mActivitys.size();
        for (int i = 0; i < size; i++) {
            Activity activity1 = mActivitys.get(i);
            if (activity1 == activity) {
                activity1.finish();
                mActivitys.remove(i);
                i--;
                size--;
            }
        }
    }

    /**
     * 关闭指定的activity
     * @param activityClass
     */
    public void finishActivity(Class activityClass){
        int size = mActivitys.size();
        for (int i = 0; i < size; i++) {
            Activity activity1 = mActivitys.get(i);
            if (activity1.getClass().getCanonicalName().equals(activityClass.getCanonicalName())) {
                activity1.finish();
                mActivitys.remove(i);
                i--;
                size--;
            }
        }
    }

    /**
     * 获取当前的activity
     * @return
     */
    public Activity currentActivity(){
        return mActivitys.lastElement();
    }

    /**
     * 退出应用程序
     */
    public void exitApp(){
        int size = mActivitys.size();
        for (int i = 0; i < size; i++) {
            Activity activity = mActivitys.get(i);
            activity.finish();
            mActivitys.remove(i);
            i--;
            size--;
        }
    }
}

就是一个这样的单例类,里面采用的是静态内部类的方式,关於单例模式可以看单例模式;创建了一个Stack集合用来管理activity,也可以用List,LinkList集合,不过在管理activity时添加和删除操作比较多,List的是数组结构增删的效率没有LinkList和Stack好,Stack和LinkList比较的话,Stack是同步的,线程安全些,所以还是采用Stack来存储管理activity;在对activity进行删除时需要注意对一个集合遍历循环删除容易出现数组角标越界的问题,所以删除一个后,对i--同时对size--;在使用时可以在BaseActivity的onCreate方法中进行添加,在onDestory方法中进行移除;

public class BaseActivity extends AppCompatActivity{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //添加当前activity
        AppActivityManager.getInstance().addActivity(this);
    }

    @Override
    protected void onDestroy() {
        //移除当前activity
        AppActivityManager.getInstance().removeActivity(this);
        super.onDestroy();
    }
}

需要关闭指定的activity的话,调用finishActivity方法,将指定的activity或者activity的Class传入就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章