这个系列是better practice,没有胆量叫best practice。再实现一些事情的时候,我们总会有很多方法,但并不见得是多好的方法,这个系列就是整理一些我在Android应用编程中遇到的或者想到的比较好的实践方式。
关于title,Android中定义各种作用域的常量变量并不是值得说道的事情,本篇的主要目的是立足软件维护层面讲一讲如何定义能够做到便于维护。至于(一),可能有(二),不能肯定。
正文:
一.应用级别的全局变量
有些变量(or 常量,后文默认变量 = 变量(or 常量))在整个应用中用到,换个顺口的说法,我们需要application的成员变量。可能此时你已经想起了一个古老的说法:“Android应用真正的入口是application,一个应用就是一个application,一个应用有且仅有一个application实例。”同样你对以下这段代码很熟悉。
<span style="font-size:18px;"><application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
...
</application>
</span>
同样你也会对Activity中的一个方法感到熟悉:getApplication();
是的,你没有猜错,你可以在manifest文件中定义程序的入口,也就是该Application类实例是默认的,还是你自定义的,熟悉缺省自然是默认的。
正如同声明一个Activity一样:
<span style="font-size:18px;"> android:name="com.example.test.MyApplication"</span>
我们实现该类并在其中定义一个变量
<span style="font-size:18px;">public class MyApplication extends Application{
private String str = "this is a test string";
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}</span>
而想要获取它(或修改它)则如下:
<span style="font-size:18px;">MyApplication application = (MyApplication) getApplication();
Log.d(TAG, "var is:"+application.getStr());</span>
这样要比定义一个类并拼命的使用static要舒服得多。
二.使用接口定义广泛应用的常量
其本质上和使用类来定义不会有太大的差别,好处可能就是能够“被实现”再使用时少写一些字,在定义数据库字段、默认值、网络请求的key等等时很爽。
此处注意,使用接口定义和使用“常量类”维护时差别不大,但绝对不要hardcode或者哪个类需要用到我就在哪个类定义,非常的不便于维护。
public interface IUrlManager {
public String DOMAIN = "XXXXXXXXXXX";
public String _V3_TESTDOMAIN = "XXXXXXXXX";
interface CheckToken {
public String DOMAIN = IUrlManager.DOMAIN;
public String FUNCTION = "XXXXXX";
public String USERNAME = "XXXXX";
public String ACCESS_TOKEN = "XXXXXXX";
public String ACCESS_ID = "XXXXXXX";
}
interface LoginUrl {
public String DOMAIN = IUrlManager.DOMAIN;
public String LOGIN_CHECK = "XXXXX";
public String APPKEY = "XXXXXXXXX";
public String KEY_USERNAME = "username";
public String KEY_PASSWORD = "password";
public String KEY_APPKEY = "appkey";
}
interface CheckUpdate {
/**
* URL:访问地址,post方式
*/
public String URL = "XXXXXXXXXXX";
public String KEY_SYS = "sys";
public String VALUE_SYS = "XXXXXXXXX";
/**
* key_currentversion:当前版本
*/
public String KEY_CURRENTVERSION = "ver";
/**
* key_sid:软件标识
*/
public String KEY_SID = "sid";
/**
* value_sid:固定sid
*/
public String VALUE_SID = "XXXXXXXXXXXXX";
}
}
例如上面的一个例子,这是我从项目中截取出的一段,我删去了关键信息和本来的注释。可以看到,这样管理web-api相关的常量会很方便,即使是在更换测试环境、临时添加测试接口等情况下,依旧很灵活,如果结合interface的extends,可以更加的灵活多变。
今天就先写这么多。