在開(kāi)始使用Android SDK編寫(xiě)第一個(gè)示例之前,必須確保已經(jīng)按照Android環(huán)境設(shè)置教程中的說(shuō)明正確設(shè)置了您的Android開(kāi)發(fā)環(huán)境。
下面來(lái)看看如何編寫(xiě)一個(gè)簡(jiǎn)單的Android應(yīng)用程序,它將打印“Hello World!”。
注:理解這篇教程,對(duì)后面的學(xué)習(xí)非常重要。了解項(xiàng)目中每個(gè)目錄和每個(gè)文件的功能和作用。
第一步是使用Android Studio創(chuàng)建一個(gè)簡(jiǎn)單的Android應(yīng)用程序。 當(dāng)點(diǎn)擊Android Studio圖標(biāo)啟動(dòng)完成時(shí),它將顯示如下所示的屏幕 -
可以通過(guò)調(diào)用Start a new Android Studio Project 來(lái)開(kāi)始創(chuàng)建應(yīng)用程序開(kāi)發(fā)。 在新的安裝框架中應(yīng)詢(xún)問(wèn)應(yīng)用程序名稱(chēng),包裝信息和項(xiàng)目的位置。
輸入應(yīng)用程序名稱(chēng)(HelloWorld)后,選擇應(yīng)用程序運(yùn)行的Android目標(biāo)設(shè)備,在這里需要指定最小的SDK,在這個(gè)教程中,選擇最小SDK為 API 21:Android 5.0(Lollipop) -
下一級(jí)安裝應(yīng)該包含選擇移動(dòng)設(shè)備的活動(dòng),它指定應(yīng)用程序的默認(rèn)布局。
選擇一個(gè)空的Activity
,如下所示 -
配置Activity
,默認(rèn)即可,點(diǎn)擊完成。如下所示 -
在完成之后,開(kāi)發(fā)開(kāi)發(fā)工具將顯示如下界面,我們可以開(kāi)始編寫(xiě)應(yīng)用程序的代碼了。
下面來(lái)看看,如何運(yùn)行這個(gè)"Hello World!"
應(yīng)用程序。假設(shè)您在創(chuàng)建環(huán)境的時(shí)候創(chuàng)建了AVD。 要從Android Studio運(yùn)行應(yīng)用程序,請(qǐng)打開(kāi)項(xiàng)目的一個(gè)活動(dòng)文件,然后單擊工具欄上的“運(yùn)行app”圖標(biāo)。如下圖中箭頭指向的位置 -
選擇發(fā)布目標(biāo),如下圖所示 -
注意:在這個(gè)過(guò)程中,Android Studio 可能需要安裝一些其它的依懶組件,這就要求必須能連接到互聯(lián)網(wǎng)絡(luò)了。安裝過(guò)程如下 -
Android Studio 在配置的AVD上安裝應(yīng)用程序并啟動(dòng)它,如果您的設(shè)置和應(yīng)用程序一切正常,它將顯示以下“模擬器”窗口 -
以下是Android Studio中的的項(xiàng)目結(jié)構(gòu)圖:
下面對(duì)上面文件或目錄的解釋 -
編號(hào) | 文件或目錄 | 描述 |
---|---|---|
1 | AndroidManifest.xml |
這是清單文件,它描述了應(yīng)用程序的基本特征并定義了它的每個(gè)組件。 |
2 | java |
這包含項(xiàng)目的.java 源文件。 默認(rèn)情況下,它包含一個(gè)具有活動(dòng)類(lèi)的MainActivity.java 源文件,該Activity 類(lèi)在應(yīng)用程序使用應(yīng)用程序圖標(biāo)啟動(dòng)時(shí)運(yùn)行。 |
3 | res/drawable |
以前的Android版本使用這個(gè)文件夾來(lái)存儲(chǔ)圖像,當(dāng)前版本使用mipmap 文件夾來(lái)存儲(chǔ)圖像。這個(gè)目錄幾乎不再使用。 |
4 | res/layout |
這是定義應(yīng)用程序用戶(hù)界面的文件的目錄。 |
5 | res/menu |
包含將顯示在操作欄上的項(xiàng)目的XML菜單文件夾 |
6 | res/mipmap |
使用來(lái)包含mipmap 圖像 |
7 | res/values |
這是包含資源集合(如字符串和顏色定義)的其他各種XML文件的目錄。 |
無(wú)論您作為應(yīng)用程序的一部分開(kāi)發(fā)什么組件,都必須在AndroidManifest.xml
中聲明其所有組件。這個(gè)文件作為Android OS和應(yīng)用程序之間的接口,所以如果沒(méi)有在這個(gè)文件中聲明你的組件,那么操作系統(tǒng)將不會(huì)考慮它。 例如,默認(rèn)清單文件將如下面的文件所示 -
需要更多地了解mipmap
文件夾中的圖像,請(qǐng)參閱下面的圖像,mipmap
文件夾中有一個(gè)圖像文件。
在使用Android應(yīng)用程序時(shí)偶爾遇到的一個(gè)問(wèn)題是,比如看到的圖像比較模糊,像素化或笨拙地拉伸。 解決此問(wèn)題的方法是為Android支持的每種密度創(chuàng)建一個(gè)可繪制的文件夾,并將正確縮放的圖像放在每個(gè)文件夾中。 Android支持6種不同的密度范圍(以每英寸點(diǎn)數(shù)衡量):
13
中引入的。首先,了解Activity是什么?Activity
是支持屏幕或UI的Java代碼。換句話(huà)說(shuō),用戶(hù)界面的構(gòu)建塊就是Activity
。 Activity
類(lèi)是Android中的一個(gè)預(yù)定義類(lèi),每個(gè)擁有UI的應(yīng)用程序都必須繼承它來(lái)創(chuàng)建窗口。
例如,MainActivity
類(lèi)是一個(gè)Activity
,它從庫(kù)中的Activity
類(lèi)擴(kuò)展而來(lái)。 下圖說(shuō)明了一個(gè)Activity
的生命周期。
Activity
的一個(gè)生命周期描述了一個(gè)Activity
開(kāi)始啟動(dòng)后的進(jìn)程,直到應(yīng)用程序關(guān)閉。 包括Activity
暫時(shí)停止的進(jìn)程,恢復(fù)等等。
為了更容易理解,可以修改MainActivity
類(lèi)的代碼,覆蓋onStart()
,onResume()
等方法,添加顯示方法已經(jīng)運(yùn)行的消息。重新運(yùn)行應(yīng)用程序,看看會(huì)發(fā)生什么?
package com.yiibai.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
public static final String TAG ="MyMessage";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Print Log
Log.i(TAG,"onCreate");
}
@Override
protected void onStop() {
super.onStop();
// Print Log
Log.i(TAG,"onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
// Print Log
Log.i(TAG,"onDestroy");
}
@Override
protected void onPause() {
super.onPause();
// Print Log
Log.i(TAG,"onPause");
}
@Override
protected void onResume() {
super.onResume();
// Print Log
Log.i(TAG,"onResume"); }
@Override
protected void onStart() {
super.onStart();
// Print Log
Log.i(TAG,"onStart");
}
@Override
protected void onRestart() {
super.onRestart();
// Print Log
Log.i(TAG,"onRestart"); }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// Print Log
Log.i(TAG, "onCreateOptionsMenu");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Print Log
Log.i(TAG, "onOptionsItemSelected");
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
return super.onOptionsItemSelected(item);
}
}
重新運(yùn)行應(yīng)用程序,并且看到記錄在logcat
窗口上的消息。
可以將篩選器設(shè)置為logcat
,只顯示日志記錄的消息。
過(guò)濾器名稱(chēng):My Filter
日志標(biāo)記(正則表達(dá)式):MyMessage
現(xiàn)在,logcat 窗口只顯示指定的消息。
您已經(jīng)成功運(yùn)行了第一個(gè)Android應(yīng)用程序,現(xiàn)在來(lái)回顧一下從應(yīng)用程序調(diào)用以來(lái)Android如何運(yùn)行。
在“項(xiàng)目”窗口中看到的不是涉及創(chuàng)建應(yīng)用程序的所有組件。有些組件是由編譯器程序自動(dòng)生成的。 而且它不顯示在項(xiàng)目窗口上。 例如,根據(jù)項(xiàng)目中源文件的結(jié)構(gòu),編譯器將創(chuàng)建一個(gè)R.java 源文件,該文件為項(xiàng)目上的資源定義常量。
要在Android Studio上查看R.java 文件,請(qǐng)打開(kāi)MainActivity
類(lèi),右鍵單擊R.layout.main_activity
,然后選擇執(zhí)行(Go to / Implementation)
在R.java類(lèi)中定義的常量是根據(jù)Project中的資源來(lái)創(chuàng)建的:
因此,在項(xiàng)目的某個(gè)地方,可以使用常量來(lái)引用項(xiàng)目中的資源。例如,R.layout.activity_main
是一個(gè)常量,它表示res/layout
文件夾中的activity_main.xml
文件。
工作原理: