温故而知新,系统整理一下。

SpUtils

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import android.content.Context;
import android.content.SharedPreferences;

/**
* sp存储操作工具类
* 1. 保存数据
* 2. 读取数据
* 3. 移除数据
*
*/
public class SpUtils {//单例

private static SharedPreferences sp;
private static SpUtils instance = new SpUtils();


private SpUtils() {
};

public static SpUtils getInstance(Context context) {
if(sp==null) {
sp = context.getSharedPreferences("ms", Context.MODE_PRIVATE);
}
return instance;
}

/*
* 1. 保存数据
*/
public void save(String key, Object value) {
if(value instanceof Integer) {
sp.edit().putInt(key, (Integer)value).commit();
} else if(value instanceof String) {
sp.edit().putString(key, (String)value).commit();
} else if(value instanceof Boolean) {
sp.edit().putBoolean(key, (Boolean)value).commit();
}
}

/*
* 2. 读取数据
*/
public int getInt(String key, int defValue) {
return sp.getInt(key, defValue);
}
public String getString(String key, String defValue) {
return sp.getString(key, defValue);
}
public boolean getBoolean(String key, boolean defValue) {
return sp.getBoolean(key, defValue);
}

/**
* 读取数据
* @param key
* @param defValue
* @return
*/
public <T> T get(String key, T defValue) {
T t = null;
if(defValue instanceof String || defValue==null) {
String value = sp.getString(key, (String) defValue);
t = (T) value;
} else if(defValue instanceof Integer) {
Integer value = sp.getInt(key, (Integer) defValue);
t = (T) value;
}else if(defValue instanceof Boolean) {
Boolean value = sp.getBoolean(key, (Boolean) defValue);
t = (T) value;
}
return t;
}

/*
* 3. 移除数据
*/
public void remove(String key) {
sp.edit().remove(key).commit();
}

}

ResourceUtils 映射 资源文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import android.content.Context;

public class ResourceUtils {
public ResourceUtils() {
}

public static int[] getResourseIdByName(String packageName, String className, String name) {
Class r = null;
int[] id = new int[1];

try {
r = Class.forName(packageName + ".R");
Class[] e = r.getClasses();
Class desireClass = null;

for(int i = 0; i < e.length; ++i) {
if(e[i].getName().split("\\$")[1].equals(className)) {
desireClass = e[i];
break;
}
}

if(desireClass != null) {
id = (int[])desireClass.getField(name).get(desireClass);
}
} catch (ClassNotFoundException var8) {
var8.printStackTrace();
} catch (IllegalArgumentException var9) {
var9.printStackTrace();
} catch (SecurityException var10) {
var10.printStackTrace();
} catch (IllegalAccessException var11) {
var11.printStackTrace();
} catch (NoSuchFieldException var12) {
var12.printStackTrace();
}

return id;
}

public static int getIdByName(Context context, String className, String resName) {
context = context.getApplicationContext();
String packageName = context.getPackageName();
int indentify = context.getResources().getIdentifier(resName, className, packageName);
return indentify;
}
}

FormVialation Android正则验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139


import java.util.regex.Pattern;

/**
* Created by ${wild00wolf} on 2016/6/16.
*/
public class FormVialation {
/**
* 手机号校验 注:1.支持最新170手机号码 2.支持+86校验
*
* @param phoneNum
* 手机号码
* @return 验证通过返回true
*/
public static boolean isMobile(String phoneNum) {
if (phoneNum == null)
return false;
// 如果手机中有+86则会自动替换掉
return validation("^[1][3,4,5,7,8][0-9]{9}$",
phoneNum.replace("+86", ""));
}
/**
* 用户名校验,默认用户名长度至少3个字符,最大长度为15<br>
* 可修改正则表达式以实现不同需求
*
* @param username
* 用户名
* @return
*/
public static boolean isUserName(String username) {
/***
* 正则表达式为:^[a-z0-9_-]{3,15}$ 各部分作用如下: [a-z0-9_-] -----------
* 匹配列表中的字符,a-z,0–9,下划线,连字符 {3,15}-----------------长度至少3个字符,最大长度为15
* 如果有不同需求的可以参考以上修改正则表达式
*/
return validation("^[a-z0-9_-]{3,15}$", username);
}
/**
* 密码校验
* 要求6-16位数字和英文字母组合
* @param pwd
* @return
*/
public static boolean isPassword(String pwd) {
/**
* ^ 匹配一行的开头位置(?![0-9]+$) 预测该位置后面不全是数字
* (?![a-zA-Z]+$) 预测该位置后面不全是字母
* [0-9A-Za-z] {6,16} 由6-16位数字或这字母组成
*/
return validation("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$", pwd);
}
/**
* 邮箱校验
*
* @param mail
* 邮箱字符串
* @return 如果是邮箱则返回true,如果不是则返回false
*/
public static boolean isEmail(String mail) {
return validation(
"^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$",
mail);
}
/**
* 正则校验
*
* @param pattern正则表达式
* @param str
* 需要校验的字符串
* @return 验证通过返回true
*/
public static boolean validation(String pattern, String str) {
if (str == null)
return false;
return Pattern.compile(pattern).matcher(str).matches();
}

}

```

### 连续按两次退出键 退出效果
```Java
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

private boolean isFirst = true;//默认是第一次
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what==1) {
isFirst = true;//必须连续点两次才退出
}
}
};
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {

if(event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
if(isFirst) {
isFirst = false;
Toast.makeText(MainActivity.this, "再按一次退出应用", 0).show();
//发送一个延迟2s的空消息
handler.sendEmptyMessageDelayed(1, 2000);
return true;
}
}

//return true;
return super.onKeyUp(keyCode, event); //默认点击back是退出的
}
}
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
exit = false;//使2s之前点击back失效, 需要再点击两次才退出
}
};
private boolean exit = false;//代表是否退出
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK) {//点击的是back
if(!exit) {
MSUtils.showMsg(this, "再按一次退出应用!");
exit = true;
handler.sendEmptyMessageDelayed(1, 2000);
return true;//不退出
}
}

return super.onKeyUp(keyCode, event);//默认点back就退出
}

原理: 第一次点击, 首先判断exit 的值,如果是false的话返回true 同时提示,载2秒后发送延迟消息,将 exit置false
默认点back就退出,如果 载在两秒内点击

——相关资料推荐
36个Android开发常用代码片段