单例模式——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传入就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值