rosu 的博客

Android 札记系列 (13):各种 tips 和 tricks

2018-09-28

Java 相关

Java 文件分隔符

  1. separator: 跨平台文件分隔符,依据不同平台来取不同的值. Windows 下是\,Unix 系统下是/

  2. separatorChar: 1 的字符形式

  3. pathSeparator: 跨平台的路径分隔符. 比如环境变量之间的分隔符,Unix 下是:,Windows 下是;

  4. pathSeparatorChar: 3 的字符形式

参看

Java 获取文件大小

我们平时使用的 File.length() 方法,返回是以 byte 为单位的文件大小。
我们需要自行转换成为 MBGB

1
2
3
double sizeInKB = (file.length() + .0) / 1024;
double sizeInMB = (file.length() + .0) / 1024 / 1024;
double sizeInGB = (file.length() + .0) / 1024 / 1024 /1024;

参看

Java 格式化字符串

floatdouble类型的,需要标注有效位数。比如在 strings.xml 文件中可以这么写:$1%0.f

参看

Android 相关

自定义 ProgressBar

参看

定义水平进度条

定义圆圈型进度条

TextView ellipsize 属性

第一次发现有这个视图属性…可以方便地设置 TextView 的文字超过最大长度之后的显示方式。

获取 Mac 地址

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
private final static String STATIC_W_LAN0 = "wlan0";
/**
* 获取设备的 mac 地址,小写!
* 需要 android.permission.ACCESS_WIFI_STATE 权限
* @return 如果获取不到 MAC 地址,将返回 null
*/
public static String getMachineHardwareAddress(){
Enumeration<NetworkInterface> interfaces = null;
try {
interfaces = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
e.printStackTrace();
}
String hardWareAddress = null;
NetworkInterface iF;
while (Objects.requireNonNull(interfaces).hasMoreElements()) {
iF = interfaces.nextElement();
try {
hardWareAddress = bytesToString(iF.getHardwareAddress());
if(iF.getName().equals(STATIC_W_LAN0)){
hardWareAddress = hardWareAddress.replace(":","");
break;
}
} catch (SocketException e) {
e.printStackTrace();
}
}
return hardWareAddress == null ? null : hardWareAddress.toLowerCase() ;
}

/***
* byte 转为 String
* @param bytes
* @return 如果传入的 byte 数组为空,则返回 null
*/
private static String bytesToString(byte[] bytes){
if (bytes == null || bytes.length == 0) {
return null ;
}
StringBuilder buf = new StringBuilder();
for (byte b : bytes) {
buf.append(String.format("%02X:", b));
}
if (buf.length() > 0) {
buf.deleteCharAt(buf.length() - 1);
}
return buf.toString();
}

在华为 DUA-AL00 上测试有效。

Android Studio Locat 配色

参看

File.listFiles() 返回 null

因为没有申请读取权限…

参看

Android Studio 注释模板

一开始我是在 class 里面设置的,后来发现直接在 File Header 里设置更好。

1
2
3
4
5
6
/**
* Created by ${USER} on ${DATE}.
* or
* @author ${USER}
* @date ${DATE}
*/

参看

EditText 获取聚焦

可以调用 EditText.requestFocus() 方法。

参看

Android 设置屏幕常亮

在视图类里,获取一个 FLAG 标识:

1
2
3
4
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

// 不需要的时候可以取消掉
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

参看

使用一个全局 Toast 避免多个 Toast 占据太长时间

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 显示 Toast
* @param resId 资源 id
*/
private void showToast(int resId){
if (mToast == null){
mToast = Toast.makeText(mContext, resId, Toast.LENGTH_SHORT);
}else {
mToast.setText(resId);
mToast.setDuration(Toast.LENGTH_SHORT);
}
mToast.show();
}

参看

Android Activity 四种启动模式

  • Standard

    • 默认启动模式,一个 Activity 可以有多个实例,比如你在 A 中调用 newIntent(this, A.class),则会变成 A–>A
  • SingleTop

    • 如果栈顶是一个 A 的实例,那么调用 newIntent(this, A.class) 会自动复用这个实例,不会新建一个实例。如果栈顶不是 A,那么新建实例。
  • SingleTask

    • 如果该 Activity 没有使用 taskAffinity 指定某个 activity 作为相关栈,则系统会新建一个『任务』,并且这个 Activity 作为根视图(栈底)
    • 如果该 Activity 使用 taskAffinity 指定了相关activity,那本 Activity 将会添加到那个相关 Activity 的栈内,并且作为栈顶存在
  • SingleInstance

    • 系统为之创建一个新任务给它使用,不允许其他 Activity 存在于该栈。所以如果有其他在该 Activity 打开的任何新 Activity,系统都将新建一个任务并将之添加进去

两种声明启动模式的方式的区别

  • AndroidManifest.xmllauncherMode 属性,表明所有方式启动本 Activity 都将使用属性声明的方式启动

  • intent.addFlags(int flags)方式启动的,单次生效

强烈建议阅读

非视图类调用 getResources()

目前一个可行的方法是在 Application 中实例化一个全局的context,然后调用这个context

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class App extends Application {
public static Resources res;

@Override
public void onCreate() {
super.onCreate();
res = getResources();
}

public static Context getContext(){
return mContext;
}
}

// 使用
App.getContext().getResources();

参看

ADB 启动 APP | 测量启动时间

1
adb shell am start -W com.package.name/com.package.name.ActivityName

结果:

1
2
3
4
5
6
Status: ok
Activity: me.rosuh.android.jianews/.HomeActivity
ThisTime: 672
TotalTime: 672
WaitTime: 759
Complete

参看

Tags: Android
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章