Android 從0到1開發(fā)第一個(gè)HelloWorld程序

Android 是一個(gè)開源的现喳,基于 Linux 的移動(dòng)設(shè)備操作系統(tǒng)选脊。

Android 開發(fā)環(huán)境搭建(Mac)

  • 帶有英特爾芯片的 Mac OS X10.5.8或更高版本。
  • 需要用到的軟件列表
    • Java JDK5 或 以后版本
    • Android SDK
    • Java運(yùn)行時(shí)環(huán)境(JRE)
    • Android Studio

快捷鍵

  • Mac查看已安裝JDK版本
/usr/libexec/java_home -V

Android 架構(gòu)

  • Linux內(nèi)核:提供了基本的系統(tǒng)功能,比如進(jìn)程管理矮慕,內(nèi)存管理,設(shè)備管理

  • 程序庫(kù):包括開源的 Web 瀏覽器引擎 Webkit 啄骇,知名的 libc 庫(kù)痴鳄,用于倉(cāng)庫(kù)存儲(chǔ)和應(yīng)用數(shù)據(jù)共享的 SQLite 數(shù)據(jù)庫(kù),用于播放缸夹、錄制音視頻的庫(kù)痪寻,用于網(wǎng)絡(luò)安全的 SSL 庫(kù)等

  • android.app - 提供應(yīng)用程序模型的訪問螺句,是所有 Android 應(yīng)用程序的基石。

  • android.content - 方便應(yīng)用程序之間橡类,應(yīng)用程序組件之間的內(nèi)容訪問蛇尚,發(fā)布,消息傳遞猫态。

  • android.database - 用于訪問內(nèi)容提供者發(fā)布的數(shù)據(jù)佣蓉,包含 SQLite 數(shù)據(jù)庫(kù)管理類。

  • android.opengl - OpenGL ES 3D 圖片渲染 API 的 Java 接口亲雪。

  • android.os - 提供應(yīng)用程序訪問標(biāo)注操作系統(tǒng)服務(wù)的能力勇凭,包括消息,系統(tǒng)服務(wù)和進(jìn)程間通信义辕。

  • android.text - 在設(shè)備顯示上渲染和操作文本虾标。

  • android.view - 應(yīng)用程序用戶界面的基礎(chǔ)構(gòu)建塊UI

  • android.widget - 豐富的預(yù)置用戶界面組件集合灌砖,包括按鈕璧函,標(biāo)簽,列表基显,布局管理蘸吓,單選按鈕等。

  • android.webkit - 一系列類的集合撩幽,允許為應(yīng)用程序提供內(nèi)建的 Web 瀏覽能力库继。

  • 運(yùn)行時(shí):使得每一個(gè) Android 應(yīng)用程序運(yùn)行在自己獨(dú)立的虛擬機(jī)進(jìn)程。

  • 應(yīng)用框架

    • 活動(dòng)管理者 - 控制應(yīng)用程序生命周期和活動(dòng)棧的所有方面窜醉。
    • 內(nèi)容提供者 - 允許應(yīng)用程序之間發(fā)布和分享數(shù)據(jù)宪萄。
    • 資源管理器 - 提供對(duì)非代碼嵌入資源的訪問,如字符串榨惰,顏色設(shè)置和用戶界面布局拜英。
    • 通知管理器 - 允許應(yīng)用程序顯示對(duì)話框或者通知給用戶
    • 視圖系統(tǒng) - 一個(gè)可擴(kuò)展的視圖集合琅催,用于創(chuàng)建應(yīng)用程序用戶界面居凶。

應(yīng)用程序組件

AndroidManifest.xml描述了應(yīng)用程序的每個(gè)組件,以及他們?nèi)绾谓换?/p>

應(yīng)用程序中使用的四個(gè)主要組件

Activities-UI操作

描述UI恢暖,處理用戶與屏幕的交互

public class MainActivity extends Activity {
  
}

Services-后臺(tái)

-處理與應(yīng)用程序關(guān)聯(lián)的后臺(tái)操作

運(yùn)行在后臺(tái)排监,執(zhí)行長(zhǎng)時(shí)間操作的組件,例如后臺(tái)播放音樂杰捂,不阻塞用戶交互

public class MyService extends Service {

}

BroadcastReceivers-消息接收

可以響應(yīng)從其他應(yīng)用程序或者系統(tǒng)發(fā)來的廣播消息

public class MyReceiver  extends  BroadcastReceiver {

}

Content Providers-數(shù)據(jù)處理

處理數(shù)據(jù)和數(shù)據(jù)庫(kù)管理

通過請(qǐng)求從一個(gè)應(yīng)用程序到另一個(gè)應(yīng)用程序提供數(shù)據(jù)舆床。這些請(qǐng)求由ContentResolver類的方法來處理。這些數(shù)據(jù)可以是存儲(chǔ)在文件系統(tǒng)、數(shù)據(jù)庫(kù)或者其他其他地方挨队。

public class MyContentProvider extends  ContentProvider {

}

附件組件

Fragments

代表活動(dòng)中的一個(gè)行為或者一部分用戶界面

Views

繪制在屏幕上的UI元素谷暮,包括按鈕,列表等盛垦。

Layouts

控制屏幕格式湿弦,展示視圖外觀的View的繼承。

Intents

組件間的消息連線

Resources

外部元素腾夯,例如字符串資源颊埃、常量資源及圖片資源

Manifest

應(yīng)用程序的配置文件

Hello World 實(shí)例

  • AndroidStudio 創(chuàng)建第一個(gè)HelloWorld項(xiàng)目
效果圖
  • Android 應(yīng)用程序剖析

    效果圖

Manifest文件

聲明所有的組件,這個(gè)文件是Android操作系統(tǒng)與你的應(yīng)用程序之間的接口(如果沒有在這個(gè)文件中聲明你的組件蝶俱,將無法被操作系統(tǒng)所識(shí)別)

例如:

  • andnroid:icon屬性指出位于res/drawable-hdpi下面的應(yīng)用程序圖標(biāo)
  • android:name屬性指定一個(gè)Activity類子類的全名
  • android:label屬性指定用于活動(dòng)名稱的字符串

Layout 文件 布局文件

當(dāng)應(yīng)用程序構(gòu)建它的界面時(shí)被引用班利。你將非常頻繁的修改這個(gè)文件來改變應(yīng)用程序的布局

主要活動(dòng)文件MainActivity.javaJava文件中

這是實(shí)際的應(yīng)用程序文件,將被轉(zhuǎn)化為Dalvik可執(zhí)行文件并運(yùn)行榨呆。

下面為Hello World應(yīng)用生成的默認(rèn)代碼 (MainActivity.java)

package com.example.helloworld;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

  • ? 方法解析
    • R.layout.activity_main引用自res/layout目錄下的activity_main.xml文件
    • onCreate()是活動(dòng)被加載之后眾多被調(diào)用的方法之一
  • 運(yùn)行效果如下
效果圖
  • R 文件罗标,即自動(dòng)生成的文件

其他

1.資源訪問

你用到的各種靜態(tài)內(nèi)容,如位圖积蜻,顏色闯割,布局定義,用戶界面字符串竿拆,動(dòng)畫等等宙拉。這些資源一般放置在項(xiàng)目的 res/ 下獨(dú)立子目錄中。

組織應(yīng)用程序資源丙笋,指定替代資源鼓黔,并在應(yīng)用程序中訪問它們

在項(xiàng)目中 res/ 目錄里面支持的資源

anim/ 定義動(dòng)畫屬性的XML文件。它們被保存在res/anim/文件夾下不见,通過R.anim類訪問
color/ 定義顏色狀態(tài)列表的XML文件。它們被保存在res/color/文件夾下崔步,通過R.color類訪問
drawable/ 圖片文件稳吮,如.png,.jpg,.gif或者XML文件,被編譯為位圖井濒、狀態(tài)列表灶似、形狀、動(dòng)畫圖片瑞你。它們被保存在res/drawable/文件夾下酪惭,通過R.drawable類訪問
layout/ 定義用戶界面布局的XML文件。它們被保存在res/layout/文件夾下者甲,通過R.layout類訪問
menu/ 定義應(yīng)用程序菜單的XML文件春感,如選項(xiàng)菜單,上下文菜單,子菜單等鲫懒。它們被保存在res/menu/文件夾下嫩实,通過R.menu類訪問
raw/ 任意的文件以它們的原始形式保存。需要根據(jù)名為R.raw.filename的資源ID窥岩,通過調(diào)用Resource.openRawResource()來打開raw文件
values/ 包含簡(jiǎn)單值(如字符串甲献,整數(shù),顏色等)的XML文件颂翼。這里有一些文件夾下的資源命名規(guī)范晃洒。arrays.xml代表數(shù)組資源,通過R.array類訪問朦乏;integers.xml代表整數(shù)資源球及,通過R.integer類訪問;bools.xml代表布爾值資源集歇,通過R.bool類訪問桶略;colors.xml代表顏色資源,通過R.color類訪問诲宇;dimens.xml代表維度值际歼,通過R.dimen類訪問;strings.xml代表字符串資源姑蓝,通過R.string類訪問鹅心;styles.xml代表樣式資源,通過R.style類訪問
xml/ 可以通過調(diào)用Resources.getXML()來在運(yùn)行時(shí)讀取任意的XML文件纺荧⌒窭ⅲ可以在這里保存運(yùn)行時(shí)使用的各種配置文件

替代資源

需要為特定的設(shè)備配置提供替代的資源支持。比如說宙暇,你需要為不同的屏幕分辨率提供替代的圖片資源.

在運(yùn)行時(shí)输枯,Android 檢測(cè)當(dāng)前設(shè)備配置,并為應(yīng)用程序加載合適的資源占贫。

下面是一個(gè)例子桃熄,指定默認(rèn)屏幕的圖片和高分辨率的替代圖片。

MyProject/
   src/
    main/
    java/
       MyActivity.java  
       res/
        drawable/  
            icon.png
            background.png
        drawable-hdpi/  
            icon.png
            background.png  
        layout/  
            activity_main.xml
            info.xml
        values/  
            strings.xml

訪問資源

在代碼訪問資源

當(dāng) Android 應(yīng)用程序被編譯型奥,生成一個(gè) R 類瞳收,其中包含了所有 res/ 目錄下資源的 ID。你可以使用 R 類厢汹,通過子類+資源名或者直接使用資源 ID 來訪問資源螟深。

訪問 res/drawable/myimage.png,并將其設(shè)置到 ImageView 上烫葬,你將使用以下代碼:

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
  • R.id.myimageview 來在布局文件中獲取定義為 myimageview 的 ImageView
  • R.drawable.myimage 來獲取在 res/ 的 drawable 子目錄下名為 myimage 的圖片

案例2

res/values/strings.xml 有如下定義

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string  name="hello">Hello, World!</string>
</resources>

在 ID 為 msg 的 TextView 對(duì)象上使用資源 ID 來設(shè)置文本

TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);
在XML中訪問

資源文件 res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

在下面的布局文件中使用這些資源來設(shè)置文本顏色和文本內(nèi)容

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@color/opaque_red"
    android:text="@string/hello" />

2.活動(dòng)(Activity)

一個(gè)具有用戶界面的單一屏幕(ViewController),Android 系統(tǒng)初始化它的程序是通過活動(dòng)中的 onCreate() 回調(diào)的調(diào)用開始的

活動(dòng)生命周期圖如下:

效果圖

方法概述及詳解

  • onCreate()在活動(dòng)第一次創(chuàng)建時(shí)調(diào)用
  • onStart()在活動(dòng)為用戶可見時(shí)被調(diào)用
  • onResume()在應(yīng)用程序與用戶開始可交互的時(shí)候調(diào)用
  • onPause()被暫停的活動(dòng)無法接受用戶輸入界弧,不能執(zhí)行任何代碼凡蜻。當(dāng)前活動(dòng)將要被暫停,上一個(gè)活動(dòng)將要被恢復(fù)時(shí)調(diào)用
  • onStop()當(dāng)活動(dòng)不在可見時(shí)調(diào)用
  • onDestroy()當(dāng)活動(dòng)被系統(tǒng)銷毀之前調(diào)用
  • onRestart()當(dāng)活動(dòng)被停止以后重新打開時(shí)調(diào)用

代碼

package com.example.helloworld;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;


public class MainActivity extends AppCompatActivity {

    String msg = "Android : ";

    /** 當(dāng)活動(dòng)第一次被創(chuàng)建時(shí)調(diào)用 */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(msg, "The onCreate() event");
    }

    /** 當(dāng)活動(dòng)即將可見時(shí)調(diào)用 */
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(msg, "The onStart() event");
    }

    /** 當(dāng)活動(dòng)可見時(shí)調(diào)用 */
    @Override
    protected void onResume() {
        super.onResume();
        Log.d(msg, "The onResume() event");
    }

    /** 當(dāng)其他活動(dòng)獲得焦點(diǎn)時(shí)調(diào)用 */
    @Override
    protected void onPause() {
        super.onPause();
        Log.d(msg, "The onPause() event");
    }

    /** 當(dāng)活動(dòng)不再可見時(shí)調(diào)用 */
    @Override
    protected void onStop() {
        super.onStop();
        Log.d(msg, "The onStop() event");
    }

    /** 當(dāng)活動(dòng)將被銷毀時(shí)調(diào)用 */
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(msg, "The onDestroy() event");
    }

}

點(diǎn)擊 Android 模擬器上的紅色按鈕
圖片

夹纫,它將在窗口中產(chǎn)生如下的事件消息:

07-19 15:01:10.995: D/Android :(866): The onPause() event
07-19 15:01:12.705: D/Android :(866): The onStop() event

點(diǎn)擊 Android 模擬器上的菜單按鈕
圖片

咽瓷,它將在 窗口中產(chǎn)生如下的事件消息

07-19 15:01:13.995: D/Android :(866): The onStart() event
07-19 15:01:14.705: D/Android :(866): The onResume() event

擊Android模擬器上的返回按鈕
圖片

,它將在窗口中產(chǎn)生如下的事件消息

07-19 15:33:15.687: D/Android :(992): The onPause() event
07-19 15:33:15.525: D/Android :(992): The onStop() event
07-19 15:33:15.525: D/Android :(992): The onDestroy() event
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舰讹,一起剝皮案震驚了整個(gè)濱河市茅姜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌月匣,老刑警劉巖钻洒,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锄开,居然都是意外死亡素标,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門萍悴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來头遭,“玉大人,你說我怎么就攤上這事癣诱〖莆” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵撕予,是天一觀的道長(zhǎng)鲫惶。 經(jīng)常有香客問我,道長(zhǎng)实抡,這世上最難降的妖魔是什么欠母? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮吆寨,結(jié)果婚禮上赏淌,老公的妹妹穿的比我還像新娘。我一直安慰自己啄清,他們只是感情好猜敢,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盒延,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鼠冕。 梳的紋絲不亂的頭發(fā)上添寺,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音懈费,去河邊找鬼计露。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的票罐。 我是一名探鬼主播叉趣,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼该押!你這毒婦竟也來了疗杉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蚕礼,失蹤者是張志新(化名)和其女友劉穎烟具,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奠蹬,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朝聋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了囤躁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀痕。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖狸演,靈堂內(nèi)的尸體忽然破棺而出言蛇,到底是詐尸還是另有隱情,我是刑警寧澤严沥,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布猜极,位于F島的核電站,受9級(jí)特大地震影響消玄,放射性物質(zhì)發(fā)生泄漏跟伏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一翩瓜、第九天 我趴在偏房一處隱蔽的房頂上張望受扳。 院中可真熱鬧,春花似錦兔跌、人聲如沸勘高。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽华望。三九已至,卻和暖如春仅乓,著一層夾襖步出監(jiān)牢的瞬間赖舟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工夸楣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宾抓,地道東北人子漩。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像石洗,于是被迫代替她去往敵國(guó)和親幢泼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容