文 | 莫若吻
注:
1.本文內(nèi)容參考 李剛的《瘋狂Android講義》一書痒蓬。
2.此書適合有一定Java基礎(chǔ)、初學(xué)Android的同學(xué)閱讀與學(xué)習(xí)班挖。我最近想鞏固下Android基礎(chǔ)知識就來拜讀一下此書萧芙。
3.本文筆記側(cè)重于知識梳理,不側(cè)重于講解动羽,如果有同學(xué)遇到不懂的知識點(diǎn)可以給我留言或者買書自行學(xué)習(xí)运吓。
4.如果你最近想?yún)⒓用嬖嚲猩冢梢詤⒖即宋膹?fù)習(xí)哦倦青!
一.第一章 Android應(yīng)用
1.Android平臺架構(gòu)及特性
Android系統(tǒng)的底層建立在Linux系統(tǒng)之上产镐,Android平臺由操作系統(tǒng)癣亚、中間件逃糟、用戶界面和應(yīng)用軟件四層組成绰咽,采用一種被稱為軟件疊層(Software Stack)的方式進(jìn)行構(gòu)建取募。
這種軟件疊層結(jié)構(gòu)使層與層之間相互分離蟆技,明確各層的分工质礼。這種分工保證了層與層之間的低耦合眶蕉。當(dāng)下層的層內(nèi)或?qū)酉掳l(fā)生改變時,上層應(yīng)用程序無須任何改變碱璃。
2.Android系統(tǒng)組成
Android系統(tǒng)主要由應(yīng)用程序?qū)忧镀鳌?yīng)用程序框架、函數(shù)庫蚓让、Android運(yùn)行時及Linux內(nèi)核等5部分組成凭疮。
1)開發(fā)Android應(yīng)用程序(即Android APP)是面向底層的應(yīng)用程序框架進(jìn)行的执解。
2)Android運(yùn)行時由Android核心庫集和Dalvik虛擬機(jī)2部分組成衰腌。每一個Android應(yīng)用程序都運(yùn)行在一個單獨(dú)的Dalvik虛擬機(jī)內(nèi)右蕊。
3)Dalvik虛擬機(jī)依賴于Linux內(nèi)核提供的核心功能饶囚。
4)Linux內(nèi)核提供了安全性萝风、內(nèi)存管理紫岩、進(jìn)程管理泉蝌、網(wǎng)路協(xié)議棧和驅(qū)動模型等核心系統(tǒng)服務(wù)勋陪。
3.Dalvik虛擬機(jī)與JVM的區(qū)別
- Dalvik虛擬機(jī)并不遵守JVM(Java Virtual Machine)的規(guī)范,兩者并不兼容缘挽。
- JVM運(yùn)行的是Java字節(jié)碼(一般是.class文件)壕曼;
Dalvik運(yùn)行的是專有的dex文件(Dalvik Executable)等浊。 - JVM直接從.class文件或JAR包中加載字節(jié)碼后運(yùn)行筹燕;
Dalvik則需要通過DX工具將應(yīng)用程序的所有. class文件譯成.dex文件撒踪,Dalvik則運(yùn)行.dex文件。 - Dalvik虛擬機(jī)非常適合在移動端上使用掸绞;相對于PC或服務(wù)器上運(yùn)行的虛擬機(jī)衔掸,Dalvik不需要很快的CPU計算速度和大量的內(nèi)存空間俺抽。
- JVM都是基于棧的磷斧,而Dalvik則是基于寄存器的弛饭。
4.Dalvik虛擬機(jī)的特點(diǎn)
-
運(yùn)行專有的.dex文件。
專有的.dex文件減少了.class文件中的冗余信息栓霜,而且會將所有的.class文件整合到一個文件中胳蛮,從而提高運(yùn)行性能仅炊,而且DX工具還會對.dex文件進(jìn)行一些性能優(yōu)化。 -
基于寄存器實(shí)現(xiàn)抚垄。
大部分虛擬機(jī)包括JVM都是基于棧的桐经,而Dalvik則是基于寄存器的阴挣。一般基于寄存器的虛擬機(jī)具有更好的表現(xiàn)纺腊,但在硬件通用性上略差。
5.AndroidManifest.xml清單文件
包括信息:
- 應(yīng)用程序的包名誓沸,該包名將作為應(yīng)用的唯一標(biāo)識拜隧。
- 應(yīng)用程序所包含的組件虹蓄,eg:Activity薇组、Service律胀、BroadcastReceiver貌矿、ContentProvider等逛漫。
- 應(yīng)用程序兼容的最低版本酌毡。
- 應(yīng)用程序使用系統(tǒng)所需的權(quán)限聲明。
- 其他程序訪問該程序所需的權(quán)限聲明菩暗。
eg:
<?xml version="1.0" encoding="utf-8"?>
<!--指定Android應(yīng)用包名:package -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.promise.sun">
<!--應(yīng)用權(quán)限聲明 -->
<uses-permission android:name="android.permission.VIBRATE" />
<!--指定Android應(yīng)用的標(biāo)簽和圖標(biāo):label停团、icon -->
<application
android:name=".SunApplication"
android:allowBackup="false"
android:hardwareAccelerated="true"
android:icon="@drawable/ic_launcher"
android:label="${APP_NAME}"
android:theme="@style/AppTheme"
android:largeHeap="true"
tools:replace="android:allowBackup,android:label,android:theme">
<!--定義Android的一個組件:activity -->
<activity
android:name=".app.activity.WelcomeActivity"
android:screenOrientation="portrait"
android:theme="@style/StartAppTheme">
<intent-filter>
<!--指定此activity為應(yīng)用程序入口 -->
<action android:name="android.intent.action.MAIN" />
<!--加載該應(yīng)用程序時運(yùn)行此activity -->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--定義Android的一個組件:service -->
<service android:name=".app.ApkUpdateService" />
</application>
</manifest>
6.Android組件簡介
1)Activity和View
Activity是Android的四大組件之一佑稠。
Activity是Android中負(fù)責(zé)與用戶交互的組件讶坯,只能通過setContentView(view);來顯示指定組件。
View組件是所有UI控件、容器控件的基類婉烟,但view組件需要放到容器組件中或者使用Activity將其顯示出來似袁。
Note:ViewGroup是View的子類咐刨。
2)Service
Service是Android的四大組件之一而涉。擁有獨(dú)立的生命周期联予。
Service作用:一般用于為其他組件提供后臺服務(wù)和監(jiān)控其他組件的運(yùn)行狀態(tài)沸久。
Service與Avtivity的區(qū)別在于:Service通常位于后臺運(yùn)行卷胯,一般不需與用戶交互,因此Service沒有圖形用戶界面挺峡。
3)BroadcastReceiver
BroadcastReceiver是Android的四大組件之一沙郭。廣播消息接收器吓著,對Android應(yīng)用中其他組件進(jìn)行監(jiān)聽送挑。
注冊系統(tǒng)級的監(jiān)聽事件有兩種方式:
- 在Java 代碼中通過Context.registReceiver();完成注冊廣播惕耕。
- 在清單文件中使用<receiver …… />完成注冊。
4)ContentProvider
ContentProvider是Android的四大組件之一欺缘。
ContentProvider為Android應(yīng)用之間實(shí)現(xiàn)實(shí)時數(shù)據(jù)交換。
Note:一般與ContentProvider結(jié)合使用的是ContentResolver,一個應(yīng)用程序使用ContentProvider暴露自己的數(shù)據(jù)蛤铜,而另一個應(yīng)用程序則通過ContentResolver來訪問數(shù)據(jù)嫩絮。
5)Intent和IntentFilter
嚴(yán)格講 Intent并不是Android應(yīng)用組件。它是Android應(yīng)用內(nèi)不同組件之間通信的載體围肥。
Note:Activity剿干、Service、BroadcastReceiver三種組件之間的通信都以Intent作為載體穆刻,只使用時略有區(qū)別置尔。
- 啟動一個Activity,使用Context的startActivity(intent);方法蛹批。
- 啟動一個Service撰洗,使用 startService(intent); 或者 bindService(intent,serviceConnection,intFlags);方法。
- 觸發(fā)一個BroadcastReceiver腐芍,使用sendBroadcast(intent); 或者sendStickyBroadcast(intent) 或者;sendOrderedBroadcast(intent,receiverPermission);方法發(fā)送廣播差导。
顯示Intent和隱式Intent:
顯示Intent:明確指定需要啟動或者觸發(fā)的組件的類名。
隱式Intent:只是指定需要啟動或者觸發(fā)的組件應(yīng)該滿足的條件。
Note:隱式Intent需要通過IntentFilter實(shí)現(xiàn),被調(diào)用組件使用IntentFilter來聲明自身所滿足的條件外冀。
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請必須注明出處并私信告知與我藕畔,謝謝溶弟!