每天一點小知識【6】

1、格式化字符串

Android中格式化帶參數的字符串,方法有如下兩種:

(1)、使用xliff:g標籤

例如,
字符串定義:

<string name="str_cur_time">當前時間:<xliff:g id="NAME">%1$s</xliff:g></string>

或者這樣定義,

<string name="str_cur_time">當前時間:<xliff:g id="NAME">%s</xliff: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結點的唯一標識。
屬性值舉例說明
%nmsnm md:代表輸出的是整數,n代表是第幾個參數,設置m的值可以在輸出之前放置空格,也可以設爲0m,在輸出之前放置m個0
%n$mf:代表輸出的是浮點數,n代表是第幾個參數,設置m的值可以控制小數位數,如m=2.2時,輸出格式爲00.00
也可簡單寫成:
%d (表示整數)
%f (表示浮點數)
%s (表示字符串)

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

例如,
字符串定義:
相關:%1d s %3d/ 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 層都能夠達到保護私有數據的作用 。

這裏寫圖片描述

歡迎您掃一掃上面的微信公衆號,訂閱我的個人公衆號! 本公衆號將以推送Android各種碎片化小知識或小技巧,以及整理Android面試知識點爲主,也會不定期將開發老司機日常工作中踩過的坑,平時自學的一些知識總結出來進行分享。每天一點乾貨小知識把你的碎片時間充分利用起來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章