Android在开发中的实用技巧之ActivityCollect

作者: coexist | 来源:发表于2016-10-29 11:43 被阅读1114次
    根据已上线的app里总结出来的实用小技巧

    当你在项目中觉得自己的Activity过多不好管理时, 你可以尝试写一个ActivityCollector来管理#####
    • 创建一个ActivityCollector类, 声明一个静态的Activity集合, 用来存储创建的Activity
      public static List<Activity> activitys = new ArrayList<Activity>();

    • 这个方法需要写到BaseActivityonCreate,才能实现已创建的Activity添加到集合的功能
      调用方式ActivityCollector.addActivity(this);

    public static void addActivity(Activity activity) {
            activitys.add(activity);//把传入的Activity添加到List中
    }
    
    • 这个方法需要写在BaseActivityonDestroy里
      调用方式ActivityCollector.removeActivity(this);
    public static void removeActivity(Activity activity) {    
            activitys.remove(activity);//根据传入的Activity来删除
    }
    
    • 这个方法需要写在MainActivity(app主页Activty)onDestroy里, 当主页Activity销魂或退出时, finish掉集合里的所有Activity
      调用方式ActivityCollector.removeAll();
    public static void removeAll() {
        for (Activity activity : activitys) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
         }
    }
    
    • 当你觉得你的app的当前情况只需要哪一个或者几个Activity的时候使用, 屡试不爽
      isAssignableFrom()是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的子类或接口。
      调用方式:
      ActivityCollector.removeAll(MainActivity.class);//除了MainActivity(app主页), 其他的全部关闭
      ActivityCollector.removeAll(MainActivity.class, LoginActivity.class);//除了MainActivity(app主页)、LoginActivity登录页其他的全部关闭
        /**
         * 除了传来的Activity其他的全部删除
         * 可以传多个Activity
         * @param clazz
         */
          public static void removeAll(Class<?>... clazz) {
            boolean isExist = false;
            for (Activity act : activitys) {
                for (Class c : clazz) {
                    if (act.getClass().isAssignableFrom(c)) {
                        isExist = true;
                        break;
                    }
                }
                if (!isExist) {
                    if (!act.isFinishing()) {
                        act.finish();
                    }
                } else {
                    isExist = false;
                }
            }
        }
    
    • 当你在一个Activity想获取另一个Activity(未finish过)的实例时使用
      使用方式MainActivity mainActivity = (MainActivity) ActivityCollector.getActivity(MainActivity.class);//获取MainActivity的实例
        /**
         * 从Activity集合查询, 传入的Activity是否存在
         * 如果存在就返回该Activity,不存在就返回null
         * @param activity 需要查询的Activity, 比如MainActivity.class
         * @return
         */
        public static Activity getActivity(Class<?> activity) {
            for (int i = 0; i < activitys.size(); i++) {
                // 判断是否是自身或者子类
                if (activitys.get(i).getClass().isAssignableFrom(activity)) {
                    return activitys.get(i);
                }
            }
            return null;
        }
    

    相关文章

      网友评论

      • 图乐:ActivityCollector.removeAll(MainActivity.class, LoginActivity.class);我感觉这个算法实现有问题呢,主页面的activity会在loginactivity判断时候被销毁不知道我理解的对不对
        cf5212223e79:@龚国佩 的确如此
        49666dc85b62:根本就用不着这么管理Activity,只要正确的使用上activity的启动模式就行了。
        Intent intent = new Intent(MainActivity.this, LoginActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        coexist:@图乐 谢谢提醒, 已经改好了, 你可以用一下, 之前我一直是在用传递一个Activity来使用的, 后面想拓展下, 传多个的, 改了我自己还没用过, 没发现到这个问题. :smile:

      本文标题:Android在开发中的实用技巧之ActivityCollect

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