一、R文件是什么?
如上圖所示,我們可以通過findViewById方法通過傳入R.id.show找到我們的TextView元素,findViewById方法也很好理解,從View中通過Id找到,那么R是什么呢?
資源文件的使用分為在代碼中使用和在其他資源文件中引用該資源文件。在我們編譯一個Android應用時,Android會自動生成一個R類,在該類中根據不同的資源類型又生成了相應的內部類,該類包含了系統中使用到的所有資源文件的標示,在Android Studio編譯環境下,R文件在“D:\UsersFiles\AndroidStudioProjects\MyFirstApp\app\build\generated\source\r\debug\com\example\boyliupan\myfirstapp”目錄下(本項目),其中“D:\UsersFiles\AndroidStudioProjects”是我自己定義的工作空間的路徑,“MyFirstApp”是我創建的項目名稱。
在查詢的網絡資料和書中
提示R.Java文件存儲在“/ge/<package name>”目錄下,但是我在Android Studio的編譯結果中並沒有找到這一項。
我們打開R.java,看一下里面的內容:
其中第1-6行是系統自動生成的注釋,說明這是AAPT工具通過它找到的資源數據自動生成的文件,它不能被手動修改(因為你修改了也沒用,每次重新生成都會被覆蓋)。
AAPT也就是Android Asset Packaging Tool,即Android資源打包工具,通常都是由IDE自動調用,我們不需要手動去使用。
第8-39行就是AAPT自動生成的代碼了,該類的名字就是R,其下定義了一些常量。我們可以把R.java理解成資源字典,記錄着所有可使用資源的Id,
通過這些Id,我們就可以很方便的在程序中使用這些資源了。
AAPT工具生成R.java文件的規則主要是如下兩條:
1.每類資源對對應於R類的一個內部類。比如所有字符串資源對應一個string內部類,所有布局類資源對應於layout內部類。
2.每個具體的資源向對應於內部類的一個public static final int類型的字段,比如我們在示例中定義了show的標識符,我們就可以通過R.Id.show找到。
二、Res目錄說明
Res目錄存放了Android應用所用的全部資源,包括圖片資源、字符串資源、顏色資源等等。其中包含多個目錄(這里只說明一部分):
A).其中drawable文件夾用於存儲.png、.9.png、.jpg等圖片資源(.9.png是Android特有的圖片格式,可以根據情況進行拉伸,達到不變形的效果),他們的分變率從高到低,如果你打算在android應用中包含一個圖片或者圖標,就應該把它們放在這個目錄。
B)layout文件夾存放的是應用程序的布局文件,這些layout是以xml形式保存的。C)values 這個目錄也包含了一些xml文件,但主要是應用中要引用的key-value對。這些XML文件聲明了數組(Array)、顏色(color)、度量(Dimension)、字符串。之所以把這些東西分別放在單獨的xml文件中主要是考慮到這些值能夠在不更改源代碼的情況下用於多語言環境。例如,根據用戶語言的不同應用程序中的信息可以有多種語言版本。
Res目錄下的資源與R.JAVA的關系
開發者只要編輯Res目錄下的資源,R.JAVA根據Res內容完全自動生成,為每個資源分配一個ID,編程時可以通過ID來調用,下面我們會說使用方式。
我們知道資源的使用分為在java代碼中使用和在XML文件中引用,下面我們分這兩種情況說明一下如何使用:
1.在java代碼中使用
這個很簡單,我們在前面的例子中已經使用過,直接調用R.id.資源ID就可以調用到(這里演示的是標識符下的資源,如果是字符串資源,就是R.string.資源ID,請自行理解)
2.在XML文件中引用
在XML文件中引用,我們只需要要照着“@<資源對應內部類類名>/<資源項名稱>”來訪問即可,比如string資源下默認定義了一個app_name的資源我們就可以這樣調用“@string/app_name”
3.例外
當我們在XML中使用標識符時,這些標識符不需要使用專門的資源進行定義,我們直接使用“@id/<標識符代號>”來分配標識符即可。
目錄資源的訪問:
res目錄資源通過Resources的相應方法來訪問。
相關的信息可以這樣獲取:
三、AndroidManifest.xml說明
清單文件:這個XML文件包含了android應用中的元信息,是每個android項目中的重要文件。在軟件安裝的時候被讀取 ,Android中的四大組件(Activity、ContentProvider、BroadcastReceiver、Service)都需要在該文件中,以及運行這個android應用程序需要的用戶權限列表,例如:電話、短信、互聯網、訪問SD卡,同時也詳細描述了android應用的項目結構。通過可以包含如下信息:
1.應用程序的包名,該包名將會作為該應用的唯一標識。
2.應用中所包含的組件,如Activity,Services等等。
3.應用程序兼容的最低版本
4.應用程序使用系統所需的權限聲明
5.其它程序訪問該應用所需的權限聲明
下面是我們示例的清單文件,灰色字體是說明:
四、應用權限的說明及使用
Android應用想要調用某些系統的功能就必須具有相應的權限才可以,比如我們想調用GPS模塊,這時我們就必須擁有使用GPS的權限;我們的應用也可能被其他應用調用,這時候也需要聲明調用我們的應用需要的權限。
1.運行該應用需要的權限
只需要在清單文件的<manifest../>元素中添加<uses-permission…/>子元素即可。例如:
2.調用我們的應用所需要的權限
聲明方法和上述一致,只是聲明的位置要放在具體的組件元素節點下。
Android的SDK提供了大量的權限,這些權限都位於Manifest.permission類中,我們常用的權限如下:
權限 |
說明 |
ACCESS_NETWORK_STATE | 允許應用程序獲取網絡狀態 |
ACCESS_WIFI_STATE | 運行應用程序獲取WIFI狀態 |
BATTERY_STATS | 允許應用程序獲取電池狀態 |
BLUETOOTH | 允許應用程序連接藍牙 |
BLUETOOTH_ADMIN | 允許應用程序發現藍牙 |
BROADCAST_SMS | 允許應用程序廣播收到短信提醒 |
CALL_PHONE | 允許應用程序使用撥號功能 |
CAMERA | 允許應用程序使用攝像頭 |
CHANGE_NETWORK_STATE | 允許應用程序改變網絡狀態 |
CHANGE_WIFI_STATE | 允許應用程序改變WIFI狀態 |
DELETE_CACHE_FILES | 允許應用程序刪除緩存文件 |
FLASHLIGHT | 允許應用程序使用閃光燈 |
INTERNET | 允許應用程序打開網絡Socket |
MODIFY_AUDIO_SETTINGS | 允許應用程序修改全局聲音設置 |
PROCESS_OUTGOING_CALLS | 允許應用程序監聽、控制、取消呼出電話 |
DELETE_PACKAGES | 允許應用程序刪除安裝包 |
READ_CONTACTS | 允許應用程序讀取聯系人 |
READ_HISTORY_BOOKMARKS | 允許應用程序讀取歷史書簽 |
READ_OWNER_DATA | 允許應用程序讀取用戶數據 |
READ_PHONE_STATE | 允許應用程序讀取手機狀態 |
READ_PHONE_SMS | 允許應用程序讀取短信 |
REBOOT | 允許應用程序重啟手機 |
RECEIVE_MMS | 允許應用程序接收、監控、處理彩信 |
RECEIVE_SMS | 允許應用程序接收、監控、處理短信 |
RECORD_AUDIO | 允許應用程序使用錄音 |
SEND_SMS | 允許應用程序發送短信 |
SET_ORIENTATION | 允許應用程序旋轉屏幕 |
SET_TIME | 允許應用程序設置時間 |
SET_TIME_ZONE | 允許應用程序設置時區 |
SET_WALLPAPER | 允許應用程序設置壁紙 |
VIBRATE | 允許應用程序控制振動器 |
WRITE_CONTACTS | 允許應用程序寫入聯系人 |
WRITE_HISTORY_BOOKMARKS | 允許應用程序寫入歷史書簽 |
WRITE_OWNER_DATA | 允許應用程序寫入用戶數據 |
WRITE_SMS | 允許應用程序寫短信 |
。。。。 | 。。。。。 |
表格取自《瘋狂android講義》后續會做補充完善
五、結語&下篇預告
最近買了一本《瘋狂Android講義》第三版,看了前幾章,不得不說,作者很有思想,安排的內容循序漸進,很多內容講的淺顯易懂,讀了深有感觸,這個系列的文章為讀書筆記,會有一些內容參考書中的內容,我認為寫的比較實用的地方會總結出來,會有借用部分,向作者致敬,希望有志學習Android開發的同學可以買一本學習學習。
下一篇會簡單介紹一下Android開發中常用的組件,概念性的東西,介紹完以后新的篇章會開始Android開發中各個UI組件的學習。