Android, Best way to provide app specific constants in a library project?

后端 未结 3 1798
走了就别回头了
走了就别回头了 2021-02-13 12:26

I am creating a library project for a number of android apps. The apps all have some common functionality that I wish to include in the library project but the library project f

3条回答
  •  余生分开走
    2021-02-13 12:50

    I don't know of a great schema to do that but it would certainly work this way:

    define some base class in your library

    // class, enum or whatever you want it to be. 
    class BaseConstants {
        // use some real singleton instead
        public static final BaseConstants instance = new BaseConstants();
    
        // define those values - sadly static inheritance does not work
        private static final int APP_ID = 0;
        private static final int CURRENT_APP_ID_KEY = 24;
    
        // so we have to do that via methods
        protected int getAppId() {
            return APP_ID;
        }
        protected int getAppIdKey() {
            return CURRENT_APP_ID_KEY;
        }
    }
    

    let each Activity that wants something custom implement that

    class App1Constants extends BaseConstants {
        public static final App1Constants instance = new App1Constants();
    
        private final static int APP_ID = 1;
    
        // want a different APP_ID here.
        protected int getAppId() {
            return APP_ID;
        }
    
        // getAppIdKey not implemented here, uses default
    }
    

    Use that class as context to the constants for your library

    class Library {
        public static long getCurrentAppId(Context context, BaseConstants settings) {
            return getLongPreference(context, settings.getAppIdKey(), settings.getAppId());
        }
    }
    

    Activities would be like so

    class myActivity extends Activity {
        // each Activity can implement it's own constants class and overwrite only some values
        private static final BaseConstants CONSTANTS = App1Constants.instance;
    
        private void whatever() {
            long appId = Library.getCurrentAppId(this, CONSTANTS);
        }
    }
    
    class myActivity2 extends Activity {
        // or could just use the default ones
        private static final BaseConstants CONSTANTS = BaseConstants.instance;
    
        private void whatever() {
            long appId = Library.getCurrentAppId(this, CONSTANTS);
        }
    }
    

    That schema is kind of ugly but it would work at least

提交回复
热议问题