1.1 系統概述html
英文全稱3rd-generation。第三代移動通訊技術。是指將無線通訊與國際互聯網等多媒體通訊結合的新一代移動通訊系統。android
* 3G制式:web
(歐洲版) WCDMA\HSDPA 中國聯通採用sql
(北美版) CDMA 2000\EV-DO 中國電信採用shell
(中國版)TD-SCDMA\TD-HSDPA:中國移動採用數據庫
* 3G的發展:小程序
1G:僅僅能進行語音通話、模擬信號windows
2G:包含(GSM\GPRS\EDGE)添加了接收數據的功能,如接收電子郵件或網頁
3G:02年國外已經產生。03年開發出中國的3G,09才上市。
在傳輸聲音和數據的速度上有很是大提高
4G.:是第四代移動通訊及其技術的簡稱,是集快速無線網絡與有線網絡WLAN於一體的通信網絡能夠傳輸高質量視頻、圖像和數據,傳輸速率可高達200MPS以上,眼下主流技術有 FDD-LTE、TDD-LTE、WIMAX
* 移動通訊上網速度變化
GSM(9K)-->GPRS(42K)-->EDGE(147K)-->WCDMA(2M)-->HSDPA(7.2M)-->FDD-LTE長期演進(200M)
IT界三大熱點:雲計算、物聯網、移動互聯網
& 雲計算
雲計算是一種經過Internet以服務的方式提供動態可伸縮的虛擬化的資源的計算模式 ,這樣的模式提供可用的、便捷的、按需的網絡訪問, 進入可配置的計算資源共享池(資源包含網絡。server。存儲,應用軟件。服務),這些資源能夠被高速提供,僅僅需投入很是少的管理工做。或與服務供應商進行很是少的交互。
& 物聯網
物聯網就是物物相連的互聯網。
Internet of Things(IOT),也稱爲Web of Things
物聯網的定義是經過射頻識別(RFID)、紅外感應器、全球定位系統、激光掃描器等信息傳感設備,按約定的協議。把不論什麼物品與互聯網相鏈接。進行信息交換和通訊。以實現對物品的智能化識別、定位、跟蹤、監控和管理的一種網絡
& 移動互聯網
移動互聯網就是將移動通訊和互聯網兩者結合起來,成爲一體。也是發展最快、市場潛力最大、前景最誘人的業務,比方:移動社交、移動廣告、手機遊戲、手機電視、移動商務、移動支付、位置服務、移動電子閱讀等
* 移動智能操做系統
眼下的智能操做系統有Android 4.4、IOS7、Windows Phone 8、Symbian、RIM BlackBerry、J2ME等。市場佔有率高的有Android平臺、IOS平臺和Windows Phone平臺,造成三足鼎立的局面
1.1.2 Android歷史與發展
* Android發展大事件
2005年Google收購 Android Inc. 開始研究Dalvik VM 虛擬機
2007年 開發手機聯盟成立。SDK1.0預覽版公佈
2008年末 第一款Android手機G1誕生 ,Android 經過Apache License開源
* Android版本號進化歷程
1.X 版本號:入門級別。僅僅適用於手機
2.X 版本號: 趨於成熟的版本號。僅僅適用於手機
3.X 版本號:趨於成熟的版本號,僅僅適用於平板
4.X 版本號:趨於成熟的版本號,對平板和手機進行了整合
5.X 版本號: 支持64位cpu、默認採用ART執行模式等
Android 1.5 Cupcake(紙杯蛋糕、API Level 3)
Android 1.6 Donut(甜甜圈API Level 4)
Android 2.0/2.0.1/2.1 Eclair(鬆餅API Level 5、6、7)
Android 2.2/2.2.1 Froyo(凍酸奶API Level 8、9)
Android 2.3 Gingerbread(薑餅API Level 10)
Android 3.0/3.1/3.2 Honeycomb(蜂巢 API Level 11、12、13)
Android 4.0/4.0.3 Ice Cream Sandwich(冰激凌三明治API Level 14、15)
Android 4.1/4.2/4.3 Jelly Bean(果凍豆 API Level 16、17、18)
Android 4.4 KitKat (奇巧巧克力API Level 19)
Android 5.0 代號L (API Level 20)
手機、平板、智能電視(機頂盒)、穿戴設備(眼鏡、手錶)、其餘智能嵌入設備
1. Linux內核層
Android是基於Linux內核的操做系統,在Linux內核層,主要實現安全管理、進程管理、內存管理、電源管理、硬件驅動管理
2. 硬件抽象層
硬件抽象層是對Linux 硬件驅動程序的封裝,向上提供接口,屏蔽低層的實現細節。硬件抽象層不開源,可保護硬件廠商的商業祕密。但是會影響系統的性能。
Android對硬件的支持分紅了兩層,一層放在用戶空間(User Space)。一層放在內核空間(Kernel Space),硬件抽象層執行在 用戶空間, Linux 內核驅動程序執行在內核空間,內核驅動層僅僅提供簡單的訪問 硬件邏輯,詳細的實現細節,都放在硬件抽象層中 ,從而維護了硬件廠商的商業利益。
3. 原生庫與Android執行時
Android的原生庫主要基於C\C++實現的一些原生組件。包含C庫Bionic、瀏覽器引擎Webkit、多媒體引擎OpenCORE、SQL數據庫SQLite、3D渲染引擎OpenGL ES、位圖和字體矢量渲染引擎FreeType、2D圖像渲染引擎SGL(Skia Graphics Library)、互聯網安全協議SSL等。
Android執行時主要包含Java核心庫、Dalvik虛擬機,二者一塊兒構成了Android的應用環境基礎
4. 應用框架層
應用框架層是Google公佈的核心應用所使用的API框架。開發者可以使用這些框架提供的API來高速開發本身的應用程序,它自己也是用Java語言實現和開發的。
Activity Manager(活動管理)、Window Manager(窗體管理)、View Manager(視圖管理)、Notification Manager(通知管理)、Content Provider(內容提供者)、Package Manager(包管理)、Resource Manager(資源管理)、Location Manager(位置管理)
5. 應用層
應用層是基於Android平臺開發的應用,採用Java做爲開發語言。包含系統自帶的應用(短信管理、聯繫人管理、圖庫瀏覽、網頁瀏覽等)和第三方開發的應用
* 共同點:
解釋運行 byte code字節碼文件
在操做系統的進程執行一個VM,並執行一個單獨的程序
* 不一樣點:
程序結構不一樣:JVM字節碼由多個.class文件組成,Davlik 僅僅包括一個 .dex 格式的文件,這個文件包括了程序中所有的類。
架構不一樣:Dalvik是 register-based基於寄存器。Sun JDK 是 stack-based基於棧。
* Dalvik優點
編譯時提早優化代碼而不是等到執行時 。
虛擬機很是小,佔空間小。
可以知足可高效執行多種虛擬機實例。
常量池改動爲僅僅使用32位的索引。以簡化解釋器。
* DVM運行過程
1. 編譯爲class文件
2. 使用dx工具抽取class文件共性造成.dex
3. 維護內部常量池
* ART執行模式
ART模式是Android runtime的簡稱。在Android4.4版本號後出現,經過在安裝應用程序時,本身主動對程序進行代碼預讀取編譯,讓程序直接編譯成機器語言,並且把它保存起來,免去了Dalvik模式要時時轉換代碼,實現高效率、省電、手機執行流暢。ART是虛擬機。僅僅是在安裝app時,提早編譯而已。
* 開發工具
JDK、Eclipse、ADT(Android developer tools)插件、Android SDK
* 工具下載
ADT下載地址:http://dl.google.com/android/ADT-22.0.0.zip
SDK下載地址:http://dl.google.com/android/android-sdk_r22-windows.zip
合集版下載地址: developer.android.com
合集版工具包包括:
Eclipse + ADT plugin
Android SDK Tools
Android Platform-tools
The latest Android platform
The latest Android system image for the emulator
* Android-SDK更新
經過Android Manager.exe 工具更新
Android SDK文件夾介紹
* 建立模擬器
* 小細節
& AVD配置文件位置(默認):
C:\Documents andSettings\Administrator\.android\avd\AVD2.3.3.avd\config.ini
& AVD 縮放 :啓動模擬器—>在launch Option中選擇 Scale display to real size
& 模擬器不能保存數據:在模擬器的配置文件裏刪除.lock文件
* 手機屏幕參數:屏幕尺寸、分辨率、屏幕密度
&手機尺寸:5.5 、5.0、4.7、4.3、4.0、3.5英寸
&分辨率: 1080*1920 、640*1136、720*1280、1280*800、1024*600、480*854、480*800
&屏幕密度:120dpi(ldpi) 低清、160dpi(mdip)中清(標清) 、240dpi(hdpi)、360dpi(xhdpi)
* 手機內存、SDCard、CPU、攝像頭
* 手機操做系統版本號
* 網絡制式(GSM\EDGE\WCDMA\HSDPA\TD-SCDMA\WCAMA-2000\TDD-LTE\FDD-LTE)
* 建立新項目
* 配置項目
* 配置執行圖標屬性
* Android應用結構介紹
Android 應用程序由應用組件(Activity、Service、ContentProvider、BroadcastReceiver)構成,每一個組件是單獨的模塊,有着不一樣的入點,系統可以從這些入點進入到你的應用中,組件在AndroidManifest.xml註冊。它們之間鬆耦合地組織在一塊兒,從而定義你應用的整體功能。
*項目文件夾結構分析
運用adb工具把apk包上傳到模擬器(真機)中,文件夾在data\app\
讀取androidManifest.xml清單文件(包名、權限、圖標等)
建立文件夾。在data\data\文件夾下建立以包名爲文件夾的文件夾
寫入註冊表, 註冊表文件data\system\packages.xml
Android系統是一個多用戶的Linux系統,應用一旦安裝。系統爲每個應用分配一個獨立的Linux用戶ID,當用戶點擊應用程序圖標或者導航到該應用的組件時。Android框架會建立一個虛擬機實例,開啓一個進程,建立一個主線程(UI線程)。再實例化入口組件。進入組件的生命週期
adb shell :進入linuxclientshell命令模式
adb install apk文件 :安裝apk文件
adb uninstall 包名 :刪除模擬器應用
adb devices :列出所有設備
adb push <local> <remote> 把本地的文件拷貝到遠端
adb pull <remote> <local> 從遠端拷貝文件到本地
mksdcard 大小 <local> 建立sdcard鏡像文件
android create avd –name <模擬器名> -target <level> 建立模擬器
emulator –avd avd名 啓動模擬器
adb –s <設備名> <命令> 對於有多個設備終端
1.3.5 案例: 應用體驗之電話撥號器
實現一個打電話的小程序
* 界面設計
* 代碼實現
* 在AndroidManifest.xml中加入打電話權限
<uses-permission android:name="android.permission.CALL_PHONE"/>
DDMS(Dalvik Debug Monitor Service) DVM調試監視服務
& Devices : 查看模擬器設備的狀態,模擬器執行的進程
& File Explorer: 文件瀏覽器(導入、導出文件、建立目錄、刪除文件等)
& LogCat: 日誌查看工具,日誌貓
& Emulator Control: 模擬器控制,模擬一些操做(打電話、發短信)
官網:developer.android.com或本地(%ANDROID_SDK_HOME%\DOC\)
中文參考文檔:wiki.eoe.cn
源代碼:(%ANDROID_SDK_HOME%\source),或經過SDK Manager.exe 從官網下
& 在Eclipse中選中任一系統API,按F3或者CTRL+單擊 ,以後找到Java Source Addachment 。指定源代碼位置就能夠
& 選擇項目中的android.jar包,右鍵點擊屬性。以後找到Java Source Addachment ,指定源代碼位置就能夠
2.1 Activity、View、Window關係
* android.app.Activity
Activity是Android四大組件之中的一個,它經過內部的成員變量Window對象來展
示一個與用戶交互的界面,界面中的View控件捕獲事件。經過WindowManagerService傳遞消息。Android框架再回調Activity中與捕獲事件相關聯的方法。從而實現與用戶的交互。Activity扮演的是一個控制器的角色
* android.view.View
& View:視圖,是用戶接口組件的基本構建塊,它在屏幕中佔用一個矩形區域,它是所有UI控件的基類,如一個button或文本框。
View負責圖形界面渲染及事件處理
& Android已經爲咱們提供了一系列的標準UI控件供咱們直接使用,同一時候,咱們也可以經過繼承於View或View的子類,來實現咱們本身定義的UI控件
& View及其子類的關係
& 對View常用的操做
Set properties 設置屬性
Set focus 設置焦點
Set listeners 設置監聽
Set visibility 設置是否可見
* Window
Window是Android中的窗體。表示頂級窗體,也就是主窗體,每一個主窗體都擁有一個View。稱之爲DecorView(裝飾視圖),它是主窗體的頂級View(DecorView必須是一個佈局容器,因爲它要容納其餘的View)。當Activtity調用setContentView()時。實際就是調用Window對象的setContentView()方法,運行該方法。把用戶定義的View加入到DecorView中,終於完畢對View的展現。
Android平臺提供了一套完備的、功能強大的組件化模型用於搭建用戶界面,這套組件化模型以View和 ViewGroup這兩個基礎佈局類爲基礎。平臺自己已預先實現了多種用於構建界面的View子類和ViewGroup子類。他們被分別稱爲部件(widget)和佈局(layout)。
部件(widget)包含Button、TextView、EditText、ListView、CheckBox、RadioButton、Gallery、Spinner等
2.3 佈局
ViewGroup是一個特殊的View,能夠容納其餘的View(子控件)。它是佈局和視圖容器的基類
* ViewGroup.LayoutParams 佈局參數類屬性:
android:layout_width 相對於父控件的寬度 (wrap_content, match_parent,fill_parent)
android:layout_height 相對於父控件高度 (wrap_content,match_parent,fill_parent)
* ViewGroup常用的方法
addView(): 向視圖組加入View
removeView():從視圖組移去View
getChildCount:得到視圖組子控件的數量
getChildAt() : 得到詳細某個子控件
* Android的顯示單位
& px (pixels)像素 比方480*800像素
& dip或dp (device independent pixels)設備獨立像素
dp與設備硬件有關,執行時依據屏幕密度轉化爲對應的px,終於由px值肯定顯示區域大小,推薦使用它
& sp (scaled pixels — best for text size)比例像素
主要處理字體的大小,可以依據系統的字體自適應,推薦使用
佈局用於定義一個用戶接口的可視結構,比方Activity、應用小部件等。
Ø 佈局的實現方式
* 經過XML聲明UI元素
1. 在xml文件裏設計佈局
- Attributes設置 : 比方ID 、Layout Paraments設置等
- Layout Position設置 :比方控件在父控件的位置:上下左右等
- Size、padding、Margins :控件高與寬、控件內部間隙、控件之間邊距設置
2. 導入佈局資源
比方在Activity中:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);//設置Activity的內容視圖
}
* 經過Java代碼方式
LinearLayout layout=new LinearLayout(context);//建立一個線性佈局對象
layout.addView(new TextView(context));//往線性佈局對象中加入一個文本視圖子控件
Ø 佈局的類別
* cmmon layouts : 普通的佈局
該佈局提供了惟一的方式去顯示已經嵌入在該佈局中的視圖控件,主要用於有固定界面的佈局,包含(Linearlayout、relativeLayout、TableLayout、GridLayout、AbsolutLayout、 FrameLayout。webView等)
* building layout with a adapter: 動態構建的佈局
用一個適配器來動態構建佈局。當佈局的內容是動態的或者前期決定不了的,經過AdapterView的子類與Adapter(適配器)一塊兒來動態構建佈局。
比方:採用ListView來展現聯繫人列表,通話記錄等
Ø LinearLayout
線性佈局。它的子控件是以單一的行或者單一的列排列。子控件不能重疊,具備方向性(水平、垂直),默認是水平方向,可以設置位置和權重
* 常用的XML屬性:
android:orientation 線性佈局的排列方向(vertical\horizontal)
android:padding 控件內部的間隙
android:gravity 控件內部的排列位置 (center_vertical、center_horizontal等)
android:layout_gravity 位置
android:layout_margin_top 與頂部的邊距
android:layout_weight 權重
* 注意點:
- 修飾控件屬性時,有layout與無layout的差異
有layout。表示佈局屬性修飾,它相對於父控件或者父控件中的其它子控件的屬性修飾,
無layout。它僅僅針對控件自己,是對該控件內部元素的修飾
- 權重
它是線性佈局或者它的子類所特有的屬性修飾。它針對的是子控件的寬和高的設置
先預留出沒有設置權重的控件的寬或者高,以後對相對於父控件剩餘的空間(寬或者高)按權重(比例)分配
幀佈局被設計成在一個屏幕區域顯示一個單一的項(single item)。一般FrameLayout顯示一個單一的子控件,它支持的佈局屬性不夠豐富。通常經過layout_gravity來設置子控件的位置。
FrameLayout的子控件被繪製在一個堆棧中,近期加入進來的子控件在堆棧的頂部
表格佈局,是LinearLayout的子類。以行和列的形式存放子控件,它一般由多個TableRow佈局控件組成,TableRow由多個單元格(cell)組成,每個cell設置爲View對象 。表格佈局的子控件可以設置權重,但是不能設置方向
網格佈局,android 4.0之後出現,佈局使用虛細線將佈局劃分爲行、列和單元格,也支持控件在行、列上都有交錯排列。有方向性,默以爲水平方向,相對於TableLayout。渲染速度更快。更靈活。
對於低版本號要使用GridLayout,需加入向下的支持庫v7
xmlns:app="http://schemas.android.com/apk/res-auto"
* 常用的XML屬性:
android:columnCount 設置列數
android:layout_row 控件的起始行位置
android:layout_column 控件的起始列位置
android:layout_rowSpan 控件跨越行數
layout_columnSpan 控件跨越列數
layout_gravity=「fill」 與layout_rowSpan或columnSpan結合使用,表示填滿所跨越的行或者列
絕對佈局。子控件的位置以絕對的位置定位。子控件之間可以重疊,相對於其它佈局,缺乏靈活性,不建議使用
* 常用的XML屬性:
android:layout_x : 相對於父控件的x座標位置
android:layout_y : 相對於父控件的y座標位置
相對佈局,子控件的位置關係可以經過子控件與父控件、子控件與子控件來肯定。子控件之間位置可以重疊,拓展性好。靈活方便,是使用最多的佈局方式
* 常用的XML屬性
android:layout_toLeftOf="@+id/name" 指定控件的左邊
android:layout_toRightOf="@+id/name" 指定控件的右邊
android:layout_above="@+id/name" 指定控件的上邊
android:layout_below="@+id/name" 指定控件的下邊
android:layout_alignLeft="@+id/name" 與指定控件左對齊
android:layout_alignRight="@+id/name" 與指定控件右對齊
android:layout_alignTop="@+id/name" 與指定控件頂部對齊
android:layout_alignBottom="@+id/name" 與指定控件底部對齊
android:layout_alignParentLeft="true" 與父控件的左邊對齊
android:layout_alignParentRight="true" 與父控件的右邊對齊
android:layout_alignParentTop="true" 與父控件頂部對齊
android:layout_alignParentBottom="true" 與父控件底部對齊
android:layout_centerHorizontal="true" 在父控件中水平居中
android:layout_centerVertical="true" 在父控件中垂直居中
運用GridLayout佈局設計簡易計算器界面
實現一個發短信的android小程序
(要求佈局管理器爲相對佈局)
* 界面設計
* 代碼實現
* 在AndroidManifest.xml中設置發短信的權限
android:name="android.permission.SEND_SMS"/>
通常,用戶經常會經過界面與應用交互,Android框架採用事件驅動的形式與用戶交互,那怎樣處理用戶界面中觸發的事件?
可以經過從用戶交互的View設置事件監聽器的方式來實現對事件的處理。一個事件監聽器是View類中一個包括單一回調方法的接口。當註冊了監聽器的View發生了相應的監聽事件時。Android框架就會回調相應的監聽方法。
* 常見的用戶事件
點擊事件、選擇事件、觸屏事件、長按事件、按鍵事件
單擊事件是事件機制中最多見的事件,經過對控件綁定View.OnClickListener 實現單擊事件的監聽
& 私有類實現方式
& 匿名內部類實現方式
& 佈局中對控件加入android:onClick
& Activity實現監聽接口
* 案例:對button按鍵監聽
對四個button實現監聽,分別用四種不一樣的書寫方式實現單擊監聽事件
* 界面設計
* 代碼實現
複選事件的監聽接口:CompoundButton.OnCheckedChangeListener
複選控件CheckBox 有兩種狀態:選中與未選中狀態。對複選控件
* 案例:明密文切換
經過對CheckBox控件的複選監聽,實現對EditText內容明密文切換
* 界面設計
* 代碼實現
單選事件的監聽接口:RadioGroup.OnCheckedChangeListener
RadioButton與RadioGroup組合使用才幹實現單選功能
* 案例:選擇字符集
經過對RadioButton控件的選擇監聽,實現對字符集的選擇
* 界面設計
* 代碼實現
下拉事件的監聽接口:AdapterView.OnItemSelectedListener
* 案例:城市選擇
經過對Spinner下拉列表監聽,實現對城市的選擇
* 界面設計
* 代碼實現
3.3 長按與觸屏事件
長按事件監聽接口:View.OnLongClickListener
觸屏事件監聽接口:View.OnTouchListener
* 案例:長按圖標設置手機桌面壁紙
clearWallpaper :清除桌面壁紙
setWallpaper(BitMap bitmap) :設置桌面壁紙
設置壁紙要加入權限:
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
* 代碼實現
Activity實現了KeyEvent.backcall接口
onKeyDown(int keyCode, KeyEvent event) :當鍵按下去觸發
onBackPress():當返回鍵按下去觸發 。Activity的方法
模擬器常見的按鍵:
Back 返回鍵
Home 手機屏幕桌面
Ctrl+F11 切換模擬器橫豎屏幕
F2 手機菜單
F3 電話面板
F8 手機網絡開關
ProgressBar 進度條。常用於文件下載進度顯示、系統初始化進度等,默認狀況是沒有進度值的(轉圈圈)
* 提示點:
style="@android:style/Widget.ProgressBar.Horizontal" 樣式設置
setProgress(int) 設置當前進度值
getProgress() 獲得當前進度值
setMax(int) 設置最大值
案例:經過button設置進度條進度
* 界面設計:
* 代碼實現
RatingBar 評分進度條,常用於對商品、用戶的評價,比方愜意度調查等
* 提示點:
setOnRatingBarChangeListener 設置監聽器
setNumStars 設置星星的個數(設置總分)
setStepSize 設置分數間隔
getRating 得到當前的分數值
setRating 設置當前的分數值
案例:對歐冠精彩程度打分
* 界面設計:
* 代碼實現
ToggleButton:開關button,它是CompoundButton的子類,實現開與關的效果,比方藍牙開關、wifi開關、聲音開關等
* 提示點:
- 實現的監聽接口:CompoundButton.OnCheckedChangeListener
該接口是監聽開關button狀態的改變
- toggle() :取反操做
- xml屬性設置
textOn: 表示狀態爲開的提示文本
textOff: 表示狀態爲關的提示文本
案例:設置聲音開關
* 界面設計
* 代碼實現
ScrollView:滾屏視圖,它是FrameLayout的子類,能夠被用戶滾動的佈局容器。它僅僅能擁有一個子控件,經常應用於一個垂直方向的線性佈局中。
ScrollView僅僅支持垂直滾動,對於需要水平滾動,則用HorizontalScollView
ListView 列表框,常用控件,用來顯示一樣數據結構的批量數據。比方:從數據庫獲取的數據列表,從網絡解析的批量結構數據,通常都會採用ListView展現數據,系統中的設置、未接來電、通訊錄等顯示可採用ListView進行展現
用ListView展現數據的四個步驟:列表項描寫敘述、初始化數據、適配器數據裝配、設置適配器
案例:在ListView中顯示好友列表
* 界面設計與分析:
* 代碼實現
在某些狀況下。可能需要你去通知用戶發生在你應用中的事件,當中一些事件需要用戶響應。有的則不需要。Android框架經過消息機制很是好的完畢上述的需求。
比方:
- 當一個事件完畢時(比方保存文件),需要顯示一個簡短的消息來確認保存成功
- 假如應用正在後臺執行,且需要用戶注意。那麼該應用需要建立一個通知以方便用戶作出響應
- 假如用戶要操做一個危急的操做,則應該建立一個對話框通知,再一次確認用戶的操做
常見的消息提示方式有:
- Logcat(日誌貓)
- Toast(瞬時提示)
- Dialog(對話框)
-Notification(通知)
* 級別 :v、d、i、w、e 級別由低往高
- verbose :混淆的 ,所有信息都可以輸出,級別最低
- debug :調試級別
- info:信息級別
- warning:警告級別
- error :錯誤級別
* 加入過濾器 依照Tag進行過濾
* System.out.println()與Log輸出之間的差異
- System.out.println()輸出的信息 等級是info級別。標記tag:System.out
- System.out.print()輸出信息 需要System.out.flush()刷緩存輸出
Toast通知是一種浮現在屏幕上層的消息提醒。它僅僅填充消息所需要的空間,而當前正在執行的活動仍然保持其自身的可見性和交互性。這樣的通知本身主動淡入淡出且不接受交互事件
* 代碼實現
Ø 經過XML本身定義Toast
* LayoutInflate :把xml佈局文件實例化爲View對象
5.3 對話框
對話框通常是一種顯示在當前活動之上的小窗體,這時候下層的活動將失去焦點,由對話框來實現與用戶的交互,常用於加入簡單的數據或對操做進一步確認等。比方刪除聯繫人信息、加入類別等,但對話框不宜過多,會影響用戶體驗
常見的對話框有:標準對話框、單選對話框、複選對話框、本身定義對話框
標準對話框是使用最多的一種對話框樣式,包括對話框圖標、標題、提示系統、確認和取消。
* 建立標準對話框流程:
1. 生成對話框構建器對象AlertDialog.Builder
2. 設置圖標Builder.setIcon
3. 設置標題
4. 設置提示信息
5. 加入確認與取消button
6. 對確認與取消button中加入監聽,實現對話框的業務邏輯
* 案例: 構建標準對話框
* 界面設計
* 代碼實現
菜單式對話框適用於單選某個列表項或者對某項數據有幾種不一樣的操做等應用場景
* 關注點:
& Builder.setItems(items, listener) :設置單選項
items:單選項字符串數組
listener:單選單擊監聽
* 運用單選對話框選擇Android版本號代號
* 界面設計
* 代碼實現
複選對話框適用於以對話框的形式複選某個列表
* 關注點:
& Builder.setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, OnMultiChoiceClickListener listener) : 設置複選監聽
items:複選項字符串數組
checkedItems:複選項默認值
listener:複選單擊監聽
& AlertDialog.getListView() : 獲得用於對話框的列表視圖—ListView
& SparseBooleanArray : 稀疏布爾數組,用於映射整數到布爾值 ,與通常的布爾數組不一樣。下標可以贊成有間隙,它比用HashMap映射Integers到Booleans 更有效率
& ListView.getCheckedItemPositions() 獲得選擇項的位置信息及其狀態 ,返回值:SparseBooleanArray
* 運用複選對話框選擇Android版本號代號
* 界面設計
* 代碼實現
系統對話框太單一。在開發中常需要本身定義對話框
* 關注點:
& new Dialog(context,theme):以本身定義的樣式構建對話框
& Dialog.setContentView():設置對話框的佈局
& Dialog.findViewById() : 經過findViewById找到對話框佈局中的控件
* 本身定義視圖,實現經過對話框輸入信息
* 界面設計
* 代碼實現
Ø 對話框緩存
一樣對話框每次顯示的界面都是一致的。可以經過Activity的對話框緩存實現對話框實例的反覆利用,達到優化對話框的目的
* 實現原理圖
Ø DialogFragment
* Fragment :碎片、片斷
引入fragments主要目的是用在大屏幕設備上支持更加動態和靈活的UI設計,
一個Fragment表明一個用戶接口的行爲或者部分行爲,把幾個Fragment混合到一個Activity中,可以建立一個多個頁面的UI並可以在多個Activity中複用一個Fragment,碎片必須老是嵌入到一個活動(activity)中。並且它的生命週期直接受到Activity的生命週期的影響。
把fragment 想象成一個activity的模塊化區域, 有它本身的生命週期, 接收屬於它的輸入事件, 並且可以在activity執行期間加入和刪除。
* DialogFragment :對話框碎片
用於顯示一個對話框窗體的Fragment。它浮於Activity窗體上面,該對話框的顯示依賴於Fragment的生命狀態
* 實現步驟
- 建立一個類,繼承DialogFragment。重寫onCreateDialog方法。在該方法中完畢對話框的建立
- 在Activity中建立DialogFragment實例,並調用show()方法完畢對話框的顯示
可以經過DialogFragment.setArguments()\getArguments()傳遞和接收參數
在實際開發中,開發android軟件的過程需要不斷地進行測試。而使用Junit 測試框架。則是正規的Android開發的必用技術,Android很是好封裝了Junit測試框架。可以模擬發送事件和檢測程序處理的正確性
* Android單元測試實現流程
1. 加入測試類庫
在AndroidManifest.xml 的<application> 節點 加入測試類庫
<uses-library android:name="android.test.runner"/>
2. 設置測試環境
<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="cn.itcast.filestore"/>
3. 編寫測試類
- 繼承AndroidTestCase
- 獲取上下文getContext()
- 使用斷言 assertEquals()
- 查看測試效果
各類Android移動的主要任務是處理數據。怎樣將需要處理和處理好的有效的存儲起來是一個亟待解決的問題。Android系統提供了很豐富的移動存儲方案。
* 常見移動存儲方案:
手機內部存儲
手機外部存儲
SharedPreferences
SQLite
ContentProvider
網絡
手機內部存儲,默認在/data/data/<包名>/files 目錄下存放文件
* 手機內部存儲的特色:
& 存放本應用中的私有數據
& 當應用卸載時,/data/data/<包名> 這個文件夾會同步刪除,即手機內部存儲的文件
會刪除
& Context.openFileOutput(String name, int mode)
- 往手機內部存儲中以某種模式寫文件
- name :文件名稱
- mode :文件操做模式
- return:FileOutputStream
- 文件存放在/data/data/包名/files/
& Context.openFileInput(String name) 從手機內部存儲中讀取文件
- 從手機內部存儲中讀文件
- name:文件名稱
- return:FileInputStream
& getCacheDir() 方法用於獲取/data/data/<package name>/cache文件夾
& getFilesDir() 方法用於獲取/data/data/<package name>/files文件夾
* 文件操做模式
權限 |
說明 |
Context. MODE_PRIVATE【默認】 |
私有權限。僅僅有本Android應用可用 |
Context. MODE_WORLD_READABLE |
全局讀權限,其它Android應用僅僅可以讀取 |
Context. MODE_WORLD_WRITEABLE |
全局寫權限,其它Android應用可寫 |
Context. MODE_WORLD_READABLE+ Context. MODE_WORLD_WRITEABLE |
全局讀寫全新,其它Android應用可讀可寫 |
Context. MODE_APPEND |
追加模式。在些數據的時候在已有文件後追加寫,默認是私有權限僅僅有本應用可讀可寫 |
所有兼容Android的設備都支持一個可共享的「外部存儲(external storage)」,可用來保存文件。
這可以是一個可移動的存儲設備(比方SD卡)或者一個內部的(不可移動的)存儲。
保存在外部存儲的文件是可全局讀寫的。
* Sdcard存儲的特色:
& 依賴於Sdcard,使用SDCard存儲,需先檢測其狀態
& 存在Sdcard的文件是可全局讀寫的
& 寫入Sdcard時,需要權限
* 關注點:
& Environment.getExternalStorageState() 取得外部存儲狀態
& Environment.getExternalStorageDirectory() 取得外部存儲根路徑
& 寫入外部存儲的權限
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
android.permission.WRITE_EXTERNAL_STORAGE
* 外存路徑描寫敘述
& 取得外部存儲的公共共享存儲路徑
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
& .在外存中存放應用的私有文件,當應用刪除時,該內容會同步刪除 :
context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
文件夾: /android/data/<包名>/files/<類型>
&.在外存中存放應用的私有緩存文件 ,當應用刪除時,該內容會同步刪除
context.getExternalCacheDir()
文件夾:/android/data/<包名>/cache
&.取得外存的根路徑
Environment.getExternalStorageDirectory()
Ø 案例 :文件存儲
在Activity界面中編輯某文件,實現對該文件在手機內部存儲及SDCard的存取
* 界面設計
* 代碼實現(手機內部存取)
SharedPreferences,是一個很輕量的數據存儲方式,以xml的形式存取簡單的鍵值對數據。數據類型包含(ints,floats,boolean,strings,longs,Set<String>(android 11之後)),存放位置:/data/data/<包名>/shared_prefs。存放的是應用私有的數據,主要用於軟件偏好設置。簡單信息存取等
* 獲取SharedPreference對象
- Context.getSharedPreferences(String name,int mode)
name:指定XML文件名稱,不需要指定.xml後綴。name存在則打開,沒有則建立
mode:文件的操做模式,見文件存儲的文件操做模式表格
- Activity.getPreferences(int mode)
name爲默認值:即當前訪問的Activity的類名
* 操做SharedPreference對象
& 取得參數值
- SharedPreference.getString(key,defValue) 取得參數值,類型爲字符串
- SharedPreference.getBoolean(key,defValue) 取得參數值。類型爲布爾型
& 存儲參數值
- Editor edit = SharedPreferences.edit(); // 獲取編輯器
- edit.putString(key, value); // 存儲字符串數據
- edit.putBoolean(key, value); // 存布爾數據,
- edit.commit(); // 提交新值
Ø 案例 :運用SharedPreference保存用戶登陸信息
要求:
1.帳號password驗證成功。則進入還有一個Activity
2.選中複選框,則用戶登陸時。把帳戶及password信息存入SharedPreference
3.應用下次啓動,根據存儲的複選框狀態值,決定是否填充帳戶與password信息
4.對存入SharedPreference的值對信息加密
* 界面設計
* 代碼實現
XML文件是很重要的數據格式,它可以用來做配置文件。存儲數據等,Android中可以經過SAX、DOM、PULL來解析 XML數據
* pull解析:
Xml文件邊導入內存,邊解析。採用事件驅動機制,當解析到一個節點。返回的是該節點的事件類型,且不會繼續往下解析。需手動指向下一個節點,才幹繼續往下解析。直到文檔的結尾。
Android默認採用pull解析。
* 事件類型:
- START_DOCUMENT : 開始文檔
- START_TAG : 開始標籤
- END_TAG : 結束標籤
- END_DOCUMENT : 結束文檔
Ø 案例:用pull解析及生成XML文件
* 界面設計
* 代碼實現 (pull解析)
* 代碼實現 (用pull生成xml)
在Android平臺上,集成了一個嵌入式關係型數據庫—SQLite,它是一種很輕量的數據庫管理系統,SQLite3支持 NULL、INTEGER、REAL(浮點數字)、TEXT(字符串文本)和BLOB(二進制對象)數據類型。SQLite經過文件來保存數據庫,一個文件就是一個數據庫
* 常用類介紹
& SQLiteOpenHelper
數據庫輔助抽象類。經過實現它的子類可以建立數據庫以及實現版本號更新,經過getWriteableDatabase得到getReadableDatabase獲取數據庫訪問類
& SQLiteDatabase:數據庫訪問類
經過數據庫訪問類,可以實現對數據庫的增刪改查等操做
SQLite數據庫是在第一次調用的時候建立數據庫的
建立數據庫的步驟:
1.定義一個db輔助類。繼承SQLiteOpenHelper抽象類,經過構造方法設置數據庫名及版本號信息
2. 重寫onCreate()方法,該方法僅僅會在數據庫第一次建立的時候調用。在此方法中適合作數據庫初始化操做,比方建立數據表等
3. 重寫onUpGrade() , 當數據庫版本號更新時調用,適合作表結構的改動或者加入刪除表
* 參考代碼:
* 加入記錄
* 刪除記錄
* 查詢
* 更新記錄
& Android四大組件之中的一個,沒有圖形界面
& 共享數據給第三方應用程序。統一數據訪問方式
& 線性安全,Android系統爲每個 ContentProvider提供一個實例(單列模式),經過ContentResolver訪問ContentProvider
1. 準備需要共享的數據,一般是sqlite數據
2. 建立一個類。繼承ContentProvider。實現第三方應用訪問數據的方法(增刪改查)
3. 在AndroidManifest.xml 進行註冊,並且設置android:autorities屬性:認證(在系統中該內容提供者的惟一標識)
4. 第三方應用訪問ContentProvider。 經過Context.ContentResolver(內容訪問者)進行訪問,比方:ContentResolver.insert(Uri,ContentValues);
* Uri:(統一資源標識符)表示要操做的數據
由兩部分組成:內容提供者的標識、詳細要訪問什麼,也就是路徑
content://cn.itcast.sqlite.provider.books/student/
* UriMatch: 用來匹配Uri的 工具類
UriMatch.addUri(Uri);//註冊Uri
UriMatch.match(Uri);匹配Uri
* ContentUris: Uri內容解析
ContentUris.withAppendedId(Uri,id) : 在Uri尾部加入id
ContentUris.parseIdUuri) :解析Uri。獲取Uri的id部分
Ø 案例:經過ContentProvider共享數據庫
把books.db數據庫的book表經過ContentProvider實現數據共享。第三方應用可以對book表實現增刪改查操做
* 經過UriMatch註冊Uri
* 實現查詢操做接口
* 經過得到訪問數據類型接口
* 實現插入操做接口
* 實現刪除操做接口
* 實現更新操做接口
* 第三方訪問ContentProvider
一個Activity最多僅僅能擁有一個選擇菜單,當選擇菜單第一次訪問的時候建立,該Activity銷燬沒有銷燬的狀況下。僅僅建立一次
* 建立選擇菜單
onCreateOptionsMenu(Menu menu)
* 監聽選擇菜單
onOptionsItemSelected(MenuItem item)
一個組件可以綁定一個上下文菜單。上下文菜單每次彈出。都會又一次建立一次
註冊上下文菜單的兩種寫法
//registerForContextMenu(bookList);
// bookList.setOnCreateContextMenuListener(this);
* 建立上下文菜單
& onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)
參數:menu:要建立的上下文菜單
v: 選擇項的視圖(ListView的Item)
menuInfo: 額外的菜單信息,依賴於選擇的視圖(V)
& 獲取彈出上下文菜單的選項視圖信息
//經過適配器上下文菜單信息類來獲取 被選中的菜單項的數據信息
AdapterContextMenuInfo adapterInfo=(AdapterContextMenuInfo) menuInfo;
* 監聽上下文菜單
onContextItemSelected(MenuItem item)
//經過適配器上下文菜單信息類來獲取 被選中的菜單項的數據信息
AdapterContextMenuInfo adapterInfo=(AdapterContextMenuInfo) item.getMenuInfo();
* 1.Action Bar特色
操做欄在Android 3.0版本號之後出現,是一個窗體功能用於肯定應用程序和用戶的位置,並提供給用戶操做和導航模式。Action Bar被以爲是新版Android系統中重要的交互元素
* 二、Action Bar分紅四個區域
- App Icon:可顯示軟件icon。也可用其它圖標取代。
當軟件不在最高級頁面時,圖標左側會顯示一個左箭頭,用戶可以經過這個箭頭向上導航。
- 視圖切換:假設你的應用要在不一樣的View中顯示數據。這部分贊成用戶來切換View。
通常的做法是用一個drop-down菜單或者是Tab Controls。假設僅僅有一個界面,那這裏可以顯示App Title或者更長點的商標信息
- Action Buttons:這個放最重要的軟件功能,放不下的button就本身主動進入Action overflow了。
- Action overflow:把不常用的Actions移到Action overflow
* 三、Action Bar常用的交互操做
- 選擇操做項
與選擇菜單一致,都是使用一樣的api來建立和監聽操做項
- 操做導航選項標籤
選項標籤要與Fragment相結合,實現界面切換的效果
1. 加入標籤 : ActionBar.Tab
2. 監聽標籤 : ActionBar.TabListener
Ø 案例:經過菜單操做內容提供者的數據
* 界面設計
* 代碼實現(更新書籍信息)
* 刷新數據操做
9.1 爲何要本身定義適配器
想操做列表項的界面和數據
* 列表視圖、初始數據、列表項佈局關係圖
9.2 怎樣本身定義適配器
9.3 本身定義適配器優化
1. 當某個item進入視野範圍內時。就會調用adapter的getView方法。又一次渲染item。以前咱們在每次渲染item的時候都又一次實例化item的佈局文件。建立一個View。這樣會產生很是多的對象,性能不佳
2. 咱們嘗試使用如下這樣的循環利用的方案
1> 若是咱們的屏幕恰好僅僅能放下3個item
2> 當從狀態1—>狀態2,有4個item同一時候出現在屏幕中,所以這4個ItemView都是不一樣的對象
3> 當從狀態2—>狀態3,item-0消失在視野中
4> 當從狀態3—>狀態4。咱們可以考慮把以前的item-0移動到item-4的位置。因爲item-0跟item-4不會同一時候出現在咱們視野範圍中
5> 當從狀態4—>狀態3,咱們可以考慮把以前的item-4移動到item-0的位置
3. 再來看public View getView(int position, View convertView, ViewGroup parent)中的convertView參數,這個是系統幫咱們傳遞進來的,它就表明當前可循環利用的ItemView
4. 注意:儘管性能有提高,但是在渲染item的時候。必定保證當前item要全然覆蓋可循環利用item的數據,因爲循環利用item可能會形成舊數據殘留。
Intent負責相應用中一次操做的動做、動做涉及數據、附加數據進行描寫敘述,Android則依據此Intent的描寫敘述。負責找到相應的組件。將 Intent傳遞給調用的組件,並完畢組件的調用。所以,Intent在這裏起着一個媒體中介的做用,專門提供組件互相調用的相關信息,實現調用者與被調用者之間的解耦。
* 調用Activity : startActivity(intent) startActivityForResult(Intent)
* 調用Service:服務 startService(intent) \bindService(intent)綁定服務
* 發送廣播 :sendBroadcast(intent)發送無序廣播
sendOrderedBroadcast(Intent)發送有序廣播
* setAction: 設置動做
ACTION_MAIN 、ACTION_VIEW、ACTION_GET_CONTENT、ACTION_EDIT
* setData: 設置數據 :Uri格式的數據。標準數據
* setType:設置數據的類型 :MIME (image/*,video/* ,text/plain)
* addCateGory: 加入你要調用的組件的類別
CATEGORY_LAUNCHER CATEGORY_HOME
CATEGORY_BROWSABLE CATEGORY_DEFAULT
* 案例:在本應用中實現站點的瀏覽
* 顯示調用是直接指定類名,Android不用再去解析intent
* 隱式調用需要設置action、data、category、type,再有Android解析你的意圖
對於本應用中的組件要實現隱式調用。需要在AndroidManifest.xml中配置<intent-filter>
* 案例:顯示調用第三方應用Activity組件
* 兩種寫法 :
& 經過Intent.putExtra(key,value)加入
& 經過bundle加入
* 加入額外數據
* 在目標組件中獲取上一個組件傳遞過來的額外數據
活動。四大組件之中的一個,也是最重要的組件。它經過內置的Window對象來展現一個與用戶交互的界面,它的操做都與用戶有關。通常一個佈局針對於一個Activity界面
View控件捕獲事件信息,WindowManagerService傳遞消息,再由Android框架回調Activity的對應監聽方法實現與用戶的交互
* startActivity(Intent) :開啓一個新的Activity,它將放到活動棧的棧頂
* startActivityForResult(Intent,int) :開啓一個新的Activity。當新的Activity結束時,經過setResult(int,Intent)把結果回傳給調用者,調用者經過onActivityResult()處理回傳結果
* 案例:設置圖像視圖控件的前景圖片
點擊圖像視圖控件。進入圖片瀏覽界面,把選定好的圖片做爲圖像視圖控件的前景圖片
* 參考代碼
應用中的活動是由活動棧進行管理的,當一個新的Activity啓動後,它會處於棧頂的位置。與用戶進行交互,處於執行的狀態;先前的Activity會移到它的下方,處於暫停或者中止狀態
* Activity生命週期
- 全然生命週期
自第一次調用onCreate()開始,直至調用onDestroy()爲止。
Activity在onCreate()中設置所有「全局」狀態以完畢初始化。而在onDestroy()中釋放所有系統資源。
- 可見生命週期
自onStart()調用開始直到對應的onStop()調用結束。在此期間。用戶可以在屏幕上看到Activity,雖然它或許並不是位於前臺或者也不與用戶進行交互。在這兩個方法之間,咱們可以保留用來向用戶顯示這個Activity所需的資源。
- 可交互的生命週期
自onResume()調用起,至對應的onPause()調用爲止。
在此期間。Activity位於前臺最上面並與用戶進行交互。
Activity會經常在暫停和恢復之間進行狀態轉換。
*Activity生命週期狀態
Activity有四個生命週期狀態。狀態之間改變需要回調對應的生命週期方法來完畢
- 執行狀態
- 暫停狀態
- 中止狀態
- 銷燬狀態
* 生命週期方法
- onCreate(): 建立方法
- onStart(): 開始方法
- onResume(): 得到焦點方法
- onPause() :暫停方法
- onStop() :中止方法
- onRestart() :又一次啓動方法
- onDestroy() :銷燬方法
* 應用場景:
- onCreate(): 建立Activity時調用,通常在這裏作初始化的操做,比方控件的初始化,綁定數據到列表中等
- onDestroy():銷燬,在這裏釋放資源 MediaPlayer.release(), 關閉數據庫鏈接
- onStart() 開始方法 :通常註冊廣播監聽 。綁定服務 onStop()註銷監聽 ,取消服務綁定
- onpause() 與onResume() 。這兩個方法會經常調用,這裏不易寫耗時的操做。
通常在這裏對持久化數據的保存 。中止動畫以及耗CPU的事情;onResume則相反
對Activity實例的管理: 經過任務棧的形式來管理(TaskStack)
* standard :標準模式(每次激活,都會建立一個Activity實例)
* singleTop :棧頂模式 :假如要激活的Activity它的實例恰好在棧頂的話。就不用再又一次建立
* singleTask: 單任務模式 : 假如任務棧有該Activity的實例。就不需要又一次建立。因爲該Activity要與用戶交互,所有在該Activity實例前面的Activity都會彈出堆載
* singleInstance: 單實例模式 :主要用於實例共享,會單獨開闢一個任務棧來存放該實例,比方瀏覽器的Activity
11.5 onSaveInstanceState()和 onRestoreInstanceState()
Activity的 onSaveInstanceState() 和 onRestoreInstanceState()並不是生命週期方法,它們不一樣於 onCreate()、onPause()等生命週期方法。它們並不必定會被觸發,當Activityeasy被銷燬時(如:內存不足、用戶直接按Home鍵、跳轉到下一個Activity、屏幕切換(橫豎屏))onSaveInstanceState()纔會被調用。但是當用戶主動去銷燬一個Activity時,好比在應用中按返回鍵,onSaveInstanceState()就不會被調用。因爲在這樣的狀況下,用戶的行爲決定了不需要保存Activity的狀態。一般onSaveInstanceState()僅僅適合用於保存一些暫時性的狀態。而onPause()適合用於數據的持久化保存。
需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法「不必定」是成對的被調用的。onRestoreInstanceState被調用的前提是,activity 「確實」被系統銷燬了
在Android中。應用的響應性被活動管理器(Activity Manager)和窗體管理器(Window Manager)這兩個系統服務所監視。
當用戶觸發了輸入事件(如鍵盤輸入,點擊button等), 假設應用5秒內沒有響應用戶的輸入事件,那麼。Android會以爲該應用無響應,便彈出ANR(Application No Response)對話框
在正常狀況下,Android程序會在一條單線程裏執行。假設Activity要處理一件比較耗時的工做。應該交給子線程完畢,否側會因爲主線程被堵塞。後面的用戶輸入事件因沒能在5秒內響應,致使應用出現ANR對話框。
當遇到這些問題:電池低、網絡斷網、下載完畢或某個圖片被捕獲,想通知你的用戶,那該怎麼辦?
在Android平臺中, 經過廣播機制能很是好解決這些問題,當遇到某些系統事件時,比方收到短信、電量偏低等,就會以廣播的形式發送事件消息,並且Android框架會本身主動喚醒訂閱了該廣播事件類型的廣播接收器來處理,處理完成後,Receiver當即退出。
Android廣播機制的特色:
1. 發送者沒必要關心接受者的狀況,發送者與接收者全然的解耦
2. 廣播事件是系統級別的事件,而咱們開發的應用的事件(比方控件的點擊事件),它是屬於應用級別的事件
3. 系統內置了大量的廣播事件,訂閱系統的廣播事件可以豐富咱們應用的功能
4. 廣播機制主要解決的是應用程序之間通訊的功能
* 特色:
1. Android四大組件之中的一個,是惟一可以動態註冊的組件
2. 沒有圖形界面,能夠自啓動。在主線程執行
3. BroadcastReceiver組件生命週期比較短,10秒左右,運行完組件的onReceive()方法後後會立刻銷燬。因此廣播接收器組件應該扮演一個網關的角色。僅僅做簡單的信息處理。比方發通知或者Toast;對於複雜的業務應該開啓一個Service或者在還有一個應用中去完畢業務
* 執行流程
首先把要發送的信息及動做封裝在Intent中,由系統事件機制觸發廣播(比方:日期改變、電池電量低、網絡斷網、收到短信等)或者本身經過Content.sendBroadcast(Intent)發送廣播。當Intent發送之後。系統根據發送的Intent信息與已經註冊的廣播接收器組件進行匹配。若匹配成功,則實例化對應的BroadcastReceiver組件。調用onReceive(Context curContext, Intent broadcastMsg)方法。執行完成,銷燬廣播組件。
* 本身定義廣播接收器實現流程
1. 定義類,繼承BroadcastReceiver,並重寫onReceive()方法
2. 在AndroidManifest.xml註冊廣播接收器
3. 訂閱廣播事件
* 案例:本身定義能監聽日期改變的廣播接收器
* 參考代碼
* 無序廣播
所有的廣播接收器執行在一個沒有定義的順序,不能屏蔽結果,不能改動廣播, 沒法終止廣播 ,可經過Context.sendBroadcast發送無序廣播
* 有序廣播:
有序廣播在同一時間傳送到一個接收器。由於每個接收器依次運行。它可以結果傳播到下一個接收器,或者它可以全然停止的廣播。需定義優先級優 先級別在 intent-filter 中的 priority 中聲明 ,-1000 到1000 之間 , 值越大 , 優先級越高 . 接收者可以截斷廣播等,可經過Context.sendOrderBroadcast發送有序廣播。
android:priority :設定廣播接收器的優先級
abortBroadcast() :截斷廣播、終止廣播傳遞
* 案例 :短信監聽器
* 要求:
1.該應用沒有界面。也不能在手機應用程序列表中出現
2.能夠獲取短信內容及發信人電話號碼
3.實現本身主動回覆功能
4.截斷短信,系統提供的短信接收器組件不能收到短信
* 參考代碼
* 應用場景
經過AndroidManifest.xml註冊廣播接收組件。僅僅有當該應用在Android系統中刪除才能夠註銷廣播接收組件。有時需要當應用執行時註冊廣播接收組件,而應用退出時,註銷該廣播接收組件,該怎樣解決?
可以對廣播接收組件實現動態註冊,廣播接收器也是惟一可以動態註冊的Android組件。通常在Activity的onStop()註冊廣播接收組件,在onResume()中註銷廣播接收組件。
* 案例:對監聽日期改變的廣播接收器組件實現動態註冊
* 參考代碼
Notification 是一條顯示在應用UI界面以外的通知,一條通知到來時。它首先顯示在通知欄中。當對通知往下拉放時,會顯示通知的具體信息,當對通知的具體信息框進行點擊時,則可經過Intent激活其它組件。實現業務處理。
Notification是Android很重要的消息提示機制,常與廣播接收器組合使用,實現廣播通知,比方:短信通知、軟件更新通知等
在3.1以後。系統的package manager添加了對處於「stopped state」應用的管理,
指的是安裝後歷來沒有啓動過,與此同一時候系統添加了2個Flag:FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES ,
來標識一個intent是否激活處於「stopped state」的應用。
Android默認給所有的廣播intent加上FLAG_EXCLUDE_STOPPED_PACKAGES,能在必定程度上避免流氓軟件、病毒啊幹壞事。還能提升效率。假設用戶沒有執行過應用。就不會響應了。
只是對於本身定義的廣播接收器咱們可以經過setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);這種方法來喚醒處於「stopped state」的程序,對於系統發的廣播,則無能爲力
解決的方法:
1. 在你的廣播接收器應用中加入一個Activity,讓用戶執行一次你的應用
2. 經過其它應用發一個本身定義廣播事件。intent設置爲intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES),即包括中止狀態的包也能夠被激活,你的廣播接收器應用訂閱了系統的廣播事件,同一時候也訂閱了本身定義的廣播事件。這樣就行激活處於中止狀態的廣播接收器組件
四大組件之中的一個。需要註冊、沒有圖形界面,生命週期長、不能自啓動,需要startService或者bindService來啓動服務,默認在主線程執行
主要用於實現生命週期較長的操做,比方:打印服務、下載服務、音樂服務、更新服務
Android系統會盡可能維持一個進程的生命。直到終於需要爲新的更重要的進程騰出內
存空間。
爲了決定哪一個進程該終止,系統會跟據執行於進程內的組件的和組件的狀態把進程置於不一樣的重要性等級。
Android進程共分爲五個等級。各自是:前臺進程(Foreground Process),可視進程( Visible Process), 服務進程(Service Process), 後臺進程(Background Process), 空進程(Empty Process)
前臺進程等級最高。空進程等級最低,系統需要內存資源時。會優先回收等級低的進程,比方空進程、後臺進程等
* 前臺進程
用戶當前正在作的事情需要這個進程。假設知足如下的條件,一個進程就被以爲是前臺進程:
1)這個進程擁有一個正在與用戶交互的Activity
2)這個進程擁有一個綁定到正在與用戶交互的activity上的Service。
3)這個進程擁有一個前臺執行的Service — service調用了方法
startForeground().
4)這個進程擁有一個正在運行其不論什麼一個生命週期回調方法(onCreate(),onStart(
或onDestroy())的Service。
5)這個進程擁有正在運行其onReceive()方法的BroadcastReceiver。
* 可視進程
一個進程不擁有執行於前臺的組件,但是依舊能影響用戶所見。知足下列條件時,進程即爲可見:
1)這個進程擁有一個不在前臺但仍可見的Activity(它的onPause()方法被調用)。
2)這個進程擁有一個綁定在前臺(或者可見)Activity的服務。
一個可見的進程是極其重要的,一般不會被終止。除非內存不夠。需要釋放內存以便前臺進程執行。
* 服務進程
一個進程不在上述兩種以內,但它執行着一個被startService()所啓動的service。
雖然一個服務進程不直接影響用戶所見,但是它們一般作一些用戶關心的事情(比方播放音樂或下載數據)。因此除非系統沒有足夠的空間執行前臺進程和可見進程時纔會終止一個服務進程。
* 後臺進程
一個進程擁有一個當前不可見的activity(activity的onStop()方法被調用)。
這種進程們不會直接影響到用戶體驗,因此係統可以在隨意時刻殺了它們從而爲前臺、可見、以及服務進程們提供存儲空間。
* 空進程
沒有執行不論什麼component的進程,保留這個進程主要是爲了緩存的需要。這樣的進程存在的惟一緣由是作爲緩存以改善組件再次於當中執行時的啓動時間
一旦服務開啓,那麼調用者和服務就沒有不論什麼關係了,所以哪怕調用者被destroy了
startService(Activity方法)-->onStartCommand(intent) :經過Intent附加數據進行交互
stopService(Activity方法)-->onDestroy(服務的生命週期方法)
一旦服務開啓,那麼調用者和服務就有密切關係了。假設所有client被destroy了
且可以調用服務內部中的方法。調用者被銷燬前,需要對綁定的服務解綁。
* 啓動:bindService(Activity方法) -->onCreate(Service爲空調用)-->onBind()
* 交互:直接在Activity中拿到Service的實例或者Service的代理對象進行操做
* 關閉:unBindService(Activity方法)-->OnUnbind()-->ondestroy()
案例:經過Service實現音樂播放
這是一個Service的子類,該子類使用線程處理所有啓動請求,.你需要作的僅僅是實現onHandleIntent()方法就能夠.根據Intent的請求指令運行對應的業務。
* 流程介紹:
1. 從應用的主線程其中建立一個默認的線程運行所有的intents發送給onStartCommand()方法,該線程從主線程分離.
2. 建立工做隊列,每次傳遞一個intent 給onHandleIntent()方法實現,沒必要操心多線程.
3. 所有的請求被處理後服務中止,因此你永遠都沒必要調用stopSelf()函數.
4. 默認實現onBind()方法返回null.
Android Interface Definition Language(Android接口定義語言)
由於Android沒有一個進程間共享的內存區域。經過AIDL可以實現進程間的通訊
AIDL實現IPC的流程:
1. 在遠程服務端定義aidl文件 。定義比如接口定義。系統工具會本身主動生成對應的java接口
2. 在服務端的Service中繼承該接口的Stub類,做爲遠程服務的代理對象
3. 在client中先拷貝服務端的aidl文件。並且放在與服務端包名一致的包如下
4. 在client經過ServiceConnetion來得到遠程服務的代理對象,實現遠程進程通訊
5. 在服務端對Service設置IntentFileter,用於遠程組件的調用
6. AIDL是線性安全的,由框架來維護其線性安全
14.1、 Fragment
14.1.1 Fragment介紹
Fragment:片斷、碎片, 表現 Activity 中UI的一個行爲或者一部分. 可以組合多個fragment放在一個單獨的activity中來建立一個多界面區域的UI,並可以在多個activity裏重用某一個fragment.把fragment 想象成一個activity的模塊化區域, 有它本身的生命週期, 接收屬於它的輸入事件, 並且可以在activity執行期間加入和刪除.
14.1.2 Fragment生命週期
Fragment 必須老是被嵌入到一個activity中, 它們的生命週期直接被其所屬的宿主activity的生命週期影響.
14.1.3 Activity管理Fragment
* 在Activity的佈局文件加入Fragment