作者:阿濤
CSDN部落格主頁:https://blog.csdn.net/qq_43313113
每個Android專案都有一個名為AndroidManifest.xml的檔案,包含了Android系統執行前必須掌握的相關資訊,如應用程式名稱、圖示、應用程式的包名、元件註冊資訊和許可權設定等。
Android以Java作為程式語言,因此其程式檔案以.java作為擴充套件名。Java程式檔案位於src資料夾的某個包內。
在Android專案中,有字串、點陣圖、佈局等資源,可以將其劃分為三種型別:XML檔案、點陣圖(影象)檔案、raw(聲音)檔案。
在Android專案中,有兩個用於存放資原始檔的資料夾,分別為res和assets。其中,res資料夾內的資原始檔最終被打包到編譯後的.java檔案中,res資料夾內不支援深度的子目錄;assets資料夾中的資原始檔不會被編譯,而是直接打包到應用中,assets資料夾支援任意深度的子目錄。res資料夾內的資原始檔可以通過R資源類存取,而assets資料夾內的資原始檔則不能。
佈局資料夾res/layout用來存放擴充套件名為.xml的佈局檔案,由某種佈局管理器管理的若干控制元件物件組成,供Activity元件使用。
值資料夾res/values裡的strings.xml是非常重要的檔案,通常存放著佈局檔案中控制元件物件的屬性值。
國際化是指在軟體設計過程中將特定語言及區域脫鉤的過程,當軟體移植到不同的語言及區域時,軟體本身不需要做任何的修改。
Android SDK並沒有提供給專門的API來實現國際化,而是通過對不同的資原始檔進行不同的命名來達到國際化的目的 。
比如控制元件值來源於檔案res/values/strings.xml,通過鍵名hello來參照,就是符合國際化的做法。如在佈局檔案中,定義文字方塊控制元件的程式碼:
<TextView ...android:text="@string/hello" />
如果不通過參照字串變數的方式,而是直接把字串常數寫在TextView控制元件的android:text屬性後,這種寫法對程式執行沒有任何影響,只是不符合國際化的做法,其程式碼如下:
<TextView ...android:text="字串常數" />
每個Android應用專案都有一個圖示,預設使用的圖示檔案是ic_launcher是一個綠色的機器人,檔案格式是.xml,存放在資料夾res/mipmap裡。
更改Android應用預設圖示的兩種方法:
(1)右擊mipmap→New→Vector Asset→Clip Art。
(2)先將.png格式的檔案,複製到資料夾res/drawable中,然後通過R檔案參照該影象檔案。
專案使用的音訊檔,通常存放在res/raw資料夾裡。
在Android Studio開發中,有時希望把多個相關聯的應用集合在一個專案裡,使用Android Studio提供的多模組功能可以做到這一點。
在一個已經建立好的專案裡,建立一個新模組的操作方法是:File→New→New Module。建立New Module的方法與建立專案的步驟基本相同,只是New Module的名稱取代了專案名稱。
建立專案時,自動生成的app實質上就是一個Module,它會呼叫後來建立的Module。在工具列裡,可以選擇不同的Module單獨進行偵錯和安裝。
根據Android應用程式的功能,元件可劃分為四類核心元件:Activity、Service、BroadcastReceiver和ContentProvider。Android四大元件都需要在專案清單檔案中使用相關標籤進行註冊。
Activity負責使用者介面的設計,是Android最重要的元件。Activity使用者介面框架採用MVC模式(Model View Controller)。控制器負責接受並響應程式的外部動作,通過檢視反饋應用程式給使用者的資訊(UI介面反饋),模型是應用程式的核心,用於儲存資料和程式碼。Activity元件在清單檔案中使用標籤註冊
Service是Android提供的無使用者介面、長時間在後臺執行的元件。Android提供了許多系統服務程式。Service元件在清單檔案中使用標籤註冊。
在Android系統中,當有特定事件發生時就會產生相應的廣播,如開機啟動完成、收到簡訊、電量改變、網路狀態改變等。
BroadcastReceiver(廣播接收者)接收來自系統或其他應用程式的廣播,並做出迴應。BroadcastReceiver沒有UI介面,在清單檔案中使用標籤註冊。
ContentProvider元件可以在無須瞭解資料來源、路徑的情況下,對共用資料進行查詢、新增、刪除和更新等操作。ContentProvider元件在清單檔案中使用標籤註冊。
當Android程式啟動時系統會建立一個Application型別的物件,用來儲存系統的一些資訊完成資料傳遞、共用和快取等操作。Application物件的生命週期是整個程式中最長的,等於這個程式的生命週期,且是全域性的、單例的,即在不同的Activity和Service中獲得的物件都是同一個物件。
Activity和Service都是Context的子類,通過Context提供的方法getApplicationContext()就能獲得Context物件。通過Intent物件,Activity元件之間可以相互呼叫,實現有引數傳遞或返回值的呼叫。
BroadcastReceiver和ContentProvider並不是Context的子類,其所持有的Context都是由其他元件傳遞過來的。在Activity和Service元件裡傳送廣播,均需要使用Intent物件。
Android元件及通訊機制如下圖:
Intent是一種輕量級的程序間通訊機制,讓跨行程群元件通訊和傳送系統廣播成為可能,元件Activity、Service和BroadcastReceiver都是通過訊息機制被啟動(啟用)的,其使用的訊息就封裝在物件Intent裡。
Content是一個抽象類且是Activity的超類,提供了startActivity()方法,並以Intent物件作為引數,用於實現表單的跳轉。
在Android中,呼叫其他應用的動作名稱由眾多的類提供,也可以自定義。Android系統提供的常用意圖動作名稱如下表:
方法名 | 功能描述 |
---|---|
Intent.ACTION_MAIN | 標識Activity為一個程式的開始,參見清單檔案中對主Activity的定義 |
Intent.ACTION_DIAL | 呼叫系統提供的撥號程式 |
Intent.ACTION_CALL | 呼叫指定的電話 |
Intent.ACTION_SENDTO | 傳簡訊、E-Mail等 |
Intent.ACTION_VIEW | 瀏覽網頁、地圖、播放多媒體等 |
Intent.ACTION_WEB_SEARCH | 網路搜尋 |
Intent.ACTION_BATTERY_CHANGED | 檢查手機電量情況 |
Intent.ACTION_REQUEST_ENABLE | 藍芽當前是否可用 |
在一個Android應用程式開始執行的時候,會單獨啟動一個程序(Process)。預設情況下,這個應用程式的所有元件都會執行在這個程序裡。
一個Android應用程式通常由多個Activity組成,但只有一個主Activity。在專案清單檔案中使用標籤註冊主Activity時,還需要內嵌、和標籤,以此說明該Activity為應用程式的入口。以下程式碼是定義一個MainActivity.java為應用的主Activity程式碼:
<activity
android:name="packname.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
系統撥號程式可以理解為系統預先定義的一個Activity,通過Intent物件去啟用,步驟如下:
(1)在專案的佈局檔案裡,新增一個名為call_btn的Button控制元件
(2)在MainActivity程式的onCreate()方法裡,新增如下程式碼:
//先找控制元件,後設定監聽器(使用匿名內部類建立監聽器物件)
findViewById(R.id.call_btn).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//建立意圖物件
Intent intent = new Intent();
//呼叫系統的介面程式
intent.setAction(Intent.ACTION_VIEW);
//intent.setAction(Intent.ACTION_DIAL); //呼叫系統的撥號程式
//根據資料型別開啟相應的Activity(撥號程式)
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
});
android.weiget.Toast類用於實現訊息提醒,其資訊在顯示幾秒後自動消失,只能以程式程式碼的方式設計。
Toast的靜態方法makeText(Context,CharSequence,int)用於建立一個Toast物件,三個引數分別為:
①上下文物件,表示在哪個Activity裡顯示
②要顯示的字串資訊
③顯示的時長,可使用類常數Toast.LENGTH_LONG或Toast.LENGTH_SHORT,也可使用以毫秒為單位的正整數
通常先使用makeText()方法建立一個Toast物件,再使用show()方法顯示某個Activity。在使用show()前,可以使用setGravity(int,int,int)方法設定顯示位置,如果不設定,則預設出現在手機螢幕偏下的位置。
Toast.makeText(this,"顯示資訊",Toast.LENGTH_LONG).show(); //this表示當前Activity的上下文
Android系統執行應用程式時會產生一些紀錄檔(Log)資訊,按照級別從低到高的順序劃分為Verbose(詳細)、Debug(偵錯)、Information(資訊)、Warning(警告)和Error(錯誤)等不同級別。
如果Android程式執行時閃退,則表明程式遇到了致命的錯誤。開啟Logcat控制檯,選擇紀錄檔級別為Error,可獲取錯誤資訊。也可以通過檢視Run控制檯,找到出錯的原因。
Log是一個Android類,提供了產生不同級別紀錄檔資訊,方法有v(string,string)、d(string,string)、i(string,string)、w(string,string)、e(string,string)。其中第一個引數是使用者自定義方便篩選的標籤,第二個引數是需要輸出的資訊。
在Android Studio環境中,也可以通過設定斷點、檢查變數值的方式來檢查錯誤,適用於程式錯誤的快速精確定位。
單擊某行行號陰影區域即可設定斷點,將產生一個斷點標記。再次點選可以取消。
點選工具列上的爬蟲圖示,將以Debug方式執行程式,在各個斷點處暫停程式執行並顯示記憶體變數值。單擊向下圖示,可以以單步方式執行程式。
作者:阿濤
CSDN部落格主頁:https://blog.csdn.net/qq_43313113
如有不對的地方,歡迎在評論區指正
歡迎大家關注我,我將持續更新更多的文章