每天一点小知识【6】

1、格式化字符串

Android中格式化带参数的字符串,方法有如下两种:

(1)、使用xliff:g标签

例如,
字符串定义:

<string name="str_cur_time">当前时间:<xliff:g id="NAME">%1$sxliff:g>string>

或者这样定义,

<string name="str_cur_time">当前时间:<xliff:g id="NAME">%sxliff:g>string>

使用方法:

private String strFmtDate;
private SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
strFmtDate = this.getResources().getString(R.string.str_cur_time);
String strDate = String.format(strFmtDate, fmt.format(new Date(System.currentTimeMillis())));

Android源码中大量使用了此种方式,XLIFF外文全名是XML Localization Interchange File Format,中文名是XML本地化数据交换格式。

标签:
属性id可随意命名,表示当前xliff结点的唯一标识。
属性值举例说明
%n msnm md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0
%n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00
也可简单写成:
%d (表示整数)
%f (表示浮点数)
%s (表示字符串)

(2)、直接使用%n$符号。

例如,
字符串定义:
相关:%1 d s %3 d/ d行
使用方法:

int totalItem = 100;
int curLine = 1;
int Totalline = 20;
String lineNumber = String.format(context.getString(R.string.str_linenumber_show), totalItem, " ", curLine, Totalline);

lineNumber 显示这样一个结果,

“相关:100 1/20”

2、一点常识

手机在未root的情况下,某个应用程序如果有读写外置存储卡的权限,它可以对外置存储卡进行操作,除了这个目录外,它还有两个地方用来存放文件,一个是/data/data/包名目录,另一个是/data/local/tmp目录。

3、常用的adb指令

(1)、显示当前运行的全部设备或者模拟器

adb devices

(2)、连接远程设备,可以通过wifi连接,调试程序,在盒子开发中用的比较多

adb connect 192.168.xx.xxx

(3)、安装应用程序,-r表示如果原来安装有此应用,那就重新进行安装,如果原来没有此应用,可以不用-r参数

adb install -r 应用程序.apk 

(4)、卸载应用

adb uninstall [packagename]

(5)、获取当前设备中的某个文件,例如获取/mnt/sdcard目录下的log.txt文件,放到e盘的file目录下

adb pull /mnt/sdcard/log.txt e:\file

(6)、向当前设备中写入某个文件。例如将电脑下的e:\file\test.so文件写入/mnt/sdcard目录

adb push e:\file\test.so /mnt/sdcard/test.so

(7)、查看adb命令帮助信息

adb help

(8)、在命令行中过滤LOG信息。

adb logcat -s 标签名

(9)、卸载系统应用

adb shell
su
mount -o remount /system
rm -fr /system/app/xxx.apk
reboot

(10)、输出log到文件,当在控制台打印log不方便或者太多时,可以直接输出到指定的文件。

adb logcat -v time -f /mnt/sdcard/log.txt

(11)、截屏操作,例如截取当前屏幕存放到/mnt/sdcard/tmp.png中。注意需要手机root。

adb shell screencap –p /mnt/sdcard/tmp.png

这个命令对于开发和测试人员非常有用,有时候想快速截取手机屏幕,就可以利用这个命令命令。但是前提手机上得有screencap 这个二级制可执行程序,有的手机上的这个程序被砍掉了。

(12)、录屏操作。注意需要手机root。

$adb shell screenrecord /mnt/sdcard/test.mp4

这个命令其实和截屏相似,只不过这个是录制视屏,对于测试人员来说更是重要了,有时候想复现问题步骤,那么就可以采用这个命令进行录屏功能。

(13)、查看设备的进程信息,或者是指定进程的线程信息

adb shell
ps | grep 过滤内容

例如,
ps |grep cn.test.demo,只显示应用cn.test.demo对应的信息。
或者可以这样用,

ps –t [pid] 查看pid对应的线程信息

例如,
ps –t 11798,显示进程号11798对应的进程信息。
(14)、查看当前应用的activity信息

adb shell dumpsys activity top

可以查看当前应用的activity信息
(15)、查看指定包名应用的详细信息

adb shell dumpsys package

(16)、查看指定进程名或者是进程id的内存信息

adb shell dumpsys meminfo

(17)、查看指定包名应用的数据库存储信息(包括存储的sql语句)

adb shell dumpsys dbinfo

(18)、删除文件夹下一个或多个文件的命令 。

rm -r 完整文件名(带后缀) 

例如 rm -r xx.mp3
rm -r . 删除这个目录下所有的文件
rm -r 关键字 删除和关键字有关的所有文件
例如:删除SDCARD 文件夹下的所有mp3文件

cd sdcard
rm -r *.mp3

(19)、top命令
这个查看cpu信息太方便了。

adb shell
top -m 5 -t 

其中按cpu大小列出5个进程列表。
例如,com.xxx.test的cpu使用过高,它会导致手机发烫。同时利用这个信息,可以监控应用cpu的使用,以调整优化代码。

4、重点说一下dumpsys命令

dumpsyss命令用来查看系统信息,在开发中用的非常多。
命令格式如下所示,
dumpsys [options]
meminfo 显示内存信息
cpuinfo 显示CPU信息
account 显示accounts信息
activity 显示所有的activities的信息
window 显示键盘,窗口和它们的关系
wifi 显示wifi信息

例如,查看应用com.tianxia.test的内存使用情况
adb shell dumpsys meminfo com.tianxia.test

5、小技巧–匿名类

尽量少使用匿名类,因为匿名类相对于正常类会多站用1K的空间,所以尽量少使用匿名类。

6、小技巧–反斜杠字符

在字符串定义文件String.xml中,反斜杠字符()可以单独作为一行,用来实现连接下一行的内容,

7、关于Android菜单

Android支持两种类型的菜单:一种是用户按下Menu按钮时弹出的菜单;另一种是用户用手指按住屏幕不放是弹出的上下文菜单。

8、关于HandlerThread

HandlerThread继承于Thread,本质是一个线程,主要的作用也是建立了一个线程,并且创立了消息队列,有自己的looper,可以让用户在这个线程中分发和处理消息。我们知道Android的消息处理通过handler和looper来实现,而HandlerThread不但能提供异步消息处理,Handler处理消息的方法也会在这个线程中执行,他最主要的作用就是提供了一个线程。

9、Android NDK注意事项

在Android NDK中,一个wchar_t是4个字节,也就是说Android NDK下,unicode字符是采用ucs4的,而在windows系统下,unicode是采用ucs2,即每个unicode字符是占用两个字节的,可以用sizeof()函数来测试验证一下。如果在Android NDK下,想要强制指定一个wchar_t是2个字节,即跟windows系统下一样,采用ucs2,需要在Android.mk中添加一句LOCAL_CFLAGS := -fshort-wchar即可。但是如果指定wchar_t为两个字节的话,则所有用于处理unicode字符串的函数(如wcscpy,wcslen,wcscmp,wcscat)则都不再适用,需要你自己重新写这些函数。

10、关于uid、gid的一些知识

Android 的权限分离的基础是建立在 Linux 已有的 uid、gid 基础上的 。
uid – Android 在 安装一个应用程序时,系统就会自动为它分配一个 uid 。其中普通 Android 应用程序的 uid 是从 10000 开始分配,10000 以下是系统进程的 uid 。
gid – 对于普通应用程序来说,gid 等于uid 。由于每个应用程序的 uid 和 gid 都不相同, 因此不管是 native 层还是 java 层都能够达到保护私有数据的作用 。

每天一点小知识【6】_第1张图片

欢迎您扫一扫上面的微信公众号,订阅我的个人公众号! 本公众号将以推送Android各种碎片化小知识或小技巧,以及整理Android面试知识点为主,也会不定期将开发老司机日常工作中踩过的坑,平时自学的一些知识总结出来进行分享。每天一点干货小知识把你的碎片时间充分利用起来。

你可能感兴趣的:(Android,Android小知识)