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.java的Java文件中
這是實(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