Android旱期重大時間點html
系統構架分爲四層,從高到低分別是,(詳見下圖):java
該層提供一些核心應用程序包,例如電子郵件、短信、日曆、地圖、瀏覽器和聯繫人管理等。同時,開發者能夠利用Java語言設計和編寫屬於本身的應用程序,而這些程序與那些核心應用程序彼此平等、友好共處。android
該層是Android應用開發的基礎,開發人員大部分狀況是在和它打交道。應用程序框架層包括活動管理器、窗口管理器、內容提供者、視圖系統、包管理器、電話管理器、資源管理器、位置管理器、通知管理器和XMPP服務十個部分。在Android平臺上,開發人員能夠徹底訪問核心應用程序所使用的API框架。而且,任何一個應用程序均可以發佈自身的功能模塊,而其餘應用程序則可使用這些已發佈的功能模塊。基於這樣的重用機制,用戶就能夠方便地替換平臺自己的各類應用程序組件。sql
系統庫包括九個子系統,分別是圖層管理、媒體庫、SQLite、OpenGLEState、FreeType、WebKit、SGL、SSL和libc。Android運行時包括核心庫和Dalvik虛擬機,前者既兼容了大多數Java語言所須要調用的功能函數,又包括了Android的核心庫,好比android.os、android.net、android.media等等。後者是一種基於寄存器的java虛擬機,Dalvik虛擬機主要是完成對生命週期的管理、堆棧的管理、線程的管理、安全和異常的管理以及垃圾回收等重要功能。數據庫
Android核心系統服務依賴於Linux2.6內核,如安全性、內存管理、進程管理、網絡協議棧和驅動模型。Linux內核也是做爲硬件與軟件棧的抽象層。驅動:顯示驅動、攝像頭驅動、鍵盤驅動、WiFi驅動、Audio驅動、flash內存驅動、Binder(IPC)驅動、電源管理等。編程
API level | Android版本 | English Name | 中文名 | 發佈日期 |
---|---|---|---|---|
1 | 1 | 2008/9/23 | ||
2 | 1.1 | 2009/2/9 | ||
3 | 1.5 | Cupcake | 紙杯蛋糕 | 2009/4/27 |
4 | 1.6 | Donut | 甜甜圈 | 2009/9/19 |
5 - 7 | 2.0 - 2.1 | Eclair | 閃電泡芙 | 2009/10/26 |
8 | 2.2 | Froyo | 凍酸奶 | 2010/5/20 |
9 - 10 | 2.3 - 2.3.7 | Gingerbread | 薑餅 | 2010/12/6 |
11 - 13 | 3.0 - 3.2.6 | Honeycomb | 蜂巢 | 2011/2/22 |
14 - 15 | 4.0 - 4.0.4 | Ice Cream Sandwich | 冰激凌三明治 | 2011/10/18 |
16 - 18 | 4.1 - 4.3.1 | Jelly Bean | 糖豆 | 2012/7/9 |
19 - 20 | 4.4 - 4.4.4 | KitKat | 奇巧巧克力棒 | 2013/10/31 |
21 - 22 | 5.0 - 5.1.1 | Lollipop | 棒棒糖 | 2014/11/12 |
23 | 6.0 - 6.0.1 | Marshmallow | 棉花糖 | 2015/10/5 |
24 - 25 | 7.0 - 7.1.2 | Nougat | 牛軋糖 | 2016/8/22 |
26 - 27 | 8.0 - 8.1 | Oreo | 奧利奧 | 2017/8/21 |
28 | 9 | Pie | 派 | |
在安卓系統中,有很多內部工程師放進去的彩蛋。設置->關於手機->連續點擊"Android版本"數組
對於世界各地的移動應用開發人員來講,首選的、也是最受歡迎的編程語言莫過於Java。它是Android應用開發的官方語言,Google不但能徹底支持它,並且Play Store中的大多數應用也都是用它來構建的。android-studio
和Java同樣,Kotlin也運行在Java虛擬機之上。它與Java具備徹底的互操做性,不會由於文件大小的增長,而形成障礙。瀏覽器
Android Studio經過使用Android原生開發工具(Native Development)來支持C/C++。您沒必要編寫在Java虛擬機上運行的代碼,而可以將代碼在設備上本地原生地運行,而且能夠控制內存之類的部件。對於一些3D要求高的遊戲應用,您可使用C或C++編寫的庫,來獲取Android設備上的特有性能。緩存
C#是純粹面向對象的C和C++版本。微軟保留了C++的強大功能和Visual BASIC的簡約性,它有點相似於Java的簡化版。和Java相同,C#也具備垃圾回收功能,所以您不須要擔憂內存泄漏、或考慮自行釋放內存等問題。同時相對於Java來講,C#的語法更爲清晰。
Unity是一款「遊戲引擎」,它提供諸如物理計算、3D圖形渲染、以及相似Android Studio的IDE。它是一個開源的工具,您能很容易地建立出本身的遊戲,並能得到其強大社區的支持。只需幾行代碼,您就能夠在一小時以內搭建出一個基本的遊戲平臺。做爲Google Play Store裏大多數遊戲工做室所使用的工具,它是跨平臺的。因爲一直使用的是對象,其開發模式還能提供學習面向對象編程的實戰方法。
由Apache Cordova帶來的PhoneGap,容許您使用HTML、CSS和t這些經常使用於建立網站的編程語言。PhoneGap就像橋樑同樣,容許開發者訪問手機或平板電腦上的一些原生功能,如計算器或相機等。
PhoneGap實際上不是真正的「Android」開發,而只是用到了t進行編程。所以它所完成的只是一些基本的任務,而若是您想成爲真正的Android應用開發者的話,仍是請從前面的列表中選擇語言吧。
Eclipse 是一個開放源代碼的、基於Java的可擴展開發平臺。就其自己而言,它只是一個框架和一組服務,用於經過插件組件構建開發環境。幸運的是,Eclipse 附帶了一個標準的插件集,包括Java開發工具(Java Development Kit,JDK)。咱們能夠經過在Eclipse中添加ADT(Android Development Tools)安卓開發工具,來搭建安卓開發環境。
搭建步驟:
1.安裝JDK
2.配置Windows上JDK的變量環境
4.下載安裝Android SDK 5.爲Eclipse安裝ADT插件 [Eclipse + ADT插件開發環境搭建教程](https://www.cnblogs.com/xiongwei/p/8042698.html)
Android Studio 是谷歌推出的一個Android集成開發工具,基於IntelliJ IDEA. 相似 Eclipse ADT,Android Studio 提供了集成的 Android 開發工具用於開發和調試。
在IDEA的基礎上,Android Studio 提供 :
搭建步驟: 1. 下載 Android studio:經過上述連接,按照操做系統選擇下載版本。 2. 運行android-studio\bin\studio.exe(64位系統運行studio64.exe) 3. 首次啓動時,會有以下彈窗,如圖選擇不導入配置信息。
AIDE是一個集成開發環境(IDE),可直接在Android設備上進行Android應用開發。AIDE支持完整的編程操做:其代碼編輯器功能豐富,如 一鍵 修補代碼,實時錯誤檢查,重構,智能搜索/跳轉代碼和運行編譯好的應用程序。
AIDE將成爲一個真正的支持Android平板電腦鍵盤的開發工具。AIDE使用Ice Cream Sandwich(ICS)的Code Helper來檢查代碼。AIDE將Android手機變成了一個小型開發計算機,隨時隨地瀏覽和編輯代碼。
AIDE徹底兼容Eclipse項目。只要將源碼複製到Android設備,用AIDE打開源碼目錄,加載項目,就能夠開始編程。
新建項目
+ 項目名稱、包名、支持最小版本號、開發語言。
Hello World項目文件以下,文件分爲3類:
MainActivity.java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
Activity窗體都是繼承Activity類,默認狀況下Activity是獨佔整個屏幕的,Activity中能夠有任意數量可視化組件(下文統稱控件),控件由View及其子類組成,控件按xml佈局文件控制外觀表現。
activity_main.xml(佈局文件)
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Android Manifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.hellowworld"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
<Button android:id="@+id/my_button" ...... android:text="@string/app_name" />
Button myButton = findViewById(R.id.my_button);
myButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(MainActivity.this,"Button點擊",Toast.LENGTH_SHORT).show(); Log.i("onclick","點擊"); } });
線性佈局在開發中使用最多,具備垂直方向與水平方向的佈局方式,經過設置屬性「android:orientation」控制方向,屬性值垂直(vertical)和水平(horizontal),默認水平方向。
相對佈局可讓子控件相對於兄弟控件或父控件進行佈局,能夠設置子控件相對於兄弟控件或父控件進行上下左右對齊。
RelativeLayout能替換一些嵌套視圖,當咱們用LinearLayout來實現一個簡單的佈局但又使用了過多的嵌套時,就能夠考慮使用RelativeLayout從新佈局。
相對佈局就是必定要加Id才能管理。
幀佈局或叫層佈局,從屏幕左上角按照層次堆疊方式佈局,後面的控件覆蓋前面的控件。
該佈局在開發中設計地圖常常用到,由於是按層次方式佈局,咱們須要實現層面顯示的樣式時就能夠
採用這種佈局方式,好比咱們要實現一個相似百度地圖的佈局,咱們移動的標誌是在一個圖層的上面。
在普通功能的軟件設計中用得也很少。層佈局主要應用就是地圖方面。
絕對佈局中將全部的子元素經過設置android:layout_x 和 android:layout_y屬性,將子元素的座標位置固定下來。由於Android終端通常機型比較多,各自的屏幕大小。分辨率等可能都不同,若是用絕對佈局,可能致使在有的終端上顯示不全等。
表格佈局,適用於多行多列的佈局格式,每一個TableLayout是由多個TableRow組成,一個TableRow就表示TableLayout中的每一行,這一行能夠由多個子元素組成。
android 4.0 後新增的一個佈局,與前面介紹過的TableLayout(表格佈局)其實有點大同小異,容器中的組件能夠跨多行也能夠跨多列。
如今取代RelativeLayout成了建立空Activity的默認佈局,很是很是強大,操做很是簡潔。
onCreate() 這是第一個回調,在活動第一次建立時調用 onStart() 這個回調在活動爲用戶可見時被調用 onResume() 這個回調在應用程序與用戶開始可交互的時候調用 onPause() 被暫停的活動沒法接受用戶輸入,不能執行任何代碼。噹噹前活動將要被暫停,上一個活動將要被恢復是調用 onStop() 當活動不在可見時調用 onDestroy() 當活動被系統銷燬以前調用 onRestart() 當活動被中止之後從新打開時調用
MainActivity.java
public class MainActivity extends AppCompatActivity { private static final String TAG = "LifeCycleActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG, "onCreate called."); } //Activity建立或者從後臺從新回到前臺時被調用 @Override protected void onStart() { super.onStart(); Log.i(TAG, "onStart called."); } //Activity從後臺從新回到前臺時被調用 @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "onRestart called."); } //Activity建立或者從被覆蓋、後臺從新回到前臺時被調用 @Override protected void onResume() { super.onResume(); Log.i(TAG, "onResume called."); } //Activity被覆蓋到下面或者鎖屏時被調用 @Override protected void onPause() { super.onPause(); Log.i(TAG, "onPause called."); //有可能在執行完onPause或onStop後,系統資源緊張將Activity殺死,因此有必要在此保存持久數據 } //退出當前Activity或者跳轉到新Activity時被調用 @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop called."); } //退出當前Activity時被調用,調用以後Activity就結束了 @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestory called."); } }
Service(服務)是一個一種能夠在後臺執行長時間運行操做而沒有用戶界面的應用組件。服務可由其餘應用組件啓動(如Activity),服務一旦被啓動將在後臺一直運行,即便啓動服務的組件(Activity)已銷燬也不受影響。 此外,組件能夠綁定到服務,以與之進行交互,甚至是執行進程間通訊 (IPC)。 例如,服務能夠處理網絡事務、播放音樂,執行文件 I/O 或與內容提供程序交互,而全部這一切都可在後臺進行。Service基本上分爲兩種形式:
當應用組件(如 Activity)經過調用 startService() 啓動服務時,服務即處於「啓動」狀態。一旦啓動,服務便可在後臺無限期運行,即便啓動服務的組件已被銷燬也不受影響,除非手動調用才能中止服務, 已啓動的服務一般是執行單一操做,並且不會將結果返回給調用方。
當應用組件經過調用 bindService() 綁定到服務時,服務即處於「綁定」狀態。綁定服務提供了一個客戶端-服務器接口,容許組件與服務進行交互、發送請求、獲取結果,甚至是利用進程間通訊 (IPC) 跨進程執行這些操做。 僅當與另外一個應用組件綁定時,綁定服務纔會運行。 多個組件能夠同時綁定到該服務,但所有取消綁定後,該服務即會被銷燬。
在Android中,廣播是一種普遍運用的在應用程序之間傳輸信息的機制。而廣播接收器是對發送出來的廣播進行過濾接受並響應的一類組件。可使用廣播接收器來讓應用對一個外部時間作出響應。例如,當電話呼入這個外部事件到來時,能夠利用廣播接收器進行處理。當下載一個程序成功完成時,仍然能夠利用廣播接收器進行處理。廣播接收器不NotificationManager來通知用戶這些事情發生了。廣播接收器既能夠在AndroidManifest.xml中註冊,也能夠在運行時的代碼中使用Context.registerReceive()進行註冊。只要是註冊了,當事件來臨時,即便程序沒有啓動,系統也在須要的時候啓動程序。各類應用還能夠經過使用Context.sendBroadcast()將它們本身的Intent廣播給其餘應用程序。
public class MyRecever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String msg=intent.getAction()+"\n"; Log.i("s", msg); Toast.makeText(context, msg, Toast.LENGTH_LONG).show(); } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xyk.brocastereg" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:targetSdkVersion="24" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".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> <receiver android:name=".MyRecever"> <intent-filter> <action android:name="android.intent.action.TIME_TICK" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> </intent-filter> </receiver> </application> </manifest>
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new MyRecever(); } }
內容提供者組件經過請求從一個應用程序向其餘的應用程序提供數據。這些請求由類 ContentResolver 的方法來處理。內容提供者可使用不一樣的方式來存儲數據。數據能夠被存放在數據庫,文件,甚至是網絡。有時候須要在應用程序之間共享數據。這時內容提供者變得很是有用。
資源文件一般保存在res文件目錄下,res目錄下資源詳解以下:
在java文件中引用資源
my_app.setText(R.string.app_name);
setContentView(R.layout.activity_main);
在xml文件中引用資源
android:text="@string/app_name"
SharedPreferences是Android平臺上一個輕量級的存儲輔助類,用來保存應用的一些經常使用配置,它提供了string,set,int,long,float,boolean六種數據類型。最終數據是以xml形式進行存儲。在應用中一般作一些簡單數據的持久化緩存。
實現SharedPreferences存儲的步驟以下:
Android提供了建立和是用SQLite數據庫的API。SQLiteDatabase表明一個數據庫對象,提供了操做數據庫的一些方法。在Android的SDK目錄下有sqlite3工具,咱們能夠利用它建立數據庫、建立表和執行一些SQL語句。下面是SQLiteDatabase的經常使用方法。
Context提供了兩個方法來打開數據文件裏的文件IO流 FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),這兩個方法第一個參數 用於指定文件名,第二個參數指定打開文件的模式。該方式存儲數據爲私有,其它應用沒法訪問,當應用卸載時,數據一併被刪除。
訪問外部存儲文件,須要申請讀/寫外部存儲權限經過IO訪問文件.
咱們在安裝Android軟件的時候,系統會提示該軟件所須要的權限,相對於其餘系統,android的權限很是多。咱們在開發軟件的時候,也須要聲明相應的權限,好比但願軟件能發短信,須要聲明軟件調用短信的權限,不然軟件運行的時候就會報錯。 Android的權限在AndroidManifest.xml文件裏配置。AndroidManifest文件中有四個標籤與permission有關,它們分別是 <permission>、 <permission-group> 、<permission-tree> 和 <uses-permission>。其中最經常使用的是 <uses-permission>,當咱們須要獲取某個權限的時候就必須在咱們的manifest文件中聲明<uses-permission>。
<uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.SEND_SMS"/>
權限組 | 權限列表 |
---|---|
android.permission-group.CALENDAR | android.permission.READ_CALENDAR |
(容許程序讀取用戶的日程信息) | |
android.permission-group.CAMERA | android.permission.CAMERA |
(容許訪問攝像頭進行拍照) | |
android.permission-group.CONTACTS | android.permission.READ_CONTACTS |
(容許應用訪問聯繫人通信錄信息) | |
android.permission.WRITE_CONTACTS | |
(寫入聯繫人,但不可讀取) | |
android.permission.GET_ACCOUNTS | |
(訪問GMail帳戶列表) | |
android.permission-group.LOCATION | android.permission.ACCESS_COARSE_LOCATION |
(經過WiFi或移動基站的方式獲取用戶錯略的經緯度信息,定位精度大概偏差在30~1500米) | |
android.permission.ACCESS_FINE_LOCATION | |
(經過GPS芯片接收衛星的定位信息,定位精度達10米之內) | |
android.permission-group.MICROPHONE | android.permission.RECORD_AUDIO |
(錄製聲音經過手機或耳機的麥克) | |
android.permission-group.PHONE | android.permission.READ_PHONE_STATE |
(訪問電話狀態) | |
android.permission.CALL_PHONE | |
(容許程序從非系統撥號器裏輸入電話號碼) | |
android.permission.READ_CALL_LOG | |
(容許應用程序讀取用戶的通話記錄) | |
android.permission.WRITE_CALL_LOG | |
(容許一個程序寫入(但不讀取)用戶的通話記錄資料) | |
com.android.voicemail.permission.ADD_VOICEMAIL | |
(容許應用程序添加語音郵件進入系統) | |
android.permission.USE_SIP | |
(容許程序使用SIP視頻服務) | |
android.permission.PROCESS_OUTGOING_CALLS | |
(容許程序監視,修改或放棄播出電話) | |
android.permission-group.SENSORS | android.permission.BODY_SENSORS |
(容許從傳感器,用戶使用來衡量什麼是他/她的身體內發生的事情,如心臟速率訪問數據的應用程序) | |
android.permission-group.SMS | android.permission.SEND_SMS |
(發送短信) | |
android.permission.RECEIVE_SMS | |
(接收短信) | |
android.permission.READ_SMS | |
(讀取短信內容) | |
android.permission.RECEIVE_WAP_PUSH | |
(接收WAP PUSH信息) | |
android.permission.RECEIVE_MMS | |
(接收彩信) | |
android.permission.READ_CELL_BROADCASTS | |
() | |
android.permission-group.STORAGE | android.permission.READ_EXTERNAL_STORAGE |
(容許程序讀取外部存儲,如SD卡讀文件) | |
android.permission.WRITE_EXTERNAL_STORAGE | |
(容許程序寫入外部存儲,如SD卡上寫文件) |