Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 安卓003快速入門

安卓003快速入門

編輯:關於Android編程

  一、Android概述

  1.1系統概述

  1.1.1 3G

  ?什麼是3G

  英文全稱3rd-generation,第三代移動通信技術。是指將無線通信與國際互聯網等多媒體通信結合的新一代移動通信系統。

  * 3G制式:

  (歐洲版) WCDMA\HSDPA中國聯通采用

  (北美版)CDMA 2000\EV-DO中國電信采用

  (中國版)TD-SCDMA\TD-HSDPA:中國移動采用

  * 3G的發展:

  1G:只能進行語音通話、模擬信號

  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以服務的方式提供動態可伸縮的虛擬化的資源的計算模式 ,這種模式提供可用的、便捷的、按需的網絡訪問, 進入可配置的計算資源共享池(資源包括網絡,服務器,存儲,應用軟件,服務),這些資源能夠被快速提供,只需投入很少的管理工作,或與服務供應商進行很少的交互。

  & 物聯網

  物聯網就是物物相連的互聯網。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發展歷程

  * 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.3Ice 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)

  ?Android應用場景

  手機、平板、智能電視(機頂盒)、穿戴設備(眼鏡、手表)、其它智能嵌入設備

  1.1.3 Android體系結構

  ?Android體系結構

  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作為開發語言,包括系統自帶的應用(短信管理、聯系人管理、圖庫浏覽、網頁浏覽等)和第三方開發的應用

  ?JVM與DVM

  * 共同點:

  解釋執行 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時,提前編譯而已。

  1.2搭建開發環境

  1.2.1 開發環境搭建

  * 開發工具

  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目錄介紹

  1.2.2 創建AVD模擬器

  * 創建模擬器

  * 小細節

  & AVD配置文件位置(默認):

  C:\Documents andSettings\Administrator\.android\avd\AVD2.3.3.avd\config.ini

  & AVD 縮放 :啟動模擬器—>在launch Option中選擇Scale display to real size

  & 模擬器不能保存數據:在模擬器的配置文件中刪除.lock文件

  1.2.3 手機參數

  * 手機屏幕參數:屏幕尺寸、分辨率、屏幕密度

  &手機尺寸: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)

  1.3第一個Android應用程序

  1.3.1 創建應用程序流程

  * 創建新項目

  * 配置項目

  * 配置運行圖標屬性

  1.3.2 Android應用介紹及項目目錄結構分析

  * Android應用結構介紹

  Android 應用程序由應用組件(Activity、Service、ContentProvider、BroadcastReceiver)構成,每一個組件是單獨的模塊,有著不同的入點,系統可以從這些入點進入到你的應用中,組件在AndroidManifest.xml注冊,它們之間松耦合地組織在一起,從而定義你應用的整體功能。

  *項目目錄結構分析

  1.3.3 Android運行過程分析

  ?項目打包簽名

  ?安裝APK

  運用adb工具把apk包上傳到模擬器(真機)中,目錄在data\app\

  讀取androidManifest.xml清單文件(包名、權限、圖標等)

  創建文件夾,在data\data\目錄下創建以包名為文件夾的目錄

  寫入注冊表, 注冊表文件data\system\packages.xml

  ?啟動APK

  Android系統是一個多用戶的Linux系統,應用一旦安裝,系統為每個應用分配一個獨立的Linux用戶ID,當用戶點擊應用程序圖標或者導航到該應用的組件時,Android框架會創建一個虛擬機實例,開啟一個進程,創建一個主線程(UI線程),再實例化入口組件,進入組件的生命周期

  1.3.4 常用的命令操作

  adb shell :進入linux客戶端shell命令模式

  adb install apk文件 :安裝apk文件

  adb uninstall 包名 :刪除模擬器應用

  adb devices :列出所有設備

  adb push 把本地的文件復制到遠端

  adb pull 從遠端復制文件到本地

  mksdcard 大小 創建sdcard鏡像文件

  android create avd –name <模擬器名> -target 創建模擬器

  emulator –avd avd名 啟動模擬器

  adb –s<設備名> <命令>對於有多個設備終端

  1.3.5 案例:應用體驗之電話撥號器

  實現一個打電話的小程序

  * 界面設計

  * 代碼實現

  * 在AndroidManifest.xml中添加打電話權限

  1.3.6 DDMS透視圖

  DDMS(Dalvik Debug Monitor Service) DVM調試監視服務

  & Devices : 查看模擬器設備的狀態,模擬器運行的進程

  & File Explorer: 文件浏覽器(導入、導出文件、創建文件夾、刪除文件等)

  & LogCat: 日志查看工具,日志貓

  & Emulator Control: 模擬器控制,模擬一些操作(打電話、發短信)

  1.3.7 Android參考文檔

  ?參考文檔

  官網:developer.android.com或本地(%ANDROID_SDK_HOME%\DOC\)

  中文參考文檔:wiki.eoe.cn

  ?SDK源碼關聯

  源碼:(%ANDROID_SDK_HOME%\source),或通過SDK Manager.exe從官網下

  & 在Eclipse中選中任一系統API,按F3或者CTRL+單擊 ,之後找到Java Source Addachment ,指定源碼位置即可

  & 選擇項目中的android.jar包,右鍵點擊屬性,之後找到Java Source Addachment,指定源碼位置即可

  二、UI控件與布局

  2.1 Activity、View、Window關系

  * android.app.Activity

  Activity是Android四大組件之一,它通過內部的成員變量Window對象來展

  示一個與用戶交互的界面,界面中的View控件捕獲事件,通過WindowManagerService傳遞消息,Android框架再回調Activity中與捕獲事件相關聯的方法,從而實現與用戶的交互。Activity扮演的是一個控制器的角色

  * android.view.View

  & View:視圖,是用戶接口組件的基本構建塊,它在屏幕中占用一個矩形區域,它是所有UI控件的基類,如一個按鈕或文本框。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的展示。

  2.2 認識常用UI控件(widget)

  Android平台提供了一套完備的、功能強大的組件化模型用於搭建用戶界面,這套組件化模型以View和ViewGroup這兩個基礎布局類為基礎。平台本身已預先實現了多種用於構建界面的View子類和ViewGroup子類,他們被分別稱為部件(widget)和布局(layout)。

  部件(widget)包括Button、TextView、EditText、ListView、CheckBox、RadioButton、Gallery、Spinner等

  2.3布局

  2.3.1 ViewGroup

  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)比例像素

  主要處理字體的大小,可以根據系統的字體自適應,推薦使用

  2.3.2布局

  布局用於定義一個用戶接口的可視結構,比如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來展示聯系人列表,通話記錄等

  2.3.3 常見的布局

  ?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,它只針對控件本身,是對該控件內部元素的修飾

  - 權重

  它是線性布局或者它的子類所特有的屬性修飾,它針對的是子控件的寬和高的設置

  先預留出沒有設置權重的控件的寬或者高,之後對相對於父控件剩余的空間(寬或者高)按權重(比例)分配

  ?FrameLayout

  幀布局被設計成在一個屏幕區域顯示一個單一的項(single item)。通常FrameLayout顯示一個單一的子控件,它支持的布局屬性不夠豐富,一般通過layout_gravity來設置子控件的位置。

  FrameLayout的子控件被繪制在一個堆棧中,最近添加進來的子控件在堆棧的頂部

  ?TableLayout

  表格布局,是LinearLayout的子類,以行和列的形式存放子控件,它通常由多個TableRow布局控件組成,TableRow由多個單元格(cell)組成,每個cell設置為View對象,表格布局的子控件可以設置權重,但是不能設置方向

  ?GridLayout

  網格布局,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結合使用,表示填滿所跨越的行或者列

  ?AbsoluteLayout

  絕對布局,子控件的位置以絕對的位置定位,子控件之間可以重疊,相對於其他布局,缺少靈活性,不建議使用

  * 常用的XML屬性:

  android:layout_x : 相對於父控件的x坐標位置

  android:layout_y : 相對於父控件的y坐標位置

  ?RelativeLayout

  相對布局,子控件的位置關系可以通過子控件與父控件、子控件與子控件來確定,子控件之間位置可以重疊,拓展性好,靈活方便,是使用最多的布局方式

  * 常用的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事件驅動機制

  一般,用戶經常會通過界面與應用交互,Android框架采用事件驅動的形式與用戶交互,那如何處理用戶界面中觸發的事件?

  可以通過從用戶交互的View設置事件監聽器的方式來實現對事件的處理,一個事件監聽器是View類中一個包含單一回調方法的接口。當注冊了監聽器的View發生了對應的監聽事件時,Android框架就會回調相應的監聽方法。

  * 常見的用戶事件

  點擊事件、選擇事件、觸屏事件、長按事件、按鍵事件

  3.1 點擊事件

  單擊事件是事件機制中最常見的事件,通過對控件綁定View.OnClickListener實現單擊事件的監聽

  3.1.1 點擊事件四種書寫方式

  & 私有類實現方式

  & 匿名內部類實現方式

  & 布局中對控件添加android:onClick

  & Activity實現監聽接口

  * 案例:對按鈕按鍵監聽

  對四個按鈕實現監聽,分別用四種不同的書寫方式實現單擊監聽事件

  * 界面設計

  * 代碼實現

  3.2 選擇事件

  3.2.1復選事件

  復選事件的監聽接口:CompoundButton.OnCheckedChangeListener

  復選控件CheckBox 有兩種狀態:選中與未選中狀態,對復選控件

  * 案例:明密文切換

  通過對CheckBox控件的復選監聽,實現對EditText內容明密文切換

  * 界面設計

  * 代碼實現

  3.2.2單選事件

  單選事件的監聽接口:RadioGroup.OnCheckedChangeListener

  RadioButton與RadioGroup組合使用才能實現單選功能

  * 案例:選擇字符集

  通過對RadioButton控件的選擇監聽,實現對字符集的選擇

  * 界面設計

  * 代碼實現

  3.2.3下拉列表選擇

  下拉事件的監聽接口:AdapterView.OnItemSelectedListener

  * 案例:城市選擇

  通過對Spinner下拉列表監聽,實現對城市的選擇

  * 界面設計

  * 代碼實現

  3.3長按與觸屏事件

  長按事件監聽接口:View.OnLongClickListener

  觸屏事件監聽接口:View.OnTouchListener

  * 案例:長按圖標設置手機桌面壁紙

  clearWallpaper:清除桌面壁紙

  setWallpaper(BitMap bitmap) :設置桌面壁紙

  設置壁紙要添加權限:

  * 代碼實現

  3.4 鍵盤事件

  Activity實現了KeyEvent.backcall接口

  onKeyDown(intkeyCode, KeyEvent event):當鍵按下去觸發

  onBackPress():當返回鍵按下去觸發 ,Activity的方法

  模擬器常見的按鍵:

  Back 返回鍵

  Home 手機屏幕桌面

  Ctrl+F11 切換模擬器橫豎屏幕

  F2 手機菜單

  F3 電話面板

  F8 手機網絡開關

  四、 Android高級UI

  4.1 ProgressBar

  ProgressBar 進度條,常用於文件下載進度顯示、系統初始化進度等,默認情況是沒有進度值的(轉圈圈)

  * 提示點:

  style="@android:style/Widget.ProgressBar.Horizontal"樣式設置

  setProgress(int) 設置當前進度值

  getProgress() 得到當前進度值

  setMax(int) 設置最大值

  案例:通過按鈕設置進度條進度

  * 界面設計:

  * 代碼實現

  4.2 RatingBar

  RatingBar 評分進度條,常用於對商品、用戶的評價,比如滿意度調查等

  * 提示點:

  setOnRatingBarChangeListener 設置監聽器

  setNumStars 設置星星的個數(設置總分)

  setStepSize 設置分數間隔

  getRating 獲得當前的分數值

  setRating 設置當前的分數值

  案例:對歐冠精彩程度打分

  * 界面設計:

  * 代碼實現

  4.3 ToggleButton

  ToggleButton:開關按鈕,它是CompoundButton的子類,實現開與關的效果,比如藍牙開關、wifi開關、聲音開關等

  * 提示點:

  - 實現的監聽接口:CompoundButton.OnCheckedChangeListener

  該接口是監聽開關按鈕狀態的改變

  - toggle() :取反操作

  - xml屬性設置

  textOn: 表示狀態為開的提示文本

  textOff: 表示狀態為關的提示文本

  案例:設置聲音開關

  * 界面設計

  * 代碼實現

  4.4 ScrollView

  ScrollView:滾屏視圖,它是FrameLayout的子類,能夠被用戶滾動的布局容器,它只能擁有一個子控件,經常應用於一個垂直方向的線性布局中。

  ScrollView只支持垂直滾動,對於需要水平滾動,則用HorizontalScollView

  4.5 ListView

  ListView 列表框,常用控件,用來顯示相同數據結構的批量數據,比如:從數據庫獲取的數據列表,從網絡解析的批量結構數據,一般都會采用ListView展示數據,系統中的設置、未接來電、通信錄等顯示可采用ListView進行展示

  用ListView展示數據的四個步驟:列表項描述、初始化數據、適配器數據裝配、設置適配器

  案例:在ListView中顯示好友列表

  * 界面設計與分析:

  * 代碼實現

  五、Android消息提示機制

  在某些情況下,可能需要你去通知用戶發生在你應用中的事件,其中一些事件需要用戶響應,有的則不需要。Android框架通過消息機制很好的完成上述的需求。

  比如:

  - 當一個事件完成時(比如保存文件),需要顯示一個簡短的消息來確認保存成功

  - 假如應用正在後台運行,且需要用戶注意,那麼該應用需要創建一個通知以方便用戶做出響應

  - 假如用戶要操作一個危險的操作,則應該創建一個對話框通知,再一次確認用戶的操作

  常見的消息提示方式有:

  - Logcat(日志貓)

  - Toast(瞬時提示)

  - Dialog(對話框)

  -Notification(通知)

  5.1 Logcat日志貓

  * 級別 :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()刷緩存輸出

  5.2 Toast瞬時提示

  Toast通知是一種浮現在屏幕上層的消息提醒,它只填充消息所需要的空間,而當前正在運行的活動仍然保持其自身的可見性和交互性。這種通知自動淡入淡出且不接受交互事件

  ?通過代碼自定義Toast

  * 代碼實現

  ?通過XML自定義Toast

  * LayoutInflate :把xml布局文件實例化為View對象

  5.3對話框

  對話框通常是一種顯示在當前活動之上的小窗口,這時候下層的活動將失去焦點,由對話框來實現與用戶的交互,常用於添加簡單的數據或對操作進一步確認等,比如刪除聯系人信息、添加類別等,但對話框不宜過多,會影響用戶體驗

  常見的對話框有:標准對話框、單選對話框、復選對話框、自定義對話框

  5.3.1標准對話框

  標准對話框是使用最多的一種對話框樣式,包含對話框圖標、標題、提示系統、確認和取消。

  * 創建標准對話框流程:

  1.生成對話框構建器對象AlertDialog.Builder

  2.設置圖標Builder.setIcon

  3.設置標題

  4.設置提示信息

  5.添加確認與取消按鈕

  6.對確認與取消按鈕中添加監聽,實現對話框的業務邏輯

  * 案例: 構建標准對話框

  * 界面設計

  * 代碼實現

  5.3.2菜單式對話框

  菜單式對話框適用於單選某個列表項或者對某項數據有幾種不同的操作等應用場景

  * 關注點:

  & Builder.setItems(items, listener):設置單選項

  items:單選項字符串數組

  listener:單選單擊監聽

  * 運用單選對話框選擇Android版本代號

  * 界面設計

  * 代碼實現

  5.3.3復選對話框

  復選對話框適用於以對話框的形式復選某個列表

  * 關注點:

  & Builder.setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, OnMultiChoiceClickListener listener):設置復選監聽

  items:復選項字符串數組

  checkedItems:復選項默認值

  listener:復選單擊監聽

  & AlertDialog.getListView(): 得到用於對話框的列表視圖—ListView

  & SparseBooleanArray: 稀疏布爾數組,用於映射整數到布爾值 ,與一般的布爾數組不同,下標可以允許有間隙,它比用HashMap映射Integers到Booleans更有效率

  & ListView.getCheckedItemPositions()得到選擇項的位置信息及其狀態 ,返回值:SparseBooleanArray

  * 運用復選對話框選擇Android版本代號

  * 界面設計

  * 代碼實現

  5.3.4自定義對話框

  系統對話框太單一,在開發中常需要自定義對話框

  * 關注點:

  & new Dialog(context,theme):以自定義的樣式構建對話框

  & Dialog.setContentView():設置對話框的布局

  & Dialog.findViewById() : 通過findViewById找到對話框布局中的控件

  * 自定義視圖,實現通過對話框輸入信息

  * 界面設計

  * 代碼實現

  5.3.5 對話框優化

  ?對話框緩存

  相同對話框每次顯示的界面都是一致的,可以通過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 的節點 添加測試類庫

  2. 設置測試環境

  3. 編寫測試類

  - 繼承AndroidTestCase

  - 獲取上下文getContext()

  - 使用斷言assertEquals()

  - 查看測試效果

  七、Android移動存儲

  各種Android移動的主要任務是處理數據,如何將需要處理和處理好的有效的存儲起來是一個亟待解決的問題,Android系統提供了非常豐富的移動存儲方案。

  * 常見移動存儲方案:

  手機內部存儲

  手機外部存儲

  SharedPreferences

  SQLite

  ContentProvider

  網絡

  7.1文件存儲

  7.1.1手機內部存儲

  手機內部存儲,默認在/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//cache目錄

  & getFilesDir() 方法用於獲取/data/data//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追加模式,在些數據的時候在已有文件後追加寫,默認是私有權限只有本應用可讀可寫

  7.1.2 外部存儲

  所有兼容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的存取

  * 界面設計

  * 代碼實現(手機內部存取)

  * 代碼實現(SDCard存取)

  7.2 SharedPreference

  SharedPreferences,是一個非常輕量的數據存儲方式,以xml的形式存取簡單的鍵值對數據,數據類型包括(ints,floats,boolean,strings,longs,Set(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.賬號密碼驗證成功,則進入另一個Activity

  2.選中復選框,則用戶登錄時,把賬戶及密碼信息存入SharedPreference

  3.應用下次啟動,依據存儲的復選框狀態值,決定是否填充賬戶與密碼信息

  4.對存入SharedPreference的值對信息加密

  * 界面設計

  * 代碼實現

  7.3 Pull解析

  XML文件是非常重要的數據格式,它可以用來作配置文件,存儲數據等,Android中可以通過SAX、DOM、PULL來解析XML數據

  7.3.1 pull解析XML文件

  * pull解析:

  Xml文件邊導入內存,邊解析,采用事件驅動機制,當解析到一個節點,返回的是該節點的事件類型,且不會繼續往下解析,需手動指向下一個節點,才能繼續往下解析,直到文檔的結尾。Android默認采用pull解析。

  * 事件類型:

  - START_DOCUMENT : 開始文檔

  - START_TAG : 開始標簽

  - END_TAG : 結束標簽

  - END_DOCUMENT : 結束文檔

  7.3.2 pull生成XML文件

  ?案例:用pull解析及生成XML文件

  * 界面設計

  * 代碼實現 (pull解析)

  * 代碼實現 (用pull生成xml)

  7.4 Sqlite數據庫

  在Android平台上,集成了一個嵌入式關系型數據庫—SQLite,它是一種非常輕量的數據庫管理系統,SQLite3支持NULL、INTEGER、REAL(浮點數字)、TEXT(字符串文本)和BLOB(二進制對象)數據類型,SQLite通過文件來保存數據庫,一個文件就是一個數據庫

  * 常用類介紹

  & SQLiteOpenHelper

  數據庫輔助抽象類,通過實現它的子類可以創建數據庫以及實現版本更新,通過getWriteableDatabase獲得getReadableDatabase獲取數據庫訪問類

  & SQLiteDatabase:數據庫訪問類

  通過數據庫訪問類,可以實現對數據庫的增刪改查等操作

  7.4.1 Android創建Sqlite數據庫

  SQLite數據庫是在第一次調用的時候創建數據庫的

  創建數據庫的步驟:

  1.定義一個db輔助類,繼承SQLiteOpenHelper抽象類,通過構造方法設置數據庫名及版本信息

  2. 重寫onCreate()方法,該方法只會在數據庫第一次創建的時候調用,在此方法中適合做數據庫初始化操作,比如創建數據表等

  3. 重寫onUpGrade() ,當數據庫版本更新時調用,適合做表結構的修改或者添加刪除表

  * 參考代碼:

  7.4.2 SQLite數據庫增刪改查

  * 添加記錄

  * 刪除記錄

  * 查詢

  * 更新記錄

  7.4.3 SQLite事務處理

  7.5內容提供者

  7.5.1內容提供者特點介紹

  & Android四大組件之一,沒有圖形界面

  & 共享數據給第三方應用程序,統一數據訪問方式

  & 線性安全,Android系統為每個ContentProvider提供一個實例(單列模式),通過ContentResolver訪問ContentProvider

  7.5.2 ContentProvider實現流程

  1. 准備需要共享的數據,一般是sqlite數據

  2. 創建一個類,繼承ContentProvider,實現第三方應用訪問數據的方法(增刪改查)

  3. 在AndroidManifest.xml進行注冊,並且設置android:autorities屬性:認證(在系統中該內容提供者的唯一標識)

  4. 第三方應用訪問ContentProvider, 通過Context.ContentResolver(內容訪問者)進行訪問,比如:ContentResolver.insert(Uri,ContentValues);

  7.5.3 常用API介紹

  * 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

  八、菜單設計

  8.1選擇菜單

  一個Activity最多只能擁有一個選擇菜單,當選擇菜單第一次訪問的時候創建,該Activity銷毀沒有銷毀的情況下,只創建一次

  * 創建選擇菜單

  onCreateOptionsMenu(Menu menu)

  * 監聽選擇菜單

  onOptionsItemSelected(MenuItem item)

  8.2上下文菜單

  一個組件可以綁定一個上下文菜單,上下文菜單每次彈出,都會重新創建一次

  * 注冊上下文菜單

  注冊上下文菜單的兩種寫法

  //registerForContextMenu(bookList);

  // bookList.setOnCreateContextMenuListener(this);

  * 創建上下文菜單

  & onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)

  參數:menu:要創建的上下文菜單

  v: 選擇項的視圖(ListView的Item)

  menuInfo: 額外的菜單信息,依賴於選擇的視圖(V)

  & 獲取彈出上下文菜單的選項視圖信息

  //通過適配器上下文菜單信息類來獲取 被選中的菜單項的數據信息

  AdapterContextMenuInfoadapterInfo=(AdapterContextMenuInfo) menuInfo;

  * 監聽上下文菜單

  onContextItemSelected(MenuItem item)

  //通過適配器上下文菜單信息類來獲取 被選中的菜單項的數據信息

  AdapterContextMenuInfoadapterInfo=(AdapterContextMenuInfo) item.getMenuInfo();

  8.3 操作條(ActionBar)

  * 1.Action Bar特點

  操作欄在Android 3.0版本以後出現,是一個窗口功能用於確定應用程序和用戶的位置,並提供給用戶操作和導航模式。Action Bar被認為是新版Android系統中重要的交互元素

  * 2、Action Bar分成四個區域

  - App Icon:可顯示軟件icon,也可用其他圖標代替。當軟件不在最高級頁面時,圖標左側會顯示一個左箭頭,用戶可以通過這個箭頭向上導航。

  - 視圖切換:如果你的應用要在不同的View中顯示數據,這部分允許用戶來切換View。一般的作法是用一個drop-down菜單或者是Tab Controls。如果只有一個界面,那這裡可以顯示App Title或者更長點的商標信息

  - Action Buttons:這個放最重要的軟件功能,放不下的按鈕就自動進入Action overflow了。

  - Action overflow:把不常用的Actions移到Action overflow

  * 3、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.再來看publicView getView(intposition, View convertView, ViewGroup parent)中的convertView參數,這個是系統幫我們傳遞進來的,它就代表當前可循環利用的ItemView

  4.注意:雖然性能有提升,但是在渲染item的時候,一定保證當前item要完全覆蓋可循環利用item的數據,因為循環利用item可能會造成舊數據殘留。

  十、Intent意圖

  Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。因此,Intent在這裡起著一個媒體中介的作用,專門提供組件互相調用的相關信息,實現調用者與被調用者之間的解耦。

  10.1 Intent表現形式

  * 調用Activity: startActivity(intent) startActivityForResult(Intent)

  * 調用Service:服務startService(intent)\bindService(intent)綁定服務

  * 發送廣播 :sendBroadcast(intent)發送無序廣播

  sendOrderedBroadcast(Intent)發送有序廣播

  10.2 Intnet屬性設置

  * 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

  * 案例:在本應用中實現網站的浏覽

  10.3 顯式意圖與隱式意圖

  * 顯示調用是直接指定類名,Android不用再去解析intent

  * 隱式調用需要設置action、data、category、type,再有Android解析你的意圖

  對於本應用中的組件要實現隱式調用,需要在AndroidManifest.xml中配置

  * 案例:顯示調用第三方應用Activity組件

  10.4 Intent附帶數據

  * 兩種寫法 :

  & 通過Intent.putExtra(key,value)添加

  & 通過bundle添加

  * 添加額外數據

  * 在目標組件中獲取上一個組件傳遞過來的額外數據

  十一、Activity活動

  11.1 Activity特點介紹

  活動,四大組件之一,也是最重要的組件,它通過內置的Window對象來展示一個與用戶交互的界面,它的操作都與用戶有關,一般一個布局針對於一個Activity界面

  View控件捕獲事件信息,WindowManagerService傳遞消息,再由Android框架回調Activity的相應監聽方法實現與用戶的交互

  11.2 開始Activity以及得到返回結果

  * startActivity(Intent) :開啟一個新的Activity,它將放到活動棧的棧頂

  * startActivityForResult(Intent,int) :開啟一個新的Activity,當新的Activity結束時,通過setResult(int,Intent)把結果回傳給調用者,調用者通過onActivityResult()處理回傳結果

  * 案例:設置圖像視圖控件的前景圖片

  點擊圖像視圖控件,進入圖片浏覽界面,把選定好的圖片作為圖像視圖控件的前景圖片

  * 參考代碼

  11.3 Activity生命周期

  應用中的活動是由活動棧進行管理的,當一個新的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則相反

  11.4 Activity管理及啟動模式

  對Activity實例的管理: 通過任務棧的形式來管理(TaskStack)

  * standard :標准模式(每次激活,都會創建一個Activity實例)

  * singleTop :棧頂模式 :假如要激活的Activity它的實例剛好在棧頂的話,就不用再重新創建

  * singleTask: 單任務模式 : 假如任務棧有該Activity的實例,就不需要重新創建,因為該Activity要與用戶交互,所有在該Activity實例前面的Activity都會彈出堆載

  * singleInstance: 單實例模式 :主要用於實例共享,會單獨開辟一個任務棧來存放該實例,比如浏覽器的Activity

  11.5 onSaveInstanceState()和onRestoreInstanceState()

  Activity的 onSaveInstanceState()和 onRestoreInstanceState()並不是生命周期方法,它們不同於onCreate()、onPause()等生命周期方法,它們並不一定會被觸發,當Activity容易被銷毀時(如:內存不足、用戶直接按Home鍵、跳轉到下一個Activity、屏幕切換(橫豎屏))onSaveInstanceState()才會被調用。但是當用戶主動去銷毀一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被調用。因為在這種情況下,用戶的行為決定了不需要保存Activity的狀態。通常onSaveInstanceState()只適合用於保存一些臨時性的狀態,而onPause()適合用於數據的持久化保存。

  需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調用的,onRestoreInstanceState被調用的前提是,activity“確實”被系統銷毀了

  11.6 Activity程序響應性

  在Android中,應用的響應性被活動管理器(Activity Manager)和窗口管理器(Window Manager)這兩個系統服務所監視。當用戶觸發了輸入事件(如鍵盤輸入,點擊按鈕等), 如果應用5秒內沒有響應用戶的輸入事件,那麼,Android會認為該應用無響應,便彈出ANR(Application No Response)對話框

  在正常情況下,Android程序會在一條單線程裡運行。如果Activity要處理一件比較耗時的工作,應該交給子線程完成,否側會因為主線程被阻塞,後面的用戶輸入事件因沒能在5秒內響應,導致應用出現ANR對話框。

  十二、Android廣播機制

  當遇到這些問題:電池低、網絡斷網、下載完成或某個圖片被捕獲,想通知你的用戶,那該怎麼辦?

  在Android平台中, 通過廣播機制能很好解決這些問題,當遇到某些系統事件時,比如收到短信、電量偏低等,就會以廣播的形式發送事件消息,並且Android框架會自動喚醒訂閱了該廣播事件類型的廣播接收器來處理,處理完畢後,Receiver馬上退出。

  Android廣播機制的特點:

  1. 發送者不必關心接受者的情況,發送者與接收者完全的解耦

  2. 廣播事件是系統級別的事件,而我們開發的應用的事件(比如控件的點擊事件),它是屬於應用級別的事件

  3. 系統內置了大量的廣播事件,訂閱系統的廣播事件可以豐富我們應用的功能

  4. 廣播機制主要解決的是應用程序之間通信的功能

  12.1 Android廣播接收器

  * 特點:

  1. Android四大組件之一,是唯一可以動態注冊的組件

  2. 沒有圖形界面,能夠自啟動,在主線程運行

  3. BroadcastReceiver組件生命周期比較短,10秒左右,執行完組件的onReceive()方法後後會立即銷毀,所以廣播接收器組件應該扮演一個網關的角色,只作簡單的信息處理,比如發通知或者Toast;對於復雜的業務應該開啟一個Service或者在另一個應用中去完成業務

  * 運行流程

  首先把要發送的信息及動作封裝在Intent中,由系統事件機制觸發廣播(比如:日期改變、電池電量低、網絡斷網、收到短信等)或者自己通過Content.sendBroadcast(Intent)發送廣播。當Intent發送以後,系統依據發送的Intent信息與已經注冊的廣播接收器組件進行匹配,若匹配成功,則實例化相應的BroadcastReceiver組件,調用onReceive(Context curContext, Intent broadcastMsg)方法,運行完畢,銷毀廣播組件。

  12.2自定義廣播接收器

  * 自定義廣播接收器實現流程

  1. 定義類,繼承BroadcastReceiver,並重寫onReceive()方法

  2. 在AndroidManifest.xml注冊廣播接收器

  3. 訂閱廣播事件

  * 案例:自定義能監聽日期改變的廣播接收器

  * 參考代碼

  12.3無序廣播與有序廣播

  * 無序廣播

  所有的廣播接收器運行在一個未定義的順序,不能屏蔽結果,不能修改廣播, 無法終止廣播 ,可通過Context.sendBroadcast發送無序廣播

  * 有序廣播:

  有序廣播在同一時間傳送到一個接收器。由於每個接收器依次執行,它可以結果傳播到下一個接收器,或者它可以完全中止的廣播,需定義優先級優 先級別在 intent-filter 中的 priority中聲明 ,-1000到1000之間 ,值越大 ,優先級越高 .接收者可以截斷廣播等,可通過Context.sendOrderBroadcast發送有序廣播。

  android:priority:設定廣播接收器的優先級

  abortBroadcast() :截斷廣播、終止廣播傳遞

  * 案例 :短信監聽器

  * 要求:

  1.該應用沒有界面,也不能在手機應用程序列表中出現

  2.能夠獲取短信內容及發信人電話號碼

  3.實現自動回復功能

  4.截斷短信,系統提供的短信接收器組件不能收到短信

  * 參考代碼

  12.4 動態注冊廣播接收器

  * 應用場景

  通過AndroidManifest.xml注冊廣播接收組件,只有當該應用在Android系統中刪除才能夠注銷廣播接收組件。有時需要當應用運行時注冊廣播接收組件,而應用退出時,注銷該廣播接收組件,該如何解決?

  可以對廣播接收組件實現動態注冊,廣播接收器也是唯一可以動態注冊的Android組件,一般在Activity的onStop()注冊廣播接收組件,在onResume()中注銷廣播接收組件。

  * 案例:對監聽日期改變的廣播接收器組件實現動態注冊

  * 參考代碼

  12.5廣播通知

  Notification 是一條顯示在應用UI界面之外的通知,一條通知到來時,它首先顯示在通知欄中,當對通知往下拉放時,會顯示通知的詳細信息,當對通知的詳細信息框進行點擊時,則可通過Intent激活其他組件,實現業務處理。

  Notification是Android非常重要的消息提示機制,常與廣播接收器組合使用,實現廣播通知,比如:短信通知、軟件更新通知等

  12.6 Android4.0以後版本的廣播機制問題

  在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),即包含停止狀態的包也能夠被激活,你的廣播接收器應用訂閱了系統的廣播事件,同時也訂閱了自定義的廣播事件,這樣就能夠激活處於停止狀態的廣播接收器組件

  十三、Service服務

  四大組件之一,需要注冊、沒有圖形界面,生命周期長、不能自啟動,需要startService或者bindService來啟動服務,默認在主線程運行

  主要用於實現生命周期較長的操作,比如:打印服務、下載服務、音樂服務、更新服務

  13.1 Android進程等級

  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的進程,保留這個進程主要是為了緩存的需要,這種進程存在的唯一原因是做為緩存以改善組件再次於其中運行時的啟動時間

  服務生命周期圖

  13.2全局服務

  一旦服務開啟,那麼調用者和服務就沒有任何關系了,因此哪怕調用者被destroy了

  那麼服務依舊在運行。且不能調用服務內部中的方法。

  * 啟動

  startService(Activity方法) -->onCreate(Service的生命周期方法,當服務不存在調用,用於初始化服務)-->onStartCommand(Service的生命周期方法)

  * 交互

  startService(Activity方法)-->onStartCommand(intent) :通過Intent附加數據進行交互

  * 關閉

  stopService(Activity方法)-->onDestroy(服務的生命周期方法)

  13.3綁定服務

  一旦服務開啟,那麼調用者和服務就有密切關系了,如果所有客戶端被destroy了

  那麼服務也就會被destroy。且可以調用服務內部中的方法。調用者被銷毀前,需要對綁定的服務解綁。

  * 啟動:bindService(Activity方法) -->onCreate(Service為空調用)-->onBind()

  * 交互:直接在Activity中拿到Service的實例或者Service的代理對象進行操作

  * 關閉:unBindService(Activity方法)-->OnUnbind()-->ondestroy()

  案例:通過Service實現音樂播放

  13.4 IntentService

  這是一個Service的子類,該子類使用線程處理所有啟動請求,.你需要做的只是實現onHandleIntent()方法即可.依據Intent的請求指令執行相應的業務。

  * 流程介紹:

  1. 從應用的主線程當中創建一個默認的線程執行所有的intents發送給onStartCommand()方法,該線程從主線程分離.

  2. 創建工作隊列,每次傳遞一個intent給onHandleIntent()方法實現,不必擔心多線程.

  3. 所有的請求被處理後服務停止,所以你永遠都不必調用stopSelf()函數.

  4. 默認實現onBind()方法返回null.

  13.5 AIDL實現IPC(進程間通信)

  Android Interface Definition Language(Android接口定義語言)

  由於Android沒有一個進程間共享的內存區域,通過AIDL可以實現進程間的通信

  AIDL實現IPC的流程:

  1. 在遠程服務端定義aidl文件 ,定義好比接口定義,系統工具會自動生成相應的java接口

  2. 在服務端的Service中繼承該接口的Stub類,作為遠程服務的代理對象

  3. 在客戶端中先拷貝服務端的aidl文件,並且放在與服務端包名一致的包下面

  4. 在客戶端通過ServiceConnetion來獲得遠程服務的代理對象,實現遠程進程通信

  5. 在服務端對Service設置IntentFileter,用於遠程組件的調用

  6. AIDL是線性安全的,由框架來維護其線性安全

  十四 Android 新特性

  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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved