Android面試準備

一怠褐、簡歷準備

1、個人技能

(1)自定義控件您宪、UI設計奈懒、常用動畫特效
    1. 自定義控件

①為什么要自定義控件?

Android本身提供了很多控件宪巨,但是這些控件并不能滿足我們所有的要求磷杏,現(xiàn)在用戶的要求越來越高圃酵,這就要求我們做出的軟件除了功能要齊全外上鞠,還要給用戶比較炫比較人性化的體驗凯旋,這個時候就需要我們自定義控件來提高用戶體驗腾供。
現(xiàn)在用戶體驗是炒得比較火的一個概念拉盾,各大網站各個軟件都在說提高用戶體驗赴捞。
Android中的控件都是繼承自View類可很,通過重寫onDraw方法來繪制我們所需的控件睛驳。

②如何實現(xiàn)自定義控件蒜田?

實現(xiàn)自定義控件的兩種方式:
第一是繼承已有控件稿械,通過重寫相關方法來實現(xiàn)我們的需求
第二是繼承View類或者ViewGroup類來繪制我們需要的控件
注:一般來講,通過繼承已有的控件來實現(xiàn)自定義控件簡單一點冲粤,開發(fā)中常用繼承已有控件來實現(xiàn)自定義控件美莫。

③ListView:

a、ListView的作用是什么梯捕?
顯示數據
b厢呵、ListView如何用?
首先要給ListView設置一個適配器Adapter,把要顯示的數據交給適配器Adapter去處理傀顾,
另外ListView的getView方法每被調用一次顯示一個條目襟铭,都伴隨著一個舊的條目被移除,故為了優(yōu)化ListView,可以在getView()方法中重用舊條目convertView
還有ListView的getView方法中每執(zhí)行一次findViewById方法時蝌矛,都會加載相應布局的樹狀結構道批,再遍歷該樹狀結構找到指定id,當該布局的樹狀結構很復雜時入撒,每次都查找id會比較麻煩隆豹,所以為了優(yōu)化我們可以提供一個ViewHolder類,用來記錄布局中的所有控件茅逮,這樣布局中的控件id只需查找一次璃赡,再用時,直接在ViewHolder類里面取最后用ListView顯示大數據時献雅,還需要進行分批加載或分頁顯示處理.

    1. 動畫特效:

①動畫的分類:

安卓中的動畫分為兩種碉考,一種是幀動畫(Frame),一種是漸變動畫(Tweened) , 漸變動畫又分為四種動畫類型挺身,Alpha侯谁、Scale、Translate和Rotate

(2)網絡數據傳輸章钾,熟悉多線程墙贱、Socket網絡編程、熟悉TCP贱傀、UDP惨撇、HTTP等協(xié)議
    1. 網絡編程概述:

①網絡模型:

OSI模型
應用層
表示層
會話層
傳輸層
網絡層
數據連接層
物理層
TCP/IP模型
應用層
傳輸層
網際層
主機至網絡層

②網絡通訊要素

IP地址
端口號
傳輸協(xié)議

③網絡通訊前提:

找到對方IP
數據要發(fā)送到指定端口。為了標示不同的應用程序府寒,所以給這些網絡應用程序都用數字進行標示這個表示就叫端口
定義通信規(guī)則魁衙。這個規(guī)則稱為通信協(xié)議,國際組織定義了通用協(xié)議TCP/IP

    1. Android網絡應用的概述:
      Android完全支持JDK本身的TCP株搔、UDP網絡通信API剖淀,可以使用Socket、ServerSocket來建立基于TCP/IP協(xié)議的網絡通信;
      也可以使用DatagramSocket/Datagrampacket來建立基于UDP協(xié)議的網絡通信邪狞。
      同時Android還支持JDK提供的URL祷蝌、URLConnection等網絡通信的API。
    1. TCP和UDP的區(qū)別:

①UDP協(xié)議:

面向無連接
每個數據報的大小在限制在64k內
因為是面向無連接帆卓,所以是不可靠協(xié)議
不需要建立連接,速度快

②TCP協(xié)議:

必須建立連接米丘,形成傳輸數據的通道
在連接中可進行大數據量傳輸
通過三次握手完成連接剑令,是可靠協(xié)議
必須建立連接,效率會稍低
注:三次握手:
第一次:我問你:在么拄查?
第二次:你回答:在吁津。
第三次:我反饋:哦,我知道你在。

    1. Socket:
      **Socket就是為網絡服務提供的一種機制
      **通信的兩端都有Socket
      **網絡通信其實就是Socket間的通信
      **數據在兩個Socket間通過IO傳輸
      **玩Socket主要就是記住流程碍脏,代碼查文檔就行
    1. UDP(User Datagram Protocol):用戶數據協(xié)議

①UDP概述:

需要DatagramSocket與DatagramPacket對象來實現(xiàn)UDP協(xié)議傳輸數據
UDP協(xié)議是一種面向無連接的協(xié)議梭依。面向無連接的協(xié)議指的是正式通信前不必與對方先建立連接,不管對方連接狀態(tài)就直接發(fā)送數據典尾。

②UDP協(xié)議開發(fā)步驟:

**發(fā)送端:
建立DatagramSocket服務役拴;
提供數據,并將數據封裝到字節(jié)數組中钾埂;
創(chuàng)建DatagramPacket數據包河闰,并把數據封裝到包中,同時指定接收端IP和接收端口
通過Socket服務褥紫,利用send方法將數據包發(fā)送出去姜性;
關閉DatagramSocket和DatagramPacket服務。
**接收端:
建立DatagramSocket服務髓考,并監(jiān)聽一個端口部念;
定義一個字節(jié)數組和一個數據包,同時將數組封裝進數據包氨菇;
通過DatagramPacket的receive方法印机,將接收的數據存入定義好的數據包;
通過DatagramPacke關閉的方法门驾,獲取發(fā)送數據包中的信息射赛;
關閉DatagramSocket和DatagramPacket服務。

③UDP協(xié)議的Demo(必須掌握):

****發(fā)送端:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

class UDPSend {
    public static void main(String[] args) throws Exception {
        DatagramSocket ds = new DatagramSocket();
        byte[] buf = "這是UDP發(fā)送端".getBytes();
        DatagramPacket dp = new DatagramPacket(buf, buf.length,
                InetAddress.getByName("192.168.1.253"), 10000);
        ds.send(dp);
        ds.close();
    }
}

****接收端

import java.net.DatagramPacket;
import java.net.DatagramSocket;

class UDPRece {
    public static void main(String[] args) throws Exception {
        DatagramSocket ds = new DatagramSocket(10000);
        byte[] buf = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        ds.receive(dp);// 將發(fā)送端發(fā)送的數據包接收到接收端的數據包中
        String ip = dp.getAddress().getHostAddress();// 獲取發(fā)送端的ip
        String data = new String(dp.getData(), 0, dp.getLength());// 獲取數據
        int port = dp.getPort();// 獲取發(fā)送端的端口號
        System.out.print(ip + ":" + data + ":" + port);
        ds.close();
    }
}                   

注:協(xié)議的概念和作用:
什么是協(xié)議奶是? 網絡通信的一種規(guī)則
協(xié)議的作用楣责? 保證通信兩端實現(xiàn)網絡通信

    1. TCP/IP協(xié)議:Socket和ServerSocket

①基于TCP協(xié)議的網絡通信概述:

TCP/IP通信協(xié)議是一種必須建立連接的可靠的網絡通信協(xié)議。它在通信兩端各建立一個Socket,從而在通信的兩端之間形成網絡虛擬鏈路聂沙。
網絡虛擬鏈路一旦建立秆麸,兩端的程序就可以進行通信。

②TCP/IP協(xié)議開發(fā)步驟:

**客戶端:
建立Socket服務及汉,并指定要連接的主機和端口沮趣;
獲取Socket流中的輸出流OutputStream,將數據寫入流中坷随,通過網絡發(fā)送給服務端房铭;
獲取Socket流中的輸出流InputStream,獲取服務端的反饋信息温眉;
關閉資源缸匪。
**服務端:
建立ServerSocket服務,并監(jiān)聽一個端口类溢;
通過ServerSocket服務的accept方法凌蔬,獲取Socket服務對象;
使用客戶端對象的讀取流獲取客戶端發(fā)送過來的數據;
通過客戶端對象的寫入流反饋信息給客戶端砂心;
關閉資源

③TCP/IP協(xié)議的一個Demo(必須要掌握懈词!):

客戶端:

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

class TCPClient {
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("192.168.1.253", 10000);
        OutputStream os = s.getOutputStream();
        os.write("這是TCP發(fā)送的數據".getBytes());
        s.close();
    }
}

服務端:

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10000);
        Socket s = ss.accept();

        String ip = s.getInetAddress().getHostAddress();
        System.out.print(ip);

        InputStream is = s.getInputStream();
        byte[] buf = new byte[1024];
        int len = is.read(buf);
        System.out.print(new String(buf, 0, len));
        s.close();
        ss.close();
    }
}
    1. HTTP協(xié)議:

    a、HTTP是Hyper Text Transfer Protocol的縮寫
    b辩诞、是由W3C制定和維護的坎弯。目前版本為1.0和1.1
    c、是開發(fā)web的基石躁倒,非常地重要
    d荞怒、 1.0版本:是無狀態(tài)的協(xié)議,即一次連接只響應一次請求秧秉,響應完了就關閉此次連接,要想再訪問須重新建立連接褐桌。而連接都是比較耗資源的。
    1.1版本:是有狀態(tài)的協(xié)議象迎。即可以在一次網絡連接基礎上發(fā)出多次請求和得到多次的響應荧嵌。
    當距離上次請求時間過長時,服務器會自動斷掉連接砾淌,這就是超時機制啦撮。

①HTTP協(xié)議的組成:
請求部分:

請求行:GET / HTTP/1.1 包含:請求方式GET 請求的資源路徑:/ 協(xié)議版本號:HTTP/1.1
請求方式。常用的有GET汪厨、POST
GET方式:默認方式赃春。直接輸入的網址。
表單數據出現(xiàn)在請求行中劫乱。url?username=abc&password=123
特點:不安全织中;有長度限制:<1k
POST方式:可以通過表單form method="post"設置
表單數據會出現(xiàn)在正文中。
特點:安全衷戈;沒有長度限制
請求消息頭:
請求正文:第一個空行之后的全部都是請求正文

響應部分:

響應行:HTTP/1.1 200 OK 包含:協(xié)議版本號:HTTP/1.1 響應碼:200 描述:OK
響應碼:(實際用到的30個左右,其他都是W3C保留的)
描述:對響應碼的描述
常用響應碼:
200:一切正常
302/307:請求的資源路徑變更了
304:資源沒有被修改過
404:資源不存在,找不到資源
500:服務器程序有錯
響應消息頭:
響應正文:第一個空行之后的全部都是響應正文狭吼,瀏覽器顯示的就是正文中的內容

    1. 網絡通信中加入多線程:

①TCP/IP協(xié)議:

實際應用中,服務端需要不斷的讀取客戶端數據和寫入數據到客戶端;而客戶端也需要不斷的讀取服務端數據和寫入數據到服務端殖妇。
當使用傳統(tǒng)的BufferedReader的readLine()方法讀取數據時刁笙,由于該方法是阻塞式方法,故當該方法成功返回之前谦趣,線程被阻塞疲吸,程序無法繼續(xù)執(zhí)行。居于此蔚润,服務器應該為每個Socket單獨開啟一條線程磅氨,每個線程負責與一個客戶端進行通信。
客戶端應該包含兩條線程嫡纠,一條負責生產主界面、相應用戶動作并將用戶輸入的數據寫入到Socket對應的輸出流中,另一條負責讀取Socket對應輸入流中從服務器端發(fā)送過來的數據,并負責將這些數據在主界面上顯示除盏。
使用NIO實現(xiàn)非阻塞Socket通信(JDK 1.4以后開始):使用NIO API可以讓服務器端使用一個或者有限個線程來同時處理連接到服務端的所有客戶端叉橱,如多人聊天室
使用AIO(Asynchronous IO)實現(xiàn)非阻塞通信(JDK 1.7開始):通過支持異步Channel來實現(xiàn)

②多線程應用:

a、多線程的作用:提高效率
b者蠕、多線程的應用:
多線程下載:
創(chuàng)建URL對象
獲取指定URL對象所指向的資源的大小(getConnectionLength())
在本地磁盤上創(chuàng)建一個與網絡資源大小相同的空文件:RandomAccessFile.setLength()
計算每條線程應該下載網絡資源的哪個部分(從哪個字節(jié)開始到哪個字節(jié)結束)
依次創(chuàng)建窃祝、啟動多線程來下載網絡資源的指定部分
//執(zhí)行如下代碼設置請求頭,確定指定線程下載的部分;如果不設置該頭踱侣,則每個線程都從頭下載到末尾
HttpURLConnection.setRequestProperty("Range","bytes="+start+"-"+end);
多線程斷點續(xù)傳下載:開始下載時粪小,判斷是否是新的下載任務
如果是,從頭開始下載
如果不是抡句,找到上次下載完成多少探膊,繼續(xù)下載
下載過程中記錄每條線程的下載進度,同時下載多少就寫多少到本地待榔,并且每次向文件中寫入數據之后逞壁,在數據庫中更新下載進度下載完成之后刪除數據庫中下載記錄

    1. 網絡通信中的URL編程:

①URL概述:

URL(Uniform Resource Locator)對象代表統(tǒng)一資源定位器,是指向網絡資源的指針锐锣。網絡資源可以是簡單的文件或者目錄腌闯,也可以是復雜的對象的引用,例如對數據庫或搜索引擎的查詢雕憔。

②URL組成:由協(xié)議名姿骏、主機、端口和資源路徑組成斤彼。如Http://localhost:8080/BookShop/index.jsp
③URL的應用:

使用URL訪問網絡資源:
使用URLConnection提交請求:
通過URL.openConnection()創(chuàng)建URLConnection對象
設置URLConnection對象的參數和普通請求屬性
發(fā)送GET或者POST請求
使用HttpURLConnection訪問網絡資源:

(3)Handler消息傳遞機制和Android下的消息推送機制:
    1. Handler消息傳遞機制:

①Handler概述:

Handler是界面刷新機制
Handler是用來解決Android應用多線程間通信問題分瘦,主線程和子線程之間通信問題
Android系統(tǒng)不允許Activity新啟動的線程訪問該Activity里面的界面組件。這就導致新啟動的線程無法動態(tài)改變
該界面組件的屬性值畅卓。即主線程創(chuàng)建View,但無法獲取數據;新線程有數據擅腰,但無法修改View。Handler消息傳遞機制就可以解決此類問題翁潘。

②Handler的作用:

a趁冈、Handler用在一個線程中,Handler的作用就是實現(xiàn)異步操作拜马;
b渗勘、Handler用在不同線程中,Handler的作用就是實現(xiàn)異步操作和實現(xiàn)線程間通信俩莽。

③Handler和Looper的關系:

a旺坠、Handler主要是用來發(fā)送和處理消息,但是發(fā)送了消息后扮超,消息是怎么傳遞的呢取刃?
這就是Looper的作用了蹋肮,每個Handler內部都會封裝一個Looper對象,如果在創(chuàng)建Handler的時候不指定Looper對象璧疗,系統(tǒng)就會默認將當前線程的Looper綁定到Handler上坯辩,Looper對象中維護者一個消息隊列,Handler發(fā)送的消息都會存儲到這個消息隊列中崩侠,Looper不斷的遍歷這個消息隊列漆魔,取出消息,交給handleMessage方法處理却音,Looper屬于哪個線程改抡,hadleMessage方法就會在那個線程中執(zhí)行。
b系瓢、Looper對象的作用:Looper負責管理線程的消息隊列和消息循環(huán)
**主線程的Looper對象:當在主線程中使用Handler的時候阿纤,不用指定Looper,因為在主線程開啟的時候八拱,就已經調用了Looper.loop()方法開始輪詢了阵赠。通過Handler.getLooper()可獲取當前主線程的Looper對象
主線程可通過Looper對象給子線程發(fā)送消息
**子線程的Looper對象:在子線程中使用Handler的時候,通過調用Looper的prepare方法創(chuàng)建存儲Looper對象肌稻,還得調用Looper.loop()方法開啟輪詢清蚀。
一個線程可以存在(當然也可以不存在)一個消息隊列和一個消息循環(huán)(Looper),特定線程的消息只能分發(fā)給本線程爹谭,不能進行跨線程枷邪、跨進程通訊。但是創(chuàng)建的工作線程默認是沒有消息循環(huán)和消息隊列的诺凡,如果想讓該線程具有消息隊列和消息循環(huán)斗遏,需要在線程中首先調用Looper.prepare()來創(chuàng)建消息隊列勤讽,然后調用Looper.loop()進入消息循環(huán)悲酷。
注:Android中除了進度條言询,其他View在創(chuàng)建該View的線程中修改。

④Handler如何使用:

Handler的使用需要四個對象配合使用:Handler凉袱、Looper芥吟、Message和Thread

⑤Handler和AsyncTask的區(qū)別:

a、相同點:AsyncTask和Handler都能通過主線程和子線程之間的通信更新主界面
b专甩、不同點:Handler比較麻煩钟鸵,而AsyncTask使任務更加方便,而且AsyncTask過程可控;
對于多個后臺任務時涤躲,使用Handler代碼結構清晰簡單棺耍;而使用多個AsyncTask時容易發(fā)生異常。

    1. Android下的消息推送機制:

①消息推送機制概述:

當我們開發(fā)和服務器交互的應用時种樱,基本上都需要獲取服務端的數據蒙袍,這就需要消息推送機制來實現(xiàn)俊卤。

②獲取服務器上不定時更新的信息的兩種方式:

第一種是客戶端使用Pull(拉)的方式,客戶端每隔一段時間去服務端獲取信息左敌,看是否有更新的信息瘾蛋,有就獲取
第二種是服務端使用Push(推)的方式俐镐,服務端更新數據了矫限,就把更新的數據Push到客戶端
注:雖然Pull和Push方式都能實現(xiàn)獲取服務端更新的數據的功能,但明顯的Push方式比Pull更節(jié)省用戶的流量和電量

③消息推送解決方案:

****輪循Pull : 應用程序階段性的與服務器進行連接并查詢是否有新消息
缺陷:要考慮輪詢的頻率佩抹,如果太慢可能導致某些消息的延遲叼风,如果太快,則會大量消耗網絡帶寬和電池
****SMS Push: 通過攔截SMS消息并且解析消息內容來了解服務器的意圖
缺陷:成本相對比較高棍苹,你很難找到免費的短消息發(fā)送網關
****持久連接Push : 缺陷:很難在手機上實現(xiàn)一個可靠的服務无宿,并且非常消耗手機的電池

④消息推送服務:

****C2DM(Cloud to Device Messaging)服務:
C2DM是Google提供的消息推送服務,是一個簡單的枢里、輕量級的機制孽鸡,允許服務器可以通知移動應用程序直接與服務器進行通信以便于從服務器獲取應用程序更新和用戶數據。
C2DM服務負責處理諸如消息排隊等事務并向運行于目標設備上的應用程序分發(fā)這些消息栏豺。
C2DM服務的問題:C2DM內置于Android的2.2系統(tǒng)上彬碱,無法兼容老的1.6到2.1系統(tǒng)
C2DM需要依賴于Google官方提供的C2DM服務器,由于國內的網絡環(huán)境奥洼,這個服務經常不可用巷疼,如果想要很好的使用,我們的App Server必須也在國外灵奖,這個恐怕不是每個開發(fā)者都能夠實現(xiàn)的
****MQTT協(xié)議實現(xiàn)Android推送:MQTT是一個輕量級的消息發(fā)布/訂閱協(xié)議嚼沿,它是實現(xiàn)基于手機客戶端的消息推送服務器的理想解決方案
wmqtt.jar 是IBM提供的MQTT協(xié)議的實現(xiàn)
****RSMB實現(xiàn)推送:Really Small Message Broker (RSMB) ,他是一個簡單的MQTT代理瓷患,同樣由IBM提供
****XMPP協(xié)議實現(xiàn)Android推送:
Google官方的C2DM服務器底層也是采用XMPP協(xié)議進行的封裝
XMPP(可擴展通訊和表示協(xié)議)是基于可擴展標記語言(XML)的協(xié)議骡尽,它用于即時消息(IM)以及在線探測。
這個協(xié)議可能最終允許因特網用戶向因特網上的其他任何人發(fā)送即時消息
androidpn是一個基于XMPP協(xié)議的java開源Android push notification實現(xiàn)
注:XMPP協(xié)議實現(xiàn)Android推送的最大優(yōu)勢就是簡單擅编,我們不需要象C2DM那樣依賴操作系統(tǒng)版本攀细,也不會擔心某一天Google服務器不可用。
利用XMPP協(xié)議我們還可以進一步的對協(xié)議進行擴展沙咏,實現(xiàn)更為完善的功能辨图。采用這個方案,我們目前只能發(fā)送文字消息肢藐,不過對于推送來說一般足夠了故河,因為我們不能指望通過推送得到所有的數據

    1. 多線程間通信

①進程和線程以及多線程的概念:

進程:正在進行的程序。每一個進程執(zhí)行都有一個執(zhí)行順序吆豹,該順序是一個執(zhí)行路徑鱼的,或者叫一個控制單元
線程:進程內部的一條執(zhí)行路徑或者一個控制單元
注:兩者的區(qū)別:一個進程至少有一個線程
進程在執(zhí)行過程中擁有獨立的內存單元理盆,而多個線程共享一個內存單元
多線程:一個進程中有多個線程,稱為多線程

②多線程的優(yōu)勢和弊端:

優(yōu)勢:解決了多部分同時運行的問題凑阶,提高效率
弊端:線程太多會導致效率的降低猿规,因為線程的執(zhí)行依靠的是CPU的來回切換

③實現(xiàn)多線程的方法:

實現(xiàn)多線程可以通過繼承Thread類和實現(xiàn)Runnable接口
a、繼承Thread
定義一個類繼承Thread類
復寫Thread類中的public void run()方法宙橱,將線程的任務代碼封裝到run方法中
直接創(chuàng)建Thread的子類對象姨俩,創(chuàng)建線程
調用start()方法,開啟線程(調用線程的任務run方法)
b师郑、實現(xiàn)Runnable接口环葵;
定義一個類,實現(xiàn)Runnable接口宝冕;
覆蓋接口的public void run()的方法张遭,將線程的任務代碼封裝到run方法中;
創(chuàng)建Runnable接口的子類對象
將Runnabl接口的子類對象作為參數傳遞給Thread類的構造函數地梨,創(chuàng)建Thread類對象
(原因:線程的任務都封裝在Runnable接口子類對象的run方法中菊卷。所以要在線程對象創(chuàng)建時就必須明確要運行的任務)。調用start()方法宝剖,啟動線程洁闰。
注:兩種方法區(qū)別:
(1)實現(xiàn)Runnable接口避免了單繼承的局限性
(2)繼承Thread類線程代碼存放在Thread子類的run方法中
實現(xiàn)Runnable接口線程代碼存放在接口的子類的run方法中;
在定義線程時诈闺,建議使用實現(xiàn)Runnable接口渴庆,因為幾乎所有多線程都可以使用這種方式實現(xiàn)

④線程的幾種狀態(tài):

新建:new一個Thread對象或者其子類對象就是創(chuàng)建一個線程,當一個線程對象被創(chuàng)建雅镊,但是沒有開啟襟雷,這個時候, 只是為線程對象開辟了內存空間和初始化數據仁烹。
就緒:新建的對象調用start方法耸弄,就開啟了線程,線程就到了就緒狀態(tài)卓缰。在這個狀態(tài)的線程對象计呈,具有執(zhí)行資格,沒有CPU執(zhí)行權征唬。
運行:當線程對象獲取到了CPU的資源捌显。在這個狀態(tài)的線程對象,既有執(zhí)行資格总寒,也有執(zhí)行權扶歪。
凍結:運行過程中的線程由于某些原因(比如wait,sleep),釋放了執(zhí)行資格和執(zhí)行權摄闸。
當然善镰,他們可以回到運行狀態(tài)妹萨。只不過不是直接回到運行狀態(tài),而是先回到就緒狀態(tài)炫欺。
死亡:當線程對象調用的run()方法結束,或者直接調用stop()方法品洛,就讓線程對象死亡树姨,線程對象在內存中變成了垃圾。

⑤多線程安全問題:

a毫别、原因:當程序的多條語句在操作線程的共享數據時(如買票例子中的票就是共享資源)娃弓,由于線程的隨機性導致一個線程執(zhí)行多條語句時,執(zhí)行了一部分還沒執(zhí)行完岛宦,另一個線程搶奪到cpu執(zhí)行權參與進來執(zhí)行,
此時就導致共享數據發(fā)生錯誤耍缴。比如買票例子中打印重票和錯票的情況砾肺。
b、解決方法:對多條操作共享數據的語句進行同步防嗡,一個線程在執(zhí)行過程中其他線程不可以參與進來

⑥Java中多線程同步:

a变汪、同步的作用:同步是用來解決多線程的安全問題的,在多線程中蚁趁,同步能控制對共享數據的訪問裙盾。
如果沒有同步,當一個線程在修改一個共享數據時他嫡,而另外一個線程正在使用或者更新同一個共享數據番官,這樣容易導致程序出現(xiàn)錯誤的結果
b、同步的前提:必須保證有兩個以上線程
必須是多個線程使用同一個鎖钢属,即多條語句在操作線程共享數據
必須保證同步中只有一個線程在運行
c徘熔、同步的好處和弊端
好處:同步解決了多線程的安全問題
弊端:多線程都需要判斷鎖,比較消耗資源
d淆党、同步的兩種表現(xiàn)形式:
同步代碼塊:可以指定需要獲取哪個對象的同步鎖,使用synchronized的代碼塊同樣需要鎖,但他的鎖可以是任意對象考慮到安全問題酷师,一般還是使用同一個對象,相對來說效率較高染乌。
注意:**雖然同步代碼塊的鎖可以使任何對象山孔,但是在進行多線程通信使用同步代碼快時,必須保證同步代碼快的鎖的對象唯一荷憋,否則會報錯台颠。
**同步函數的鎖是this,也要保證同步函數的鎖的對象和調用wait台谊、notify和notifyAll的對象是同一個對象蓉媳,也就是都是this鎖代表的對象譬挚。
格式:
synchronized(對象){
需同步的代碼;
}
同步函數
同步方法是指進入該方法時需要獲取this對象的同步鎖,在方法上使用synchronized關鍵字酪呻,使用this對象作為鎖减宣,也就是使用了當前對象,因為鎖住了方法玩荠,所以相對于代碼塊來說效率相對較低漆腌。
注:靜態(tài)同步函數的鎖是該方法所在的類的字節(jié)碼文件對象,即類名.class文件
格式:
修飾詞 synchronized 返回值類型 函數名(參數列表){
需同步的代碼;
}

⑦死鎖

兩個線程對兩個同步對象具有循環(huán)依賴時阶冈,就會發(fā)生死鎖闷尿。即同步嵌套同步,而鎖卻不同女坑。

⑧為什么要線程間通信:

多線程并發(fā)執(zhí)行的時候, 如果需要指定線程等待或者喚醒其他線程, 那么就需要線程間通信填具。比如生產者消費者的問題,生產一個消費一個,生產的時候需要負責消費的進程等待,生產一個后完成后需要喚醒負責消費的線程,同時讓自己處于等待匆骗,消費的時候負責消費的線程被喚醒劳景,消費完生產的產品后又將等待的生產線程喚醒,然后使自己線程處于等待碉就。這樣來回通信盟广,以達到生產一個消費一個的目的

⑨線程間怎么通信

在同步代碼塊中, 使用鎖對象的wait()方法可以讓當前線程等待, 直到有其他線程喚醒為止.
使用鎖對象的notify()方法可以喚醒一個等待的線程,或者notifyAll喚醒所有等待的線程.
多線程間通信用sleep很難實現(xiàn)瓮钥,睡眠時間很難把握筋量。

⑩Android開發(fā)中線程間通信應用案例:

a、Handler
b碉熄、Intent
注:進程間通信案例:服務桨武、廣播接收者、內容提供者等

(4)Android下的XML具被、JSON解析:
    1. XML的解析和生成:

解析XML的概述:常見的XML解析方式有三種玻募,DOM、SAX和Pull
Android SDK中已經集成了Pull解析器一姿,無需添加任何jar文件七咧,故Android系統(tǒng)中推薦使用Pull解析XML
Pull解析器運行方式與SAX類似,提供各種事件的判斷

①為什么要解析XML:

解析XML就是把XML文件里面各標簽的屬性叮叹、文本解析出來封裝到javabean中艾栋,解析XML的關鍵就是如何拿到XML文件里面的元素的屬性和文本

②解析XML的步驟:

a、獲得解析器:XmlPullParser parser = Xml.newPullParser();
b蛉顽、設置輸入流以及編碼蝗砾,指定解析的是哪個輸入流里面的XML文件
//去掉getClassLoader()則文件名前面加”/”,否則報錯

InputStream in = PersonServiceTest.class.getClassLoader().getResourceAsStream("persons.xml");
parser.setInput(in, "UTF-8");

c、通過解析器XmlPullParser定義的常量了方法來解析XML文件
XmlPullParser事件類型常量:START_DOCUMENT悼粮、END_DOCUMENT 闲勺、START_TAG 、END_TAG 扣猫、TEXT
方法:
getEventType():獲取事件的類型
next():往下解析
getName():獲取標簽的名字
getAttributeValue(int index):根據索引獲取標簽的屬性菜循,索引從0開始
getText():獲取文本內容
nextText():獲取下一個文本內容

③為什么要生成XML?

將javabean對象寫入XML文件保存起來申尤,所以生成XML文件的關鍵就是如何把javabean對象的屬性數據生成XML文件的元素標簽保存起來

④使用XmlSerializer生成XML文件的步驟:

a癌幕、獲取序列化對象:XmlSerializer serializer = Xml.newSerializer();
b、設置序列化對象的輸出流和編碼昧穿,指定生成到哪個輸出流里面的XML文件

FileOutputStream fos = new FileOutputStream("/mnt/sdcard/persons.xml");
serializer.setOutput(out,”UTF-8”);

c勺远、通過序列化的各種方法將對象生成XML文件的各種元素標簽屬性
startDocument:開始XML文檔
startTag:開始標簽
attribute:設置標簽的屬性
text:設置標簽的文本
endTag:結束標簽
endDocument:結束XML文檔

    1. JSON解析:

JSON文件就相當于是一個數組

解析JSON文件就相當于遍歷存儲JSON對象的JSONArray,獲取每個JSONObject的數據时鸵,并封裝到javabean中

①JSON的優(yōu)缺點:

優(yōu)點:作為數據傳輸格式胶逢,跟XML類似,但是比XML更加輕巧
由于JSON是JavaScript的原生格式寥枝,所以JSON不需要包含特定內容的首部信息
缺點:語法過于嚴謹
代碼可讀性差
其eval函數存在風險

(5)JNI調用:
    1. JNI概念:

什么是JNI?
JNI是Java Native Interface的縮寫宪塔,即Java本地接口
JNI是一個協(xié)議,是用來溝通Java代碼和C/C++代碼的協(xié)議,是Java和C/C++之間的橋梁
通過JNI協(xié)議囊拜,Java可以調用外部的C/C++中的定義好的函數庫;外部的C/C++也可以調用Java中封裝好的類和方法

    1. 為什么用JNI:

①實際開發(fā)中的驅動都是用C開發(fā),Java通過JNI就可以調用C開發(fā)好的驅動比搭,從而擴展Java虛擬機的能力
比如Android系統(tǒng)的wifi-hostpot就是用C開發(fā)冠跷,Java通過JNI調用的

②提高效率,在高效率的數學運算身诺、游戲的實時渲染蜜托、音頻視頻的編解碼上,是C編寫的霉赡,Java可通過JNI來調用C編寫好的高效率的代碼

③代碼復用橄务,Java實在2000年左右才逐漸發(fā)展起來的,而C語言七十年代就出現(xiàn)了穴亏,C中有很多非常好非常棒的函數庫的封裝,比如C中關于文件壓縮(7-zip 純C編寫的 效率非常高)蜂挪、人臉識別技術,我們Java不需要編寫了嗓化,直接拿來調用就好
注:為什么C編寫的代碼效率高:C編寫的代碼不需要通過Java虛擬機編譯棠涮,系統(tǒng)直接就認識直接就能用。

    1. 如何用JNI:

①C/C++基礎:

指針:指針就是地址刺覆,地址就是指針
地址:內存單元的編號
指針變量:存放地址的變量
指針的重要性:
a严肪、可直接訪問硬件
b、快速傳遞數據
c、返回一個以上的值
d驳糯、表示復雜的數據結構
e篇梭、方便處理字符串
f、有助于理解面向對象

②JNI流程:

a酝枢、創(chuàng)建一個Android工程
b咖祭、在Java代碼中聲明一個本地方法,用javah工具生成頭文件
c娩贷、在該Android工程中創(chuàng)建jni目錄,引入頭文件,根據頭文件實現(xiàn)c代碼跋选,參考NDK工具中的jni.h文件,其中的結構體JNIEnv*對象和jobject對象很重要官脓,在C代碼中的方法必須傳入這兩個對象
d协怒、在jni目錄中創(chuàng)建并編寫Android.mk文件
e、Ndk交叉編譯生成動態(tài)庫卑笨,即生成手機可執(zhí)行的二進制文件(.so文件)
f孕暇、Java代碼load 動態(tài)庫.調用native代碼:System.loadLibrary("Hello");//Hello為jni目錄C/C++代碼的.c文件

③NDK(native develop kits):

a、為什么需要NDK工具:在安卓開發(fā)中赤兴,因為底層都是C妖滔,且C程序不需要虛擬機編譯底層就能讀懂,故C效率比java快桶良,故java需要調用C中代碼座舍。
而java不能直接調用C中代碼,而是調用C代碼的二進制文件陨帆,C代碼里封裝了C中豐富的函數曲秉。
Java想要調用C代碼的可執(zhí)行的二進制文件需經過以下兩步驟:
編譯:
將C源代碼編譯成不可執(zhí)行的二進制文件;
該二進制文件在windows系統(tǒng)下是.obj文件
在Linux系統(tǒng)下是.o文件
鏈接:將編譯好的二進制文件根據當前的操作系統(tǒng)系統(tǒng)鏈接成可執(zhí)行的二進制文件疲牵,在鏈接過程中加入了必需的函數庫
該二進制文件在windows系統(tǒng)下是.exe文件
在linux系統(tǒng)下是.so文件
b承二、交叉編譯:Google提供了用C編寫的NDK工具,該工具的ndk-build可實現(xiàn)在電腦上(windows操作系統(tǒng)纲爸,x86的CPU)
編譯出可在手機(linux操作系統(tǒng)亥鸠,arm的CPU)上執(zhí)行的二進制文件。此過程就是交叉編譯過程识啦。
NDK工具需要運行在linux系統(tǒng)環(huán)境下负蚊,而cygwin是windows系統(tǒng)下模擬linux系統(tǒng)的一個工具,故安裝NDK之前需安裝cygwin軟件袁滥。

(6)SQLite盖桥、MySql等數據庫的CRUD及SharedPreferences的數據持久化
    1. SQLite:

①SQLite概述:

Android平臺中嵌入了一個關系型數據庫SQLite,和其他數據庫不同的是SQLite存儲數據時不區(qū)分類型
SQLite是手機自帶的數據庫题翻,每一個數據庫就是一個XML文件揩徊,每一個XML文件有一張或多張表

②創(chuàng)建SQLite數據庫步驟:

a腰鬼、定義類繼承SQLiteOpenHelper
SQLiteOpenHelper是用來打開數據庫的一個工具,其中有創(chuàng)建onCreate()數據庫和升級upGrade()數據庫方法塑荒,在獲取數據庫連接時熄赡,這些方法會自動執(zhí)行,使用手機自帶的SQLite數據庫必須創(chuàng)建一個SQLiteOpenHelper子類,實現(xiàn)其onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int)方法齿税,如果數據庫不存在則創(chuàng)建彼硫,存在則檢查數據庫版本是不是最新,不是最新則升級數據庫版本凌箕,維護其保持一個最佳的狀態(tài)
b拧篮、獲取數據庫SQLiteDatabase對象
SQLiteOpenHelper. getWritableDatabase():獲取寫數據庫,當可寫時可獲取讀數據庫
SQLiteOpenHelper. getReadableDatabase():獲取讀數據庫
c牵舱、執(zhí)行數據庫增刪改查操作
執(zhí)行增刪改操作串绩,無返回結果集:SQLiteDatabase.execSQL(String sql,Object[] params);
執(zhí)行查詢操作:返回Cursor結果集SQLiteDatabase.rawQuery(String sql,String[] params);
或者執(zhí)行CRUD操作:
SQLiteDatabase.insert();
SQLiteDatabase.update();
SQLiteDatabase.delete();
SQLiteDatabase.query();
d、關閉資源:(可選操作芜壁,每次獲取數據庫的時候數據庫底層會自動關流礁凡,建議手動關閉)
SQLiteDatabase.close();
Cursor.close();

    1. MySql:

①MySql概述:

結構化查詢語言,Structured Query Language的縮寫

②JDBC簡介:

a、JDBC:java數據庫連接慧妄,Java DataBase Connectivity的縮寫
b顷牌、開發(fā)人員安裝了不同的數據庫服務器(如MySQL和Oracle),則需要安裝不同的數據庫驅動塞淹,才能在java應用程序中連接該數據庫并對該數據庫的數據進行操作窟蓝,而這樣對開發(fā)人員來說是很麻煩的,于是乎SUN就提供了一套操作數據庫的規(guī)范,該規(guī)范就是JDBC,不同數據庫廠商實現(xiàn)了該規(guī)范(驅動)饱普,開發(fā)人員只要按照該規(guī)范開發(fā)就行了
c疗锐、JDBC規(guī)范的類在JDK中的

③JDBC編程步驟:

a、注冊驅動:
方式一:DriverManager.registDriver(new com.mysql.jdbc.Driver())
注意該Driver所在的包是com.mysql.jdbc.费彼,而不是java.sql.包中
該種方式不建議使用,原因如下:
****嚴重依賴具體的數據庫驅動程序,DriverManager是java.sql.*包中的
如果改用Orcal數據庫口芍,則得改程序
****會導致數據庫的驅動程序注冊2次箍铲,DriverManager在類一加載的時候
就注冊了一次,后面再new com.mysql.jdbc.Driver()又注冊一次
(查看源代碼)
方式二:Class.forName("com.mysql.jdbc.Driver");開發(fā)用此方式,次方式避免了a中方式一出現(xiàn)的問題
b鬓椭、建立與數據庫的鏈接:java.sql.Connection颠猴,所有的與數據庫的交互都必須在鏈接的基礎上進行操作
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day12","root", "xiaruri");
注:url的固定格式寫法要記住:"jdbc:mysql://localhost:3306/day12"
jdbc:代表協(xié)議 mysql:代表子協(xié)議 localhost:3306:代表主機和端口 day12:代表數據庫
root:代表MySQL服務器用戶名 xiaruri:用戶名密碼
實際開發(fā)中需把傳進去的三個字符串抽取出來小染,寫成配置文件翘瓮,通過讀取配置文件形式將讀取到的傳進去,這樣避免換數據庫時改程序裤翩,只需改配置文件即可
c资盅、獲取代表SQL語句對象Statement stmt = conn.createStatement();
d、執(zhí)行SQL語句 String sql = "select id,name,password,email,birthday from users";
e、如果有結果集呵扛,會被封裝成一個ResultSet對象ResultSet rs = stmt.executeQuery(sql);
f每庆、遍歷結果集
while(rs.next()){
//rs.getObject(1):結果中每條記錄的列索引從1開始。開發(fā)JDBC框架時使用
System.out.println(rs.getObject("id")+"\t"+rs.getObject("name")+"\t"+
rs.getObject("password")+"\t"+rs.getObject("email")+
"\t"+rs.getObject("birthday"));
}
h今穿、關閉使用的資源
rs.close();
stmt.close();
conn.close();

④開源的數據源框架:

a缤灵、可直接訪問硬件
b、DBCP
DBCP是Apache軟件基金組織下的開源連接池實現(xiàn)蓝晒,使用DBCP數據源應用程序應在系統(tǒng)中增加如下
兩個jar文件:
Commons-dbcp.jar:連接池的實現(xiàn)
Commons-pool.jar:連接池實現(xiàn)的依賴庫
常用O-R Mapping映射工具
Hibernate CMP JPA(Java Persistent API)
Ibatis(后來改名為MyBatis)
Commons DbUtils(只是對JDBC簡單封裝)
Spring JDBC Template
DbUtils簡介:QueryRunner
MyBatis簡介:MyBatis的前身就是iBatis腮出。她是一個數據持久層框架
MyBatis支持普通SQL查詢、存儲過程和高級映射的優(yōu)秀持久層框架
消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索芝薇,MyBatis使用簡單的XML或注解用于配置和原始映射 , 將接口和Java的POJOs(Plain Old Java Objects胚嘲,普通的Java對象)映射成數據庫中的記錄
c、C3P0

    1. SharedPreferences:

SharedPreferences對象就相當于一個可持久化的Map集合
通過put方法存儲持久化數據剩燥,需要commit才有效
通過get獲取持久化數據

(7)系統(tǒng)MediaPlayer的生命周期慢逾、圖像、音頻和視頻多媒體開發(fā)技術

①MediaPlayer:最終播放音頻灭红、視頻文件的都是通過MeidaPlayer播放

注:音頻侣滩、視頻解碼器是C代碼寫的,所以MediaPlayer內部是通過JNI調用系統(tǒng)的C解碼代碼

a变擒、MediaPlayer的生命周期的幾種狀態(tài):

idle:當一個MediaPlayer對象被剛剛new出來或是調用了reset()方法后到達idle狀態(tài)
initialized:初始化完成狀態(tài)君珠。執(zhí)行setDataSource()方法后到達initialized狀態(tài)
prepared:準備完成狀態(tài)。執(zhí)行同步準備prepare()或者異步準備prepareAsync()方法后到達prepared狀態(tài)
注意prepare()是阻塞式方法娇斑,所以播放網絡視頻開發(fā)中都用prepareAsync()方法策添。prepareAsync()有回調函數
started:開始播放狀態(tài)。執(zhí)行start()或者seekTo()方法后到達started狀態(tài)
paused:暫停播放狀態(tài)毫缆。執(zhí)行pause()方法后到達paused狀態(tài)
stopped:停止播放狀態(tài)唯竹。執(zhí)行stop()方法后到達stopped狀態(tài)
playbackComp:播放完成狀態(tài)。
end:調用了release()方法后到達end狀態(tài)
error:播放控制操作可能會失敗苦丁,如不支持的音頻/視頻格式浸颓,缺少隔行掃描的音頻/視頻,分辨率太高旺拉,流超時等原因,一旦發(fā)生錯誤产上,MediaPlayer對象會進入到Error狀態(tài)
MediaPlayer的兩種創(chuàng)建方式:
****MediaPlayer mp = new MediaPlayer();//此種方法創(chuàng)建必須調用prepare()或者prepareAsync()才能start()
****MediaPlayer.create(Context context,int resId); //此種方法系統(tǒng)內部已經執(zhí)行prepare()了,故可直接start()

b蛾狗、MediaPlayer的監(jiān)聽事件

setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 網絡流媒體播放結束監(jiān)聽器
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) 網絡流媒體的緩沖監(jiān)聽器
setOnErrorListener(MediaPlayer.OnErrorListener listener) 錯誤信息監(jiān)聽器
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) 視頻尺寸監(jiān)聽 器
setScreenOnWhilePlaying(boolean screenOn) 設置是否使用SurfaceHolder顯示監(jiān)聽器

c晋涣、MediaPlayer的作用

****MediaPlayer通常和Service結合播放音頻文件
****MediaPlayer通常和SurfaceView結合播放視頻文件
播放應用的資源文件
播放應用的原始資源文件
播放外部存儲器上的資源文件
播放網絡資源文件

d、MediaPlayer的缺點

資源占用量較高沉桌,延遲時間較長,不支持多個音頻同時播放

e谢鹊、使用SoundPool播放音效

SoundPool使用音效池的概念來管理多個短促的音效算吩。SoundPool主要用于播放密集、短促的音效撇贺。
SoundPool與MediaPlayer相比的優(yōu)勢是在于CPU資源占用量低和反應延遲下赌莺,另外SoundPool還支持自行設置聲音的品質、音量松嘶、播放比率等參數

f艘狭、使用VideoView和MediaController播放視頻

VideoView的概述:
VideoView的作用是顯示和播放視頻
VideoView封裝了MediaPlayer,同時繼承了SurfaceView
VideoView可以播放網絡音頻翠订、視頻文件巢音,通常不支持rmvb格式的視頻
使用VideoView播放視頻的步驟:
創(chuàng)建VideoView組件
調用VideoView的setVideoPath(String path)或者setVideoURI(Uri uri)加載指定視頻
調用VideoView的start()、stop()尽超、pause()方法控制視頻的播放

g官撼、使用MediaPlayer和SurfaceView播放視頻

②MediaRecorder:

手機一般都提供了麥克風硬件,而Android系統(tǒng)就可以利用該硬件來錄制音頻或者視頻

③多媒體常識:

a似谁、什么是多媒體

多媒體是計算機和視頻技術的結合傲绣,實際上它是兩個媒體;聲音和圖像巩踏,或者用現(xiàn)在的術語:音響和電視

b秃诵、常用的視頻格式

Android系統(tǒng)默認:mp4、3gp
常用格式:ts塞琼、3gpp菠净、3g2、3gpp2彪杉、avi毅往、mkv、flv派近、divx攀唯、f4v、rm渴丸、rmvb革答、rv、wmv曙强、asf、mov途茫、mpg碟嘴、v8、ram囊卜、mpeg娜扇、swf错沃、m2v、asx雀瓢、ra枢析、ram、ndivx刃麸、xvid等

c醒叁、常用音頻格式:

Android系統(tǒng):mp3、ogg泊业;
常用格式:wma把沼、mid、m4a吁伺、xmf饮睬、aac、mpa篮奄、midi捆愁、ar等

d、常用圖片格式:PNG窟却、GIF昼丑、BMP、jpg
e间校、android的多媒體應用:

視頻播放器
音頻播放器
相機
圖片瀏覽器
視頻通話
MediaScanner:開機或者SDcard插入時到系統(tǒng)庫中掃描圖片矾克、音頻和視頻多媒體文件

f、MediaPlayer如何封裝軟解碼:

在MediaPlayer類里面有一個靜態(tài)代碼塊憔足,該靜態(tài)代碼塊完成調用用C語言編寫的解碼代碼胁附。

g、國內各個視頻網站采用的解碼框架:

優(yōu)酷滓彰、搜狐控妻、奇藝、pps揭绑、暴風影音土豆弓候、56網都是用的ffmpeg
pptv已經使用p2p技術
點對點技術(peer-to-peer, 簡稱P2P)又稱對等互聯(lián)網絡技術他匪,是一種網絡新技術菇存,依賴網絡中參與者的計算能力和帶寬,而不是把依賴都聚集在較少的幾臺服務器上邦蜜。P2P網絡通常用于通過Ad Hoc連接來連接節(jié)點依鸥。這類網絡可以用于多種用途,各種檔案分享軟件已經得到了廣泛的使用悼沈。P2P技術也被使用在類似VoIP等實時媒體業(yè)務的數據通信中贱迟。

h姐扮、當播放過程出錯處理機制:

提示用戶播放錯誤
重新播放

使用第三方播放器

④能實現(xiàn)萬能播放的框架:

概述:雖然Android已經內置了VideoView組件和MediaPlayer類來支持開發(fā)視頻播放器,但系統(tǒng)支持的格式衣吠、性能等各方面都十分有限 , 所以我們可以利用開源項目VLC茶敏、ffmpeg或者Vitamio來打造屬于自己的Android萬能播放器。

a缚俏、VLC框架:

VLC是一個開源項目惊搏,基于ffmpeg框架的自定義播放器。其中LibVLC是VLC的核心部分袍榆,就相當于MediaPlayer類
VLC一個最主要的部分胀屿,它可以播放各種類型的媒體文件和流媒體文件,并且可以創(chuàng)造媒體流并保存成各種格式的媒體文件
VLC是一種跨平臺的媒體播放器和流媒體服務器包雀,最初為videolan的客戶端宿崭,它是一種非常簡便的多媒體播放器,
它可以用來播放各種各樣的音視頻的格式文件(MPEG-1才写、MPEG-2葡兑、MPEG- 4、DivX赞草、WMV讹堤、mp3、OGG厨疙、Vorbis洲守、AC3、AAC等等)流媒體協(xié)議
最具特色的功能是可以邊下載邊觀看Divx媒體文件沾凄,并可以播放不完全的AVI文件梗醇。并且支持界面的更改。
缺點:有C/C++代碼撒蟀,還有Java代碼叙谨,代碼太龐大

b、ffmpeg框架:

優(yōu)點:輕量級框架保屯,易于維護
FFmpeg是一個集錄制手负、轉換、音/視頻編碼解碼功能為一體的完整的開源解決方案
FFMPEG幾乎為你把所有的繁重工作都做了姑尺,比如解碼竟终、編碼、復用和解復用切蟋。
這使得多媒體應用程序變得容易編寫衡楞。它是一個簡單的,用C編寫的,快速的并且能夠解碼
幾乎所有你能用到的格式瘾境,當然也包括編碼多種格式。
FFmpeg支持MPEG镰惦、DivX迷守、MPEG4、AC3旺入、DV兑凿、FLV等40多種編碼,支持AVI茵瘾、MPEG礼华、OGG、Matroska拗秘、ASF等90多種解碼
FFmpeg主目錄下主要有l(wèi)ibavcodec圣絮、libavformat和libavutil等子目錄骡澈。其中l(wèi)ibavcodec用于存放各個encode/decode模塊
libavformat用于存放muxer/demuxer模塊音婶,libavutil用于存放內存操作等輔助性模塊

c慷嗜、vitamio框架:

vitamio也是基于ffmpeg開源框架
VPlayer是vitamio的一個產品犁珠,vitamio和VPlayer是同一個團隊開發(fā)的驱入,VPlayer能播放的vitamio也能播放
vitamio的成功案例:
國內:VPlayer悯许、熊貓影音傍药、321影音等
國外:Tvltaliane嘿般、Dizi TV等
vitamio支持的網絡協(xié)議:m3u8 , MMS , RTSP (RTP, SDP) , HTTP流式傳輸(progressive streaming) , HTTP Live Streaming (M3U8), Android 2.1+
vitamio的組成:vitamio.jar , ARMv-7-NEON.apk
四個解碼器:ARMv-7-NEON.apk , VFP.apk , ARMv6.apk , ARMv5.apk
注:vitamio根據手機CPU型號安裝對應的解碼器活箕,只安裝一個解碼器力麸。
vitamio不是萬能的,因為手機上的Android系統(tǒng)都被手機廠商改過育韩,所以vitamio不支持所有的手機克蚂,但是支持大部分的手機。
解碼:
硬解碼:用系統(tǒng)接口實現(xiàn)的播放器座慰。
軟解碼:不用系統(tǒng)接口實現(xiàn)的播放器陨舱。
注:系統(tǒng)播放器是硬解碼。硬解碼視頻質量比軟解碼質量好版仔,系統(tǒng)播放器的播放質量肯定比第三方播放器的播放質量好游盲。

d、流媒體:

VLS:是一種流服務器蛮粮,專門用來解決流的各種問題益缎,它也具有一些VLC的特征。videolan作為服務器可以輸出http然想,rtp莺奔,rtsp的流。
流媒體概述:
所謂流媒體是指采用流式傳輸的方式在Internet播放的媒體格式变泄。
流媒體又叫流式媒體令哟,它是指商家用一個視頻傳送服務器把節(jié)目當成數據包發(fā)出恼琼,傳送到網絡上。
用戶通過解壓設備對這些數據進行解壓后屏富,節(jié)目就會像發(fā)送前那樣顯示出來晴竞。
流媒體以流的方式在網絡中傳輸音頻、視頻和多媒體文件的形式狠半。
流媒體文件格式是支持采用流式傳輸及播放的媒體格式噩死。
流式傳輸方式是將視頻和音頻等多媒體文件經過特殊的壓縮方式分成一個個壓縮包,
由服務器向用戶計算機連續(xù)神年、實時傳送已维。在采用流式傳輸方式的系統(tǒng)中,用戶不必像非流式播放那樣等到整個文件 , 全部下載完畢后才能看到當中的內容已日,而是只需要經過幾秒鐘或幾十秒的啟動延時即可在用戶計算機上利用 , 相應的播放器對壓縮的視頻或音頻等流式媒體文件進行播放垛耳,剩余的部分將繼續(xù)進行下載,直至播放完畢捂敌。

⑤如何實現(xiàn)視頻的高質量播放:

高清艾扮、加載快、拖動快占婉、沒有廣告

(8)JavaScript泡嘴、AJAX技術,通過JQuery完成應用與服務器的異步交互和數據局部刷新
    1. JavaScript

①Aptana:

a逆济、概述:

Aptana是一個非常強大的酌予、開源的、專注于JavaScript的Ajax開發(fā)IDE(Integrated Drive Electronics的縮寫奖慌,即電子集成驅動器)

b抛虫、Aptana功能:JavaScript、HTML简僧、CSS語言的代碼提示功能

OutLiner視圖
代碼語法錯誤提示
調試JavaScript
支持流行的AJAX框架的代碼提示功能

②JavaScript知識:

a建椰、瀏覽器對象Window:

組成:
document:文檔對象
links:鏈接對象數組
forms:表單對象數組
images:圖片對象數組
frame:框架對象
location:位置對象
history:歷史對象

③DOM:Document Object Mode:文檔對象模型

④Node:節(jié)點的CRUD

    1. Ajax:
(1)什么是AJAX?

Asynchronous JavaScript And XML的縮寫岛马。
允許瀏覽器與服務器通信而無須刷新當前頁面的技術叫做AJAX技術棉姐。

(2)瀏覽器與服務器交互的兩種方式

①普通B/S模式(同步):

提交請求->等待服務器處理->處理完畢返回 這個期間客戶端瀏覽器不能干任何事

②AJAX技術(異步):異步: 請求通過事件觸發(fā)->服務器處理(這時瀏覽器仍然可以作其他事情)->處理完畢

(3)同步和異步的概念:

同步是指:發(fā)送方發(fā)出數據后,等接收方發(fā)回響應以后才發(fā)下一個數據包的通訊方式啦逆。
異步是指:發(fā)送方發(fā)出數據后伞矩,不等接收方發(fā)回響應,接著發(fā)送下個數據包的通訊方式

(4)AJAX技術的應用:

Google地圖夏志、幾乎所有的網站現(xiàn)在都采用AJAX這種不用刷新的技術乃坤。

(5)不用刷新的技術:

①Flash
②Java Applet
③框架
④隱藏的iframe
⑤XMLHttpRequest
該對象是對JavaScript的一個擴展,可使網頁與服務器進行通信。是創(chuàng) 建Ajax應用的最佳選擇湿诊。實際上通常把Ajax當成XMLHttpRequest對象的代名詞

(6)AJAX技術的原理:

①Ajax的核心是JavaScript對象XmlHttpRequest狱杰。

該對象在Internet Explorer 5中首次引入,它是一種支持異步請求的技術厅须。
簡而言之浦旱,XmlHttpRequest使您可以使用JavaScript向服務器提出請求并處理響應,而不阻塞用戶九杂。

②AJAX采用異步交互過程。AJAX在用戶與服務器之間引入一個中間媒介宣蠕,從而消除了網絡交互過程中的處理—等待—處理—等待缺點例隆。

(7)AJAX包含的技術:

AJAX并不是一項新的技術,它是多種技術的結合抢蚀,它包括Javascript镀层、XHTML和CSS、DOM皿曲、XML和XMLHttpRequest唱逢。

(8)AJAX技術的缺陷:

①依賴瀏覽器的支持,目前IE5.0及以上屋休、Mozilla1.0坞古、NetScape7及以上版本才支持AJAX
②對流媒體的支持沒有FLASH、Java Applet好劫樟。
③手機痪枫、PAD還不能很好的支持AJAX
④AJAX更新頁面內容的時候并沒有刷新整個頁面,因此叠艳,網頁的后退功能是失效的奶陈,這容易讓用戶搞不清楚現(xiàn)在頁面上的數據是舊的還是更新過的

    1. JQuery:

①JQuery產生的原因:

為了簡化JavaScript的開發(fā), 一些JavsScript庫誕生了。
當前流行的 JavaScript 庫有: jQuery, MooTools, Prototype, Dojo, YUI

②JQuery是什么附较?

a吃粒、jQuery是繼prototype之后又一個優(yōu)秀的Javascript框架。其宗旨是——WRITE LESS,DO MORE,寫更少的代碼,做更多的事情拒课。
b徐勃、它是輕量級的js庫(壓縮后只有21k),這是其它的js庫所不及的捕发,它兼容CSS3疏旨,還兼容各種瀏覽器(IE 6.0+,FF 1.5+,Safari 2.0+,Opera 9.0+)
c、jQuery是一個快速的扎酷,簡潔的javaScript庫檐涝,使用戶能更方便地處理HTML documents、events、實現(xiàn)動畫效果谁榜,并且方便地為網站提供AJAX交互
d幅聘、jQuery能夠使用戶的html頁保持代碼和html內容分離,也就是說窃植,不用再在html里面插入一堆js來調用命令了帝蒿,只需定義id即可

③什么是JQuery對象?

jQuery 對象就是通過jQuery包裝DOM對象后產生的對象
雖然jQuery對象是包裝DOM對象后產生的巷怜,但是jQuery無法使用DOM對象的任何方法葛超,同理DOM對象也不能使用jQuery里的方法.亂使用會報錯

(9)AsyncTask和AsyncQueryHandler框架
    1. AsyncTask:

①AsyncTask概述:

AsyncTask是Android 1.5提供的一個輕量級的異步任務工具,是一個封裝好的后臺任務類延塑。

②AsyncTask使用原則:

a绣张、AsyncTask實例必須在主界面線程中創(chuàng)建
b、execute方法必須在主界面線程中執(zhí)行
c关带、不要手動的調用onPreExecute侥涵、doInBackground、onPostExecute和onProgressUpdate方法
d宋雏、多次調用將會出現(xiàn)異常

③AsyncTask和Handler的異同點:

a芜飘、相同點:AsyncTask和Handler都能通過主線程和子線程之間的通信更新主界面
b、不同點:Handler比較麻煩磨总,而AsyncTask使任務更加方便嗦明,而且AsyncTask過程可控。
對于多個后臺任務時舍败,使用Handler代碼結構清晰簡單招狸;而使用多個AsyncTask時容易發(fā)生異常

    1. AsyncQueryHandler:

①AsyncQueryHandler概述:

a、AsyncQueryHandler繼承于Handler

②AsyncQueryHandler的作用:

對ContentProvider提供的數據進行增刪改查邻薯。

③AsyncQueryHandler的工作機制:

注:AsyncQueryHandler內部需要Handler裙戏、Looper、Message厕诡、HandlerThread累榜、WorkerHandler和WorkerArgs配合使用完成異步任務

a、創(chuàng)建AsyncQueryHandler對象時灵嫌,會調用系統(tǒng)的AsyncQueryHandler構造方法壹罚,在AsyncQueryHandler構造方法里,系統(tǒng)會進行如下操作:創(chuàng)建并開啟一個HandlerThread寿羞、同時初始化Looper對象和Handler對象
b猖凛、當調用AsyncQueryHandler的startQuery、startInsert绪穆、startUpdate或者startDelete方法時

就會執(zhí)行相應的增刪改查方法辨泳,在AsyncQueryHandler的增刪改查方法里面先通過Handler對象初始化Message對象虱岂,然后再初始化一個WorkerArgs對象,將任務參數信息封裝到WorkerArgs對象中菠红,最后再通過Handler對象的sengMessage方法將異步任務的消息發(fā)送出去

c第岖、WorkerHandler收到消息后調用其handleMessage方法,在該方法里對異步任務的操作類型進行判斷试溯,然后執(zhí)行與之對應的處理
d蔑滓、最后回調指定的異步任務執(zhí)行完成的回調方法,該回調方法系統(tǒng)是空實現(xiàn)遇绞,需要用戶自己根據自己的業(yè)務去重寫

④AsyncQueryHandler的使用注意事項:

大數據時會出現(xiàn)ANR異常键袱,故需要優(yōu)化。

(10)aidl開發(fā):
    1. 什么是aidl摹闽?aidl就是Android接口定義語言杠纵,即Android Interface Definition Language的縮寫,是Google提供的一個規(guī)范钩骇。
    1. aidl技術的作用:
      (可以先闡述服務的兩種開啟方式再開始回答這個問題)
      當服務調用者和服務不在同一個應用,此時服務調用者想通過遠程綁定服務調用服務里面的方法就必須得通過aidl技術铝量。
    1. 使用aidl技術的步驟:

①在服務中定義好方法

分析:我們不能去new一個服務倘屹,也就不能拿到一個服務對象的引用,拿不到服務對象的引用慢叨,也就不能通過服務對象的引用來調用服務中的方法 , 那么我們通過什么方式才能調用服務的方法呢纽匙?我們可以通過一個中間人來實現(xiàn)調用服務里面的方法,這個中間人就是接口拍谐。
而通過aidl技術可將服務應用中的接口和調用者應用中的接口變成同一個接口 , 就好比我們要請李宇春唱歌就得通過她的經紀人

②定義一個接口烛缔,并在接口中聲明方法

③通過綁定服務的方法開啟的服務會調用服務的onBind方法,而執(zhí)行onBind方法會返回一個IBinder接口對象轩拨,而Binder是IBinder接口的實現(xiàn)類践瓷,故我們可以自定義一個內部類MyBinder繼承Binder同時實現(xiàn)步驟②中定義好的接口,實現(xiàn)接口未實現(xiàn)的方法亡蓉。
此時MyBinder就相當于一個中間人晕翠,通過調用這個中間人的方法我們就可以間接的調用服務中的方法

④進入服務的應用的本地目錄,將服務中的接口文件后綴名改為aidl砍濒,同時將接口中的權限修飾符去掉(此時會在英語的gen目錄生成相對應的.java文件)淋肾;
進入調用服務的應用的本地目錄,將接口文件的后綴名改為aidl爸邢,同時將接口中的權限修飾符去掉(此時會在英語的gen目錄生成相對應的.java文件)樊卓;
這樣就保證兩個應用中相同包相同聲明的接口是同一個接口,進而可以通過該中間人接口遠程調用服務里面的方法杠河。

⑤將服務中自定義的內部類MyBinder改為繼承Stub碌尔;
將遠程綁定服務調用服務方法的代碼中ServiceConnection類的onServiceConnected方法返回的IBinder接口浇辜,通過Stub.asInterface(IBinder)方法強轉成我們自定義的中間人接口(只有強轉為和服務中自定義的接口類型才能調用服務中的方法)

(11)WebService調用技術:

①WebService調用技術的作用:調用網上提供的服務

②如何使用WebService:

a、登陸http://www.webxml.com.cn網站七扰,確定我們要訪問的WebService服務奢赂,查看其網上提供的使用API獲取訪問其WebService服務所需發(fā)送XML文件和接收的XML文件,了解使用說明
b颈走、向網上服務端發(fā)送指定服務所需要的指定格式的XML文件
c膳灶、解析網上服務端返回的XML文件
WebService是發(fā)布在網絡上的API,可以通過發(fā)送XML調用立由,WebService返回結果也是XML數據
WebService沒有語言限制轧钓,只要可以發(fā)送XML數據和接收XML數據即

(12)常用設計模式和算法:
  • (1) 常用設計模式:

注:什么叫設計模式?解決某類問題行之有效的方法锐膜,是一種思想毕箍,是規(guī)律的總結

    1. 單例設計模式:
      ①概念:保證一個類在內存中只有唯一一個對象。
      ②實現(xiàn)單例設計模式的步驟:
      a道盏、將構造函數私有化而柑。構造函數私有化可避免其他程序創(chuàng)建該類對象
      b、在本類中創(chuàng)建一個私有的該類對象
      c荷逞、對外提供一個公共訪問方式媒咳,為了方便其他程序訪問到該類對象
      ③單例設計模式的兩種方式:
a、餓漢式:類一加載就創(chuàng)建對象
class Student{
private Student(){}
private static final Student s = new Student();
public static Student getInstance(){
    return s;
 }
}
b种远、飽漢式:使用時才創(chuàng)建該對象
class Student{
private Student(){}
private static final Student s = null;
public static Student getInstance(){
    if(s==null) {
        //線程1就進來了涩澡,線程2就進來了。
        s = new Student();
    }
    return s;
  }
}
c坠敷、餓漢式和飽漢式的區(qū)別:

****餓漢式是類一加載進內存就創(chuàng)建好了對象妙同;而懶漢式則是類加載進內存的時候,對象還沒有存在膝迎,要使用該對象的時候再new出來
****懶漢式是延遲加載粥帚,如果多個線程同時操作懶漢式時就有可能出現(xiàn)線程安全問題
為解決懶漢式的線程安全問題,解決線程安全問題可以加同步來解決限次。
但是加了同步之后茎辐,每一次都要比較鎖,效率就變慢了掂恕,可以通過雙重判斷來提高程序效率拖陆。
注:開發(fā)常用餓漢式,因為餓漢式簡單安全懊亡。懶漢式多線程的時候容易發(fā)生問題

④單例設計模式的應用:

當需要保證某個類在內存中有且僅有一個實例對象時依啰,就用單例設計模式。比如java的Runtime類店枣、Class類都是采用的單例設計模式

    1. 工廠模式:
      ①作用和好處:作用:提供創(chuàng)建對象的接口
      好處:
      a速警、隱藏創(chuàng)建細節(jié)
      b叹誉、需要創(chuàng)建新對象時直接在配置文件修改就行,方便靈活

②工廠模式的分類:

a闷旧、簡單工廠模式:不利于產生系列產品
b长豁、工廠方法模式:多形性工廠
c、抽象工廠模式:又稱為工具箱忙灼,產生產品族匠襟,但不利于產生新的產品

③工廠模式的應用:如XML文件的幾種解析方法如DOM、SAX该园、PULL在創(chuàng)建解析器時都是用的工廠模式
④缺點:缺點是當產品修改時酸舍,工廠類也要做相應的修改。

    1. 模板模式:

①概念:

定義一個操作中算法的骨架里初,將一些步驟的執(zhí)行交給子類去完成啃勉。
在定義功能時,功能的一部分是確定的双妨,有一部分是不確定的淮阐,而且確定的部分在使用不確定的部分,可將不確定的部分暴露出去刁品,由該類的子類去完成枝嘶。

②模板設計模式的應用:

a、Servlet就是用的模板設計模式
b哑诊、如Android開發(fā)中的BaseActivity。幾乎每個Activity都要執(zhí)行findview及刻、setview镀裤、監(jiān)聽事件和處理事件等操作。故我們可以將這些共同的操作抽取出來形成一個模板缴饭。
c暑劝、模板設計模式在一些開源框架中應用很多

    1. 代理模式:

①定義:為其他對象提供一種代理以控制對這個對象的訪問
②代理模式的應用場景:

a、授權機制
b颗搂、不能直接訪問對象担猛,但又必須和這個對象進行交互

③代理模式如何用?

比如我要找李宇春唱歌丢氢,李宇春很忙傅联,我只能找她經紀人,經紀人雖然不會唱歌疚察,但是通過經紀人這個中間人可以調用李宇春唱歌蒸走。

    1. 策略模式:

①定義:

策略模式就是用來封裝算法的涉兽。
策略模式定義了算法家族错敢,分別封裝起來舆床,讓它們之間可以互相替換认轨,此模式讓算法的變化,不會影響到使用算法的客戶别惦。

②概述:

策略模式把行為和環(huán)境分開狈茉。環(huán)境類負責維持和查詢行為類,各種算法在具體的策略類中提供掸掸。
由于算法和環(huán)境獨立開來氯庆,算法的增減,修改都不會影響到環(huán)境和客戶端猾漫。

③策略模式的應用場景:

策略模式是用來封裝算法的点晴。
只要在不同時間應用不同的業(yè)務規(guī)則,就可以考慮用策略模式處理這種變化的可能性悯周。

    1. 裝飾模式:

①概念:

裝飾模式以對客戶端透明的方式擴展對象的功能粒督,是繼承關系的一個替代方案,提供比繼承更多的靈活性禽翼。
動態(tài)給一個對象增加功能屠橄,這些功能可以再動態(tài)的撤消。增加由一些基本功能的排列組合而產生的非常大量的功能闰挡。

    1. 適配器模式:

①概念:

將一個類的接口轉換成客戶希望的另外一個接口锐墙。適配器模式使原本由于接口不兼容而不能一起工作的那些類可以一起工作。

②應用場景:

兩個類所做的事情相同或者相似长酗,但是具有不同的接口時就可以考慮適配器模式溪北。
-8) 觀察者模式:

①概念:

觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監(jiān)聽某個主題對象夺脾。
這個主題對象在狀態(tài)發(fā)生變化時之拨,會通知所有的觀察者,使他們能夠自己更新自己咧叭。
適配類可以根據參數返還一個合適的實例給客戶端蚀乔。

②概述:

所謂知己知彼百戰(zhàn)不殆。

    1. 門面模式:

①概念:

外部與一個子系統(tǒng)的通信必須通過一個統(tǒng)一的門面對象進行菲茬。門面模式提供一個高層次的接口吉挣,使得子系統(tǒng)更易于使用。
每一個子系統(tǒng)只有一個門面類婉弹,而且此門面類只有一個實例睬魂,也就是說它是一個單例模式。但整個系統(tǒng)可以有多個門面類镀赌。

    1. 設計原則:

①單一職責原則:

a汉买、概念:應該有且僅有一個原因引起類的變更 , 簡稱SRP,Single Responsibility Principle的縮寫
b佩脊、單一職責的好處:
類的復雜性降低
代碼可讀性高
可維護性提高
變更引起的危險降低

②里氏替換原則:

a蛙粘、概念:
所有引用基類的地方必須能透明的使用其子類的對象垫卤。
通俗的講就是只要父類能出現(xiàn)的地方,我子類就可以出現(xiàn)出牧,而且調用子類還不產生任何的錯誤或異常穴肘;
但是反過來就不行了,有子類出現(xiàn)的地方舔痕,父類未必就能適應评抚。
b、里氏替換原則包含的意思:
子類必須完全的實現(xiàn)父類的方法
子類可以有自己的個性
覆蓋或者實現(xiàn)父類的方法時輸入參數可以被放大
覆蓋或者實現(xiàn)父類的方法時輸出結果可以被縮小

③依賴導致原則:

a伯复、概念:
Dependence Inversion Principle
依賴倒置可以說是面向對象設計的標記慨代,用哪種語言編寫程序并不重要,如果編寫時考慮的都是如何針對抽象編程而不是針對細節(jié)編程 , 即程序中所有的依賴關系都終止于抽象或者接口啸如,那就是面向對象設計侍匙,反之就是過程化的設計了。

④接口隔離原則(Interface Segregation Principle):

a叮雳、概念:
第一種定義:客戶端不應該依賴它不需用的接口
第二種定義:類間的依賴關系應該建立在最小的接口上 , 通俗的講想暗,就是接口盡量細化,同時接口中的方法盡量的少帘不。
b说莫、接口隔離包含的四層意思:
接口要盡量小
接口要高內聚:高內聚就是提高接口、類寞焙、模塊的處理能力储狭,減少對外的交互
定制服務
接口設計是有限度的
一個接口只服務于一個子模塊或者業(yè)務邏輯

⑤迪米特法則(Low Of Demeter):

a、概念:\也叫最少知識原則 , 通俗的講一個類對自己需要耦合或者調用的類應該知道的最少捣郊,你類內部是怎么復雜辽狈、怎么的糾纏不清都和我沒關系,
那是你的類內部的事情模她,我就知道你提供的這么多public方法,我就調用這個
b懂牧、迪米特法則的四層意思:
只和朋友交流:
出現(xiàn)在成員變量侈净、方法的輸入輸出參數中的類被稱為成員朋友類
朋友間也是有距離的:迪米特法則就要求類"小氣"一點,盡量不要對外公布太多的public方法和非靜態(tài)的public變量僧凤,盡量內斂畜侦,多使用private,package-private、protected等訪問權限
是自己的就是自己的:如果一個方法放在本類中躯保,即不增加類間關系旋膳,也對本類不產生負面影響,就放置在本類中
謹慎使用Serializable

⑥開閉原則(Open Close Principle):

a途事、概念:軟件實體應該對擴展開放验懊,對修改關閉擅羞,其含義是說一個軟件實體應該通過擴展來實現(xiàn)變化,而不是通過修改已有的代碼來實現(xiàn)變化
軟件實體:項目或軟件產品中按照一個的邏輯規(guī)則劃分的模塊
抽象接口或類
方法
b义图、為什么要用開閉原則:
開閉原則是最基礎的原則
開閉原則非常重要:
開閉原則對測試的影響
開閉原則可以提高復用性
開閉原則可以提高可維護性
面向對象開發(fā)的要求
c减俏、如何使用開閉原則:
抽象約束
參數控制模塊行為
制定項目章程
封裝變化

(13)html5和PhoneGAP框架:
(14)回調函數:

①回調函數的概念:

回調函數就是那些自己寫的,但是不是自己來調用碱工,而是在需要的時候給別人來調用的函數娃承。比如消息回應函數。
即生成對象的時候怕篷,不調用對象的方法历筝,而作為參數傳遞下去,在需要再調用廊谓。

(15)UML語言:

①UML作用:

消除了不同建模語言之間的差異
提供了一個客戶梳猪、需求 分析、架構設計蹂析、軟件實現(xiàn)和運維部署部門之間共同交流的語言
集成了優(yōu)秀的開發(fā)實踐成果和經驗

②UML分類:

靜態(tài)圖:
類圖(類之間的關系:依賴舔示、泛化、實現(xiàn)和關聯(lián)(關聯(lián)又分為聚合和組合))
對象圖
包圖
行為圖:
活動圖
狀態(tài)圖
用例圖:用例圖(用例之間的關系:泛化电抚、包含和擴展)
交互圖:
順序圖
協(xié)作圖
實現(xiàn)圖:
組件圖
部署圖

③UML的建模工具:

Rose:
Visio:
Power Designer:

④OO設計原則:

開閉原則
里氏代換原則
依賴倒置原則
接口分離原則

(16)面向對象:
    1. 概述:面向對象是相對于面向過程而言的惕稻,面向過程強調的是功能,面向對象強調的是將功能封裝進對象強調具備功能的對象蝙叛,
    1. 思想特點好處:

A:是符合人們思考習慣的一種思想俺祠;
B:將復雜的事情簡單化了;
C:將程序員從執(zhí)行者變成了指揮者借帘;
注:比如我要達到某種結果我要是用某個功能蜘渣,我就尋找能幫我達到該結果的功能的對象,如果該對象具備了該功能 , 那么我拿到該對象肺然,也就可以使用該對象的功能蔫缸。如我要洗衣服我就買洗衣機,至于怎么洗我不管际起。

    1. 特征:

封裝:隱藏對象的屬性和實現(xiàn)細節(jié)拾碌,僅對外提供公共訪問方式
繼承: 多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中街望,那么多個類無需再定義這些屬性和行為校翔,只要繼承那個類即可。
多態(tài): 一個對象在程序不同運行時刻代表的多種狀態(tài)灾前,父類或者接口的引用指向子類對象

    1. 面向對象設計的重要經驗:誰擁有數據防症,誰就對外提供操作這些數據的方法。

如:
人在黑板上畫圓:
畫圓需要知道圓心的位置和圓的半徑,而圓心的位置和圓的半徑只有圓自己最清楚蔫敲,所以畫圓的方法是圓的方法饲嗽。
列車司機緊急剎車:
剎車的方法是司機的還是車的呢?同樣燕偶,具體剎車的動作喝噪、怎么剎車只有車是清楚的,人只是發(fā)個剎車的信號給車指么,所以剎車的方法是車的
面向對象的面試題:
兩塊石頭磨成一把石刀酝惧,石刀可以將樹看成木材,木材可以做出椅子:
石頭磨成石刀是哪個對象的方法呢伯诬?如果是石頭內部的方法的話晚唇,那么石頭磨成石刀,石頭自己都沒了盗似,所以石頭磨成石刀不是石頭內部的方法哩陕,故石頭變成石刀應該是一個石頭加工廠的方法,將石頭磨成石刀赫舒。
石刀將樹看成木材悍及,所以石刀應該有一個將樹看成木材的方法
木材可以做成椅子,所以應該有一個木材加工廠接癌,該加工廠有一個接收木材然后加工成椅子的方法心赶。
球從一根繩子的一端移動到另一端:球這個對象應該有移動到下一個點的方法 , 繩子這個對象應該有提供下個點是哪個點的方法,以通知小球移動的方向

(18)Android四大組件:
    1. Activity
    1. Service:

①服務的兩種開啟方式:

a缺猛、startService:
特點:服務一旦開啟缨叫,就會在后臺長期運行 , 服務的開啟者跟服務沒什么關系
b、bindService:

特點:調用者掛了荔燎,服務也跟著掛耻姥。即不求同日生但求同日死
注:通過bindService開啟的服務,用完一定要先unbindService再destroy有咨,否則會報異常琐簇。

    1. ContentProvider
    1. BroadcastReceiver
(19)代碼優(yōu)化:
    1. 代碼優(yōu)化原則:

①時間換時間:

如禁用電腦的一些開機啟動項,通過減少這些沒必要的啟動項的時間從而節(jié)省開機時間
如網站界面上數據的分批獲取座享,AJAX技術

②時間換空間:

如拷貝文件時new一個字節(jié)數組當緩沖器婉商,即byte[] buffer = new byte[1024]。
為什么只new一個1024個字節(jié)的數組呢征讲,new一個更大的字節(jié)數組不是一下就把文件拷貝完了么据某?這么做就是為了犧牲時間節(jié)省有限的內存空間

③空間換時間:

如用Windows系統(tǒng)自帶的搜索文件的功能搜索文件時會很慢橡娄,但是我們犧牲電腦硬盤空間安裝一個everything軟件來搜索文件就特別快

④控件換空間:如虛擬內存

(20)手機定位诗箍、地圖:
    1. Android手機定位的三種方式:

①基站定位:

根據手機基帶和附近的基站,通過手機信號的強弱來定位手機挽唉。
但是這種定位方式的精確度跟手機離基站的遠近以及手機附近基站的密集程度有關系滤祖。
精度為20米-2000米不等筷狼。

②wifi定位(也叫網絡定位):

當手機連接網絡的時候,會動態(tài)獲取一個ip地址匠童,運營商會讓ip跟實際位置有一個一一對應關系埂材,所以通過ip地址也可以定位手機。
比如Google公司的谷歌縱橫汤求。
因為手機獲取到的ip都是運營商根據手機所處位置動態(tài)分配的ip俏险,所以這種方式進行手機定位的精確度比較差,精確度為200米+

③GPS定位:

手機都會自帶一個比較便宜的非專業(yè)的A-GPS模塊扬绪,通過免費的光波的方式和衛(wèi)星進行通信竖独。
因為是通過光波的方式,所以就要求頭頂必須空曠挤牛。
像汽車上比較專業(yè)的GPS設備莹痢,會進行信號一些放大和增益,進行手機定位也就比較不受限制和精確墓赴。
精確度跟GPS模塊的精度有關竞膳,通常為2米-10米。

    1. Google Map:

①獲取Google Map API的Key:

為了在應用程序中調用Google Map诫硕,必須先獲取Google Map API的Key坦辟。

②安裝Google Map API插件:

Android SDK默認并不支持Google Map,為了得到支持Google Map的SDK痘括,必須為Android SDK增加相應的插件:AVD长窄。

③創(chuàng)建支持Google Map API的虛擬設備:

為Android SDK安裝Google Map API插件后,還需要創(chuàng)建一個支持Google Map API的虛擬設備纲菌。

④Google Map API:

a挠日、MapView:為了在Android平臺上調用Google Map服務,Google Map提供了一個MapView翰舌,這個MapView的用法就像普通的ImageView一樣嚣潜,直接在界面布局文件中定義它,然后在程序中控制該組件即可椅贱。
b懂算、MapController:通過MapView.getController()可獲取MapController對象 , MapController可對MapView進行控制,比如控制地圖定位到指定位置或者地圖放大庇麦、縮小等
c计技、Overlay:通過MapView.getOverlay()可獲取Overlay對象 , Overlay是附加在Google Map上的附加圖片,應用可以控制向Google Map上添加任意多個Overlay
d山橄、GeoPoint:GeoPoint類表示Google Map上的指定點 , GeoPoint就是對經度和緯度的封裝

⑤使用Google Map API定位的步驟:

a垮媒、獲取MapView對應的MapController對象
b、根據經度、緯度值創(chuàng)建GeoPoint對象
c睡雇、調用MapView控件所關聯(lián)的MapController對象的animateTo(GeoPoint point)方法定位到指定位置
注意:
在布局文件中引入MapView要通過包名.類名的方式
在布局文件中定義MapView必須要設置android:apiKey萌衬,其值為①中申請到的Key

⑥GPS導航:

把GPS導航和Google Map結合起來使用,可以非常方便的開發(fā)出GPS導航應用
a它抱、通過Context.getSystemService(Context.LOCATION_SERVICE)方法獲取LocationManager對象
b秕豫、通過LocationManager對象每隔一段時間獲取GPS定位信息
c、根據LocationManager對象每隔一段時間獲取的GPS定位信息观蓄,通過MapView將地圖定位到指定位置

⑦根據地址定位:

Google Map必須通過經度和緯度來進行定位混移,而普通用戶不可能記住某個位置的經度和緯度,所以對普通用戶來說根據地址定位才是有價值的地圖應用
為此侮穿,需要進行如下兩個操作:
a沫屡、地址解析:把字符串地址轉換為經、緯度
b撮珠、反向地址解析:把經沮脖、緯度轉換為字符串地址
Android為地址解析提供了Geocoder工具類,該工具類提供如下兩個方法進行地址解析和反向地址解析
a芯急、List<Address> getFromLocation(double latitude, double longtitude, int maxResults)
執(zhí)行地址解析勺届,把經、緯度值轉換為字符串地址
b娶耍、List<Address> getFromLocationName(String locationName, int maxResults)
執(zhí)行反向地址解析免姿,將字符串地址轉換為經、緯度值

    1. 火星坐標系統(tǒng):

①現(xiàn)在絕大多數的GPS獲取到的經度和緯度都是美國的衛(wèi)星榕酒,我們國內也有北斗衛(wèi)星胚膊,但是至今沒給民用。

通過美國衛(wèi)星獲取到的經想鹰、緯度是國際標準的經紊婉、緯度;
而國際標準的經緯度在中國地圖上顯示的位置是不準確的;
為了拿國際標準的經緯度在中國地圖上獲取到準確的位置,需要把國際標準的經緯度轉換成中國的火星坐標才能獲取到準確的位置

(21)JDK1.5新特性:
(22)聯(lián)網機制:
    1. 手機端的通信渠道:

①WLAN(wi-fi):無線局域網

Wi-fi是無線局域網最常用的一種無線技術辑舷,wi-fi向局域網內所有ip發(fā)送一個數據包(UDP)
覆蓋范圍:100米以內

②手機APN(Access Point Name):接入點

a喻犁、基站覆蓋范圍:1-1.5公里
b、Wap方式:網關 國外是沒有的何缓,這種方式是中國特有的肢础,具有地域性。
Wap的ip和端口:ip:10.0.0.172 端口:80
Wap通信機制:手機端的請求網絡資源碌廓,先經過Wap传轰,Wap再將請求轉到網絡資源
Wap作用:在中間端提供增值業(yè)務
c、Net方式:
Net通信機制:手機端請求網絡資源直接連接到網路資源路徑谷婆,不需要通過任何中間接口

    1. 手機端和服務器通信的方式:

①Socket:

比如:豌豆莢(USB慨蛙、WIFI)勃刨、聊天工具等
USB連接:當手機通過USB連接PC端時,讀取連接手機的設備PID和VID等信息股淡,然后找手機驅動,如果發(fā)現(xiàn)驅動沒安裝過就自動幫你安裝廷区,如果驅動已安裝則不再安裝唯灵,安裝完手機驅動后就通過Socket指定一個端口讀取手機信息
wi-fi連接:PC端應用會向局域網內所有的ip通過UDP發(fā)送一個數據包 , 數據實時交互較高時也會用到Socket通信:通過Socket寫一個長連接,每隔一段時間給服務器發(fā)送數據包隙轻。這個數據包稱為心跳埠帕,間隔時間通常為30秒比如股票交易、貴金屬的交易應用等都會實時跟服務器交互數據

②HttpUrlConnectioon:

可以理解為一個工具類

③HttpClient:

HttpClient是一個開源框架
作用:解決和服務器進行交互有網關(Wap)存在時的地域局限性
比如北京和上海的網關(Wap)是有差異的玖绿,如果通過Wap渠道通信敛瓷,在北京開發(fā)的應用,拿到上海去用會出現(xiàn)問題 , 連接10次網絡斑匪,可能才成功3呐籽、4次。

    1. 在寫手機端連接工具之前的準備工作:

①判斷手機當前的網絡類型:

判斷是WiFi接入還是APN接入 , 如果是APN接入則需要進行特別處理蚀瘸,即需要設置APN的信息(獲取手機當前處于活動狀態(tài)的APN的ip和端口)

(23)軟件測試:

①monkey測試:Android自帶的測試工具

②testing:提供很多測試工具

③百度測試中心:

(24)軟件在不同屏幕的手機上的適配狡蝶;
    1. 屏幕適配原則:

①開發(fā)時單位盡量采用dip或者dp單位
②定義布局時盡量采用相對布局或者線性布局或者幀布局
③當屏幕過小或者內容過多時采用ScrollView控件將整個布局文件進行包裹
④點9圖片
⑤在AndroidManifest.xml文件的<manifest>元素如下添加子元素

<supports-screens 
    android:largeScreens="true"
    android:normalScreens="true" 
    android:anyDensity="true"
    android:smallScreens="true">
</supports-screens>         
(25)MVC開發(fā)模式:
(26)垃圾短信過濾

A.定義類繼承BroadcastReceiver
B.在清單中配置<receiver><action>的name值為:android.provider.Telephony.SMS_RECEIVED
權限permission-->android.permission.RECEIVE_SMS

C.在onReceive(context,intent)中獲取數據

        Bundle bundle = intent.getExtras();
        /*
         * Set<String> set = bundle.keySet(); for(String str : set)
         * System.out.println(str); 得到bundle中的字段--->pdus
         */
        Object[] objs = (Object[]) bundle.get("pdus");//返回一個Object[]數組
        for (Object obj : objs) {
            //每個一個obj對象又是一個byte[]數組
             SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj);
            "主體內容:"+sms.getMessageBody()
            "發(fā)信人:"+sms.getOriginatingAddress()
            "服務中心號碼:"+sms.getServiceCenterAddress()
                Date date = new Date(sms.getTimestampMillis());
            "時間:"+new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒").format(date)
        }

D.根據不同需求,短信進行過濾,還未能更改,更改信息封裝數據很麻煩,只能abortBroadcast();

1、自定義控件項目

(1)SplashActivity:
1)Splash的作用:

①實際開發(fā)中Splash的作用一是展現(xiàn)產品的logo贮勃,提升產品的知名度
②Splash的第二個作用是可以根據不同的日期和時間贪惹,展現(xiàn)不同的界面,比如情人節(jié)版寂嘉、新年版等奏瞬,提升用戶體驗(可順便提一下用戶體驗是現(xiàn)在炒得比較火的一個概念,任何一個網站任何一個軟件都在說要提高用戶體驗泉孩,所以現(xiàn)在小的公司都有UI工程師硼端,大的公司都有UE工程師)
③Splash的第三個作用是可以用來完成程序的初始化。比如數據庫的初始化寓搬、文件配置的拷貝和讀取等操作
④Splash還可以進行檢查網絡显蝌、檢查升級、創(chuàng)建程序緩存路徑订咸、檢查SDCard是否存在以及日志等操作曼尊。

2)動畫:

剛剛Splash界面的火柴人動畫和倒計時的動畫都是幀動畫。
在界面一加載的時候就啟動該動畫脏嚷,要注意此處動畫的啟動不能通過控件.startAnimation的方式啟動骆撇,因為此時幀動畫所需的圖片資源還沒加載完成,得通過控件.post的方式父叙,開啟一個子線程神郊,在子線程中通過動畫.start的方法啟動動畫肴裙。

(2)HomeActivity:
1)概述:

①走馬燈文字(android:ellipsize="marquee"):
a、文字走馬燈效果的應用場景:在空間比較有限而需要展示的文字信息比較多時涌乳,就可以考慮采用走馬燈效果來展示
b蜻懦、文字走馬燈效果的實現(xiàn):通過自定義控件繼承TextView來實現(xiàn)文字的走馬燈效果。
實現(xiàn)文字走馬燈效果的前提是該控件必須獲取焦點夕晓,而默認情況下所有的TextView是獲取不到焦點的 , 所以我們要在繼承TextView的自定義控件復寫isFocused方法煌恢,并且返回true尝苇,這樣改空間就可以獲取焦點扫皱,也就可以在界面一加載的時候實現(xiàn)走馬燈效果
②界面布局:Home主界面控件的展示通過GridView來實現(xiàn)逃糟。我們開發(fā)中顯示數據最常用的一個控件就是ListView,其實GridView和ListView都是繼承自同一個父類AbsListView躬贡,所以他們的用法差不多谆奥,都是通過給該控件設置適配器來實現(xiàn)數據的顯示
③底部菜單欄:這個底部菜單欄我是扒的早期的優(yōu)酷手機端的實現(xiàn)效果。我覺得這種菜單比較炫拂玻,所以就自己實現(xiàn)著玩 , 實現(xiàn)起來也比較簡單酸些,布局通過相對布局的方式來實現(xiàn),主要是動畫的實現(xiàn)和點擊事件的處理檐蚜。
動畫是一個旋轉動畫擂仍,點擊事件就是一些簡單的邏輯判斷和空間的顯示和隱藏控制
④點擊GridView選項的動畫處理:通過overridePendingTransition來實現(xiàn)界面切換時的動畫效果 , 我這里的動畫是縮放動畫(Scale),點擊某個選項時熬甚,舊的界面縮小到該選項的位置逢渔,新的界面再從該選項的位置放大到屏幕大小

(3)ImageView:
1)項目中知識點概述:這個ImageView模塊主要是用來展示圖片的一些控件。

①ViewPager:
a乡括、ViewPager概述:頂部導航部分是通過ViewPager實現(xiàn)的肃廓。
ViewPager是一個第三方標簽,在android_support-v4.jar包中诲泌,使用的時候需要通過包名.類名的方式導入盲赊。
通過給ViewPager設置PagerAdapter,復寫PagerAdapter的instantiateItem方法來實例化要現(xiàn)實的圖片和destroyItem方法去除圖片敷扫。
ViewPager控件不能像Gallery一樣一次滑動多張圖片哀蘑,ViewPager一次只能滑動一張圖片。為什么ViewPager只能滑動一張圖片呢葵第?
因為ViewPager顯示的時候只加載三張圖片绘迁,即當前顯示的圖片、當前顯示圖片的前一張圖片和后一張圖片卒密。
b缀台、如何實現(xiàn)ViewPager中圖片自動滑動:每隔2秒鐘,ViewPager控件里面的圖片會自定切換到下一張圖片哮奇,當切換到最后一張圖片時再切換回第一張圖片膛腐。
這可以通過計時器Timer或者線程池執(zhí)行者ScheduledExecutorService來實現(xiàn)ViewPger控件圖片的自動切換睛约。
但是,Timer存在一些bug哲身,Timer對調度的支持是基于絕對時間辩涝,而不是相對時間的,由此任務對系統(tǒng)時鐘的改變是敏感的;
而ScheduledThreadExecutor只支持相對時間勘天。比如你用Timer定時器每隔五分鐘執(zhí)行一個任務怔揩,任務跑起來后,你去修改當前系統(tǒng)的時鐘误辑,此時就會對當前正在執(zhí)行的任務造成影響。而用ScheduledExecutorService的的話歌逢,任務跑起來后巾钉,你修改系統(tǒng)時間對任務是沒有影響的。
所以在JDK1.5以后就逐漸不用Timer了秘案,開發(fā)中都用ScheduledExecutorService砰苍。
c、如何實現(xiàn)ViewPager中文字和點隨著圖片的滑動變化:當ViePager控件的圖片自動切換或者手動切換時阱高,其中的文字信息和點狀態(tài)會隨之改變赚导。
這是通過給ViewPager設置圖片改變事件監(jiān)聽器來實現(xiàn)。
當OnPageChangeListener監(jiān)聽到ViewPager顯示的圖片改變時會調用其onPageSelected方法赤惊,我們可以在該方法里面實現(xiàn)吼旧。
此實現(xiàn)過程需要一個變量來記錄上一次ViewPager顯示的圖片的位置position。
②ScrollView:
a未舟、ScrollView的概述:頂部的單選框是用RadioGroup實現(xiàn)的圈暗。當界面加載的時候根據要顯示的圖片數動態(tài)的創(chuàng)建相對應數目的RadioButton。圖片的顯示時通過自定義控件繼承ViewGroup來實現(xiàn)的裕膀。
通過復寫ViewGroup的onLayout完成子view在ViewGroup中的布局顯示员串。
onLayout方法實現(xiàn)ViewGroup中子View如何排列。當需要知道ViewGroup的子View如何排列時系統(tǒng)會自動調用此方法復寫ViewGroup的onTouchEvent()方法昼扛,將觸摸事件交給手勢識別器GestureDetector處理寸齐,手勢識別器可識別觸摸的各種手勢:點擊、按下抄谐、長按渺鹦、滾動、快速滑動等蛹含。通過復寫GestureDetector的onScroll()方法實現(xiàn)緩慢滑動和復寫onFling()方法實現(xiàn)快速滑動時切換圖片緩慢滑動松開手指時先判斷當前哪張圖片滑過屏幕的中點海铆,再通過View.scrollBy(dx, dy)或者Scroller.startScroll(startX, startY, dx, dy)方法將該圖片移動到屏幕中顯示,最后調用invalidate()方法更新界面快速滑動松開手指時會判斷滑動的速度和加速度方向挣惰,再將當前顯示的圖片切換到下一張圖片最后調用invalidate()方法更新界面 , 最后在繼承ViewGroup的自定義控件中提供一個監(jiān)聽器卧斟,監(jiān)聽ViewGroup顯示圖片的改變殴边。用來實現(xiàn)圖片改變時,RadioGroup中相對應的RadioButton的狀態(tài)變成選中珍语。
③Gallery:
a锤岸、Gallery概述:圖片的畫廊+倒影效果實現(xiàn)起來就稍微復雜了,需要的API比較多板乙,需要照相機Camera是偷、旋轉動畫Transformation和矩陣Matrix來實現(xiàn)圖片的變形顯示,需要Bitmap募逞、畫布Canvas蛋铆、畫筆Paint等API來實現(xiàn)倒影圖片的生成。另外需要處理的邏輯也稍微繞一點放接。
首先需要顯示圖片的畫廊準備好:自定義控件繼承Gallery刺啦,
在該繼承Gallery的自定義控件中復寫getChildStaticTransformation方法,該方法在Gallery中的圖片顯示狀態(tài)發(fā)生改變時被調用纠脾,在該方法里我們可以根據圖片顯示的位置計算出該圖片在Galery中顯示的旋轉位置玛瘸;
同時該繼承Gallery的自定義控件應該還有一個根據圖片距離Gallery顯示圖片的中心的位置不同控制Gallery中
圖片顯示的大小、角度苟蹈、亮度等信息的方法畫廊準備好了糊渊,接下來就是準備畫廊中要顯示的圖片:
自定義適配器繼承BaseAdapter,該繼承BaseAdapter的自定義控件提供一個生成倒影圖片的方法慧脱。
在該生產倒影圖片的方法中渺绒,處理源圖片和倒影圖片的間隔、遮罩效果菱鸥、漸變效果芒篷、去除圖片鋸齒等操作
畫廊和倒影圖片都準備好后,接下來就給畫廊設置自定義的適配器就OK了
④WaterFall:
a采缚、圖片瀑布流概述:圖片瀑布流需要大量的圖片資源针炉,這也是我這個自定義控件二十幾兆的原因之一。
這些圖片資源因為比較大扳抽,所以存放在資產assets目錄下的篡帕。為什么要存放在資產目錄下而不是存放在res目錄下呢?因為存放在res下的目錄下的資源都會被自愿編譯器編譯贸呢,生成資源引用镰烧,當資源文件比較大時編譯就比較麻煩,而放在assets目錄下的資源會原封不動的拷貝到.apk文件中楞陷。
(3)Dialog:
1)Dialog概述:
Dialog也是一個應用非常廣泛的控件怔鳖,幾乎所有的應用都用到這個控件。
在Android開發(fā)中固蛾,通知用戶的方式有三種:一種是吐司通知结执,一種是狀態(tài)欄通知度陆,還有一種就是我們最常用的對話框通知。
而對話框通知又分為單選對話框献幔、多選對話框懂傀、列表對話框、進度對話框等蜡感。
我這個三級地址聯(lián)動是通過AlertDialog的內部類Builder來實現(xiàn)的蹬蚁,比較簡單,只要是選擇地址的一些邏輯處理和地址空間的顯示隱藏郑兴。
用戶登錄界面是模仿的QQ登陸實現(xiàn)的犀斋。通過點擊右邊的下拉圖標彈出內容為一個ListView的PopupWindow。
這里這個PopupWindow這么丑主要是因為它掛在Dialog下面的緣故情连,因為掛在Dialog下面叽粹,所以PopupWindow的高度就被限制了。
針對這種情況蒙具,把登陸界面弄成一個Activity就行了球榆,我這里就是為了演示一下朽肥,實際開發(fā)中不會弄這么這么短這么丑的PopupWindow禁筏。
(4)ProgressBar:
1)ProgressBar概述:
①自定義水平進度條:
因為系統(tǒng)默認的進度條挺難看的,所以這里的進度條是自定義系統(tǒng)的水平進度條衡招。
通過查看Android SDK資源目錄res下的values文件夾中的styles.xml文件篱昔,該文件定義了Android系統(tǒng)所有的控件的預先樣式。
在該文件里面找到關于水平進度條的樣式的定義始腾,接著查看系統(tǒng)progress_horizontal.xml文件州刽,
直接拷貝progress_horizontal.xml,對其進行修改浪箭,就可以實現(xiàn)我們自定義的水平進度條的樣式了穗椅。
②病毒文件掃描動畫:
這個掃描動畫是一個旋轉動畫∧唐埽看這個動畫不是勻速的匹表,產生這個效果的原因主要是由動畫的效果決定的,
因為動畫本身默認的插入器就是先快后慢宣鄙。
如果想去實現(xiàn)勻速的效果也比較容易袍镀,我們可以在水平進度條沒掃描一個條目動畫旋轉二十度或者三十度來實現(xiàn)勻速的效果。
②病毒文件的掃描:
關于病毒軟件的掃描冻晤,實現(xiàn)起來也比較簡單苇羡。
殺毒軟件的原理:
殺毒軟件的原理就是比對文件的特征碼。
所謂的殺毒軟件其實就是一個文件清除器鼻弧。為什么叫文件清除器呢设江?因為病毒就是一個應用程序锦茁,也就是一個文件。
那什么是病毒呢绣硝?那要看你怎么去定義了鹉胖,所謂水能載舟亦能覆舟,一個道理挠铲。
如果一個軟件拂苹,你用在好的方面瓢棒,就是一個軟件;如果你用在壞的方面丘喻,就是一個病毒脯宿。
所謂病毒掃描,就是根據文件的特征碼去比對病毒數據庫泉粉。
2)SeekBar概述:
這個顯示和控制聲音的控件是通過自定義控件繼承View來實現(xiàn)的连霉。也可以做成豎直的SeekBar來實現(xiàn),豎直的SeekBar實現(xiàn)起來更簡單嗡靡。
該繼承View的自定義控件通過復寫View的onDraw方法將自己畫出來跺撼,通過兩種圖片,一張表示聲音的綠色條目和一張表示背景的灰色條目
onDraw方法根據當前音量分別將表示聲音的綠色部分和不表示聲音的灰色部分畫出來
該繼承View的自定義控件還提供一個調音接口和音量改變監(jiān)聽器讨彼,用來實現(xiàn)音量改變時改變控件的進度
(5)ListView:
1)ListView概述:
ListView的作用是顯示數據歉井。可以說我們開發(fā)中哈误,應用的數據大部分都是通過ListView來顯示哩至,
像社交類應用好友的顯示啊、新聞類應用新聞信息的顯示啊黑滴、多媒體類應用多媒體文件的顯示啊都是通過ListView來顯示的
顯示數據
ListView如何用?
首先要給ListView設置一個適配器Adapter憨募,把要顯示的數據交給適配器Adapter去處理,
另外ListView的getView方法每被調用一次顯示一個條目袁辈,都伴隨著一個舊的條目被移除媳危,故為了優(yōu)化ListView,
可以在getView()方法中重用舊條目convertView
還有ListView的getView方法中每執(zhí)行一次findViewById方法時暮蹂,都會加載相應布局的樹狀結構,再遍歷該樹狀結構找到指定id集侯,
當該布局的樹狀結構很復雜時,每次都查找id會比較麻煩辈讶,所以為了優(yōu)化我們可以提供一個ViewHolder類咳促,
用來記錄布局中的所有控件褂删,這樣布局中的控件id只需查找一次,再用時难衰,直接在ViewHolder類里面取
最后用ListView顯示大數據時,還需要進行分批加載或分頁顯示處理
2)下拉刷新:
這個下拉刷新控件是通過自定義控件繼承ListView實現(xiàn)的弟塞,通過ListView.addHeaderView方法將頭部下拉刷新的組件添加到ListView中
創(chuàng)建布局文件的時候再通過包名.類名的方式引入自定義控件。
其中頭部下拉刷新組件中下拉刷新箭頭的指向和下拉刷新文字信息的更新通過監(jiān)聽觸摸事件來實現(xiàn)系宫,
當ListView顯示的第一個條目的位置為0并且手指在屏幕Y軸方向上移動時,下拉刷新組件由下拉完成狀態(tài)變成下拉刷新狀態(tài);
當手指繼續(xù)在屏幕上移動且Y軸的位移大于下拉刷新組件的一半時错洁,下拉刷新組件的狀態(tài)由下拉刷新變?yōu)樗砷_刷新狀態(tài)
當松開手指時,下拉刷新組件的狀態(tài)由松開刷新變成正在刷新
當正在刷新完成后导而,下拉刷新組件的狀態(tài)就變成默認的下拉完成狀態(tài)
3)分批分頁處理:

2、智能短信分類管理器:
(1)項目概述:
智能短信分類管理器這個項目是聯(lián)想和中國移動合作的項目虚缎,屬于定制機,是一個系統(tǒng)級訂制項目。
需要重新給系統(tǒng)打一個安裝包题涨,需要封裝中國移動的一些信息搭盾,所以很多界面都需要重新做。
聯(lián)想的手機系統(tǒng)不是Android的原生系統(tǒng)蝌以,是樂Phone2.5版本以后關于短信的一個應用。把短信系統(tǒng)重新進行了封裝徊件。
(2)五大功能模塊:
1)會話列表,顯示短信
使用Android自身提供的異步查詢框架AsyncQueryHandler查詢手機短信,查看系統(tǒng)短信源碼TelephonyProvider
2)文件夾
對短信進行分類管理新思。分為收件箱、發(fā)件箱崔兴、已發(fā)送和草稿箱位谋,并且對短信進行了日期分隔顯示笋轨。
3)群組:
提供給用戶根據短信自定義分組管理的

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洁灵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖牍汹,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡有决,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苟呐,“玉大人,你說我怎么就攤上這事笆呆《砭” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碳胳。 經常有香客問我,道長诫惭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮篮撑,結果婚禮上,老公的妹妹穿的比我還像新娘茧妒。我一直安慰自己,他們只是感情好九昧,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布皂岔。 她就那樣靜靜地躺著剖毯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胶滋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音窟赏,去河邊找鬼。 笑死拷况,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播揽咕,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼设易,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起讼昆,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掺炭,沒想到半個月后涧狮,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了衬廷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡酗宋,死狀恐怖斥扛,靈堂內的尸體忽然破棺而出芬失,到底是詐尸還是另有隱情棱烂,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布衬鱼,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏岁经。R本人自食惡果不足惜缀壤,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一菜枷、第九天 我趴在偏房一處隱蔽的房頂上張望岳瞭。 院中可真熱鬧稚瘾,春花似錦、人聲如沸些椒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棺棵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缚柏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工杀餐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人必峰。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親术唬。 傳聞我的和親對象是個殘疾皇子嫁怀,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • 1存捺、通過CocoaPods安裝項目名稱項目信息 AFNetworking網絡請求組件 FMDB本地數據庫組件 SD...
    陽明先生_x閱讀 15,968評論 3 119
  • 感恩 —— 愛人為了帶我吃正宗的襄陽牛雜面,繞了好幾圈兼吓,終于找到了,愛人先吃完浑娜,看著我吃的有點急,愛人說慢慢吃瘸洛,不...
    慢慢花開閱讀 150評論 0 0
  • 你聽日熬,長笛耘纱,是長笛之音在呼喚:我束析,來了!你憎亚,在哪兒员寇? 長笛,低音婉轉第美,曲調透明又悠揚蝶锋,仿佛正在述說...
    段靖閱讀 438評論 6 4
  • 寫在前面:最近一直有一個疑惑蔫慧,為什么我感覺區(qū)塊鏈這個東西,已經黏上了我身體上的每一個觸須虑粥,而身邊竟還有人完全對此一...
    一夜讀閱讀 4,004評論 0 5