<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Android系統開(kāi)發(fā)全攻略(二)

Android系統開(kāi)發(fā)全攻略(二)

作者: 時(shí)間:2012-06-08 來(lái)源:網(wǎng)絡(luò ) 收藏

  當發(fā)現藍牙功能未啟用時(shí),如下調用設置啟用藍牙:

  當發(fā)現藍牙功能未啟用時(shí),如下調用設置啟用藍牙

  如果發(fā)現當前設備沒(méi)有打開(kāi)對外可見(jiàn)模式,則傳遞 Intent 來(lái)調用打開(kāi)可發(fā)現模式,代碼如下:

  如果發(fā)現當前設備沒(méi)有打開(kāi)對外可見(jiàn)模式,則傳遞 Intent 來(lái)調用打開(kāi)可發(fā)現模式

  BluetoothDevice 類(lèi),此為對應的遠程藍牙 Device

  createRfcommSocketToServiceRecord() :創(chuàng )建該 Device 的 socket 。

  BluetoothSocket 類(lèi)

  connect() :請求連接藍牙。

  getInputStream() :得到輸入流,用于接收遠程方信息。

  getOutputStream() :得到輸出流,發(fā)送給遠程方的信息。

  close() :關(guān)閉藍牙連接。

  InputStream 類(lèi):

  read(byte[]) :以阻塞方式讀取輸入流。

  OutputStream 類(lèi):

  write(byte[]) :將信息寫(xiě)入該輸出流,發(fā)送給遠程。

  3. BluetoothChat 例程分析

  Google 提供的關(guān)于 Bluetooth 的例程為 Bluetoothchat ,使用截圖可見(jiàn)本文一開(kāi)始。除去配置及 ui 定義等文件,主程序文件共三個(gè): BluetoothChat.java 、 BluetoothChatService.java 以及 DeviceListActivity.java ,詳細功能可見(jiàn)下面的描述。

  3.1. 整體調用關(guān)系序列圖

 整體調用關(guān)系序列圖  

  3.2. BluetoothChat.java

  例程的主 Activity 。 onCreate() 得到本地 BluetoothAdapter 設備,檢查是否支持。 onStart() 中檢查是否啟用藍牙,并請求啟用,然后執行 setupChat() 。 setupChat() 中先對界面中的控件進(jìn)行初始化增加點(diǎn)擊監聽(tīng)器等,然創(chuàng )建 BluetoothChatService 對象,該對象在整個(gè)應用過(guò)程中存在,并執行藍牙連接建立、消息發(fā)送接受等實(shí)際的行為。

  3.3. BluetoothChatService.java

  public synchronized void start() :

  開(kāi)啟 mAcceptThread 線(xiàn)程,由于樣例程序是僅 2 人的聊天過(guò)程,故之前先檢測 mConnectThread 和 mConnectedThread 是否運行,運行則先退出這些線(xiàn)程。

  public synchronized void connect(BluetoothDevice device) :

  取消 CONNECTING 和 CONNECTED 狀態(tài)下的相關(guān)線(xiàn)程,然后運行新的 mConnectThread 線(xiàn)程。

  public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) :

  開(kāi)啟一個(gè) ConnectedThread 來(lái)管理對應的當前連接。之前先取消任意現存的 mConnectThread 、 mConnectedThread 、 mAcceptThread 線(xiàn)程,然后開(kāi)啟新 mConnectedThread ,傳入當前剛剛接受的 socket 連接。最后通過(guò) Handler 來(lái)通知 UI 連接 OK 。

  public synchronized void stop() :

  停止所有相關(guān)線(xiàn)程,設當前狀態(tài)為 NONE 。

  public void write(byte[] out) :

  在 STATE_CONNECTED 狀態(tài)下,調用 mConnectedThread 里的 write 方法,寫(xiě)入 byte 。

  private void connectionFailed() :

  連接失敗的時(shí)候處理,通知 ui ,并設為 STATE_LISTEN 狀態(tài)。

  private void connectionLost() :

  當連接失去的時(shí)候,設為 STATE_LISTEN 狀態(tài)并通知 ui 。

  內部類(lèi):

  private class AcceptThread extends Thread :

  創(chuàng )建監聽(tīng)線(xiàn)程,準備接受新連接。使用阻塞方式,調用 BluetoothServerSocket.accept() 。提供 cancel 方法關(guān)閉 socket 。

  private class ConnectThread extends Thread :

  這是定義的連接線(xiàn)程,專(zhuān)門(mén)用來(lái)對外發(fā)出連接對方藍牙的請求和處理流程。構造函數里通過(guò) BluetoothDevice.createRfcommSocketToServiceRecord() ,從待連接的 device 產(chǎn)生 BluetoothSocket. 然后在 run 方法中 connect ,成功后調用 BluetoothChatSevice 的 connected() 方法。定義 cancel() 在關(guān)閉線(xiàn)程時(shí)能夠關(guān)閉相關(guān) socket 。

  private class ConnectedThread extends Thread :

  這個(gè)是雙方藍牙連接后一直運行的線(xiàn)程。構造函數中設置輸入輸出流。 Run 方法中使用阻塞模式的 InputStream.read() 循環(huán)讀取輸入流, 然后 post 到 UI 線(xiàn)程中更新聊天消息。也提供了 write() 將聊天消息寫(xiě)入輸出流傳輸至對方,傳輸成功后回寫(xiě)入 UI 線(xiàn)程。最后 cancel() 關(guān)閉連接的 socket 。

  3.4. DeviceListActivity.java

  該類(lèi)包含 UI 和操作的 Activity 類(lèi),作用是得到默認藍牙設備的已配對設備列表,以及搜索出的未配對的新設備的列表。然后提供點(diǎn)擊后發(fā)出連接設備請求的功能。

  除了 RFCOMM 通信外, 上關(guān)于 Bluetooth 的還有 SDP 、 GAP 、耳機設備連接等內容,本文還未涉及,將會(huì )隨著(zhù)藍牙相關(guān) API 在新版本中的進(jìn)一步完善來(lái)學(xué)習使用。

四、智能手機平臺多分辨率解決方案詳解

  摘 要:近年來(lái),智能手機的功能越來(lái)越強大,移動(dòng)終端應用程序層出不窮,移動(dòng)互聯(lián)網(wǎng)改變人們的生活。 是開(kāi)放手機聯(lián)盟推出的一款開(kāi)源的手機操作,正是由于其開(kāi)放性,沒(méi)有采用Windows PhONe7 類(lèi)似的硬件限定標準,目前基于A(yíng)ndroid系統的機型越來(lái)越多,一些硬件指標出現了混亂的局面,其中最明顯的就是屏幕分辨率的問(wèn)題。如何使者的應用程序盡可能多地適應多種分辨率,正是本文要講述的問(wèn)題。文章首先介紹Android 的系統架構,然后介紹Android 平臺中分辨率的相關(guān)術(shù)語(yǔ),之后重點(diǎn)講述在過(guò)程中如何部署資源以及所應遵循的原則,最后給出測試多分辨率兼容性的方法。

  0 引 言

  2007 年11 月,Google 公司發(fā)布基于Linux2.6 內核的移動(dòng)終端操作系統- Android, 由于其開(kāi)源性, 得到很多手機廠(chǎng)商的追捧和應用開(kāi)發(fā)者的青睞。近年來(lái)智能手機發(fā)展迅速,運行速度、存儲容量和可靠性等指標有了顯著(zhù)提高[1],當今的智能手機用戶(hù)對應用軟件的舒適性和美觀(guān)性有了更大的期望,應用程序界面友好性已經(jīng)越來(lái)越重要。但是由于A(yíng)ndroid 的開(kāi)源性,硬件廠(chǎng)商屏幕分辨率不統一,據統計目前市場(chǎng)上Android系統手機的分辨率有10 余種,分辨率分布如此廣泛使得開(kāi)發(fā)者在處理多分辨率適應方面遇到了不少難題。文章首先介紹Android 平臺的系統架構及資源管理方法,之后介紹目前開(kāi)發(fā)者在處理多分辨率時(shí)采用的方法,而后重點(diǎn)分析Android 平臺資源加載機制并且結合實(shí)例給出多分辨率的處理步驟及技巧,最后介紹測試多分辨率效果的方法。

  1 Android 平臺簡(jiǎn)介

  Android 是一個(gè)包括操作系統、中間件和關(guān)鍵應用的移動(dòng)設備軟件堆[2],Android 系統和其他系統一樣,采用分層的架構。由下至上依此為L(cháng)inux 操作系統和驅動(dòng)、程序庫及Android 運行時(shí)環(huán)境、應用程序框架層、應用層。 Android 應用程序的基本組件有Activity、Intent、BroadcaSTReceiver、Service 四種,各個(gè)組件的配置信息以及權限管理、版本管理等配置信息都保存在A(yíng)ndroidManifest.xml 中。

  1.1 Android 應用程序資源管理

  手機界面上加載的圖片是Android 資源的一種,除此之外還有XML 資源(anim.xml layout.xml 等) 以及原數據文件( 音視頻文件等)[3]。新建一個(gè)HelloAndroid 的Android 應用程序,默認生成的文件架構包含src,gen,assets,res 等文件夾,以及AndroidManifest.xml 配置文件。src 文件夾中保存的是Android 源代碼,res 文件夾代表應用程序需要使用到的資源文件,gen 包中包含R.java 文件。Res 文件夾中包含的所有資源文件都對應在R.java 中。

  當開(kāi)發(fā)者在res/ 目錄中任何一個(gè)子目錄中添加相應類(lèi)型的文件之后,ADT 會(huì )在R.java 文件中相應的匿名內部類(lèi)中國自動(dòng)生成一條靜態(tài)int 類(lèi)型的常量,對添加的文件進(jìn)行索引。

  Android 系統采取這種架構使視圖等資源文件與控制代碼分離,實(shí)現松耦合。然而可以使用R.java 文件在代碼中對相應的資源文件進(jìn)行存取,靈活操作。

  1.2 一般多分辨率處理方法及其缺點(diǎn)

  1.2.1 圖片縮放

  基于當前屏幕的精度,平臺自動(dòng)加載任何未經(jīng)縮放的限定尺寸和精度的圖片。如果圖片不匹配,平臺會(huì )加載默認資源并且在放大或者縮小之后可以滿(mǎn)足當前界面的顯示要求。例如,當前為高精度屏幕,平臺會(huì )加載高精度資源(如HelloAndroid中drawable-hdpi 中的位圖資源),如果沒(méi)有,平臺會(huì )將中精度資源縮放至高精度,導致圖片顯示不清晰。

  1.2.2 自動(dòng)定義像素尺寸和位置

  如果程序不支持多種精度屏幕,平臺會(huì )自動(dòng)定義像素絕對位置和尺寸值等,這樣就能保證元素能和精度160 的屏幕上一樣能顯示出同樣尺寸的效果。例如,要讓W(xué)VGA 高精度屏幕和傳統的HVGA 屏幕一樣顯示同樣尺寸的圖片,當程序不支持時(shí),系統會(huì )對程序慌稱(chēng)屏幕分辨率為320×480,在(10,10)到(100,100)的區域內繪制圖形完成之后,系統會(huì )將圖形放大到(15,15)到(150,150)的屏幕顯示區域。

  1.2.3 兼容更大尺寸的屏幕

  當前屏幕超過(guò)程序所支持屏幕的上限時(shí),定義supportsscreens元素,這樣超出顯示的基準線(xiàn)時(shí),平臺在此顯示黑色的背景圖。例如,WVGA 中精度屏幕上,如程序不支持這樣的大屏幕,系統會(huì )謊稱(chēng)是一個(gè)320×480 的,多余的顯示區域會(huì )被填充成黑色。

  1.2.4 采用OpenGL 動(dòng)態(tài)繪制圖片

  Android 底層提供了OpenGL 的接口和方法,可以動(dòng)態(tài)繪制圖片,但是這種方式對不熟悉計算機圖形學(xué)的開(kāi)發(fā)者來(lái)講是一個(gè)很大的挑戰。一般開(kāi)發(fā)游戲,采用OpenGL 方式。

  1.2.5 多個(gè)apk 文件

  Symbian 和傳統的J2ME 就是采用這種方式,為一款應用提供多個(gè)分辨率版本,用戶(hù)根據自己的需求下載安裝相應的可執行文件。針對每一種屏幕單獨開(kāi)發(fā)應用程序不失為一種好方法,但是目前Google Market 對一個(gè)應用程序多個(gè)分辨率版本的支持還不完善,開(kāi)發(fā)者還是需要盡可能使用一個(gè)apk 文件適應多個(gè)分辨率。

2 多分辨率處理方案詳解

  2.1 基本術(shù)語(yǔ)介紹

  2.1.1 屏幕尺寸

  真正的物理尺寸,屏幕對角線(xiàn)的長(cháng)度,單位是英寸。為了簡(jiǎn)化起見(jiàn),Android 把支持的所有物理尺寸分成了4 組:small,normal, large, extra large.

  2.1.2 屏幕密度Density

  一定物理范圍的像素的個(gè)數,單位通常是dpi(dots perinch), 即每英寸的點(diǎn)數。例如一個(gè)低分辨率屏幕相對于高分辨率屏幕在一定的物理區域內包含的像素點(diǎn)要少。為了簡(jiǎn)化起見(jiàn),Android 將所有的屏幕密度分成四組:low, medium,high 和extra high.

  2.1.3 方向Orientation

  從用戶(hù)視角來(lái)看的屏幕的方向,Portrait 縱向和Landscape 橫向。

  2.1.4 分辨率Resolution

  屏幕上所有的像素點(diǎn)數目,一般用480*800 的形式來(lái)表示。密度無(wú)關(guān)像素dp: Android 平臺中虛擬的像素單位,定義成一種密度無(wú)關(guān)的形式,像素px 和dp 的轉換公式為 px =dp*(dpi/160)。在界面開(kāi)發(fā)中應使用dp 作為像素單位,從而保證在不同的屏幕密度上控件所占的實(shí)際px 因密度而自動(dòng)調整。

  2.2 手機屏幕的分類(lèi)

  Android 采用兩種標準對屏幕進(jìn)行分類(lèi)。按照屏幕尺寸分為四組small, normal, large, extra large;按照屏幕密度分為四組 low, medium ,high 和extra high,其分界線(xiàn)如圖1所示。

  圖1 Android 中的屏幕分類(lèi)

  圖1 Android 中的屏幕分類(lèi)

  為了優(yōu)化程序UI,讓其適應多種分辨率并能清晰顯示,一般情況下需要為不同屏幕大小密度提供不同的圖片文件和對應的布局文件,在運行的時(shí)候,Android 系統會(huì )根據當前設備的屏幕大小及密度等信息,選擇加載其中一套匹配的資源加以運行,從而達到適應多分辨率的效果。

  2.3 Android 支持多分辨率原理及步驟

  由以上分析,默認的加載方式都不能很好地適應不同的分辨率,Android 從1.6 開(kāi)始支持多種分辨率的處理,原理簡(jiǎn)而言之就是根據屏幕參數,動(dòng)態(tài)加載資源文件。在A(yíng)ndroid 項目文件結構中,drawable 文件夾下包含三個(gè)子文件夾,分別為drawable-hdpi, drawable-mdpi, drawable-ldpi, 分別存放hdpi,mdpi,ldip 的位圖。應用程序運行時(shí),Android 系統會(huì )根據當前設備的屏幕大小、分辨率、屏幕密度、方向、長(cháng)寬比等信息,選擇相應文件夾進(jìn)行加載。Android 配置修飾符的定義規則如下:

  1)在res 文件夾下新建目錄,命名為《resources_name》-《qualifier》 這種格式,其中《resources_name》 為標準資源名稱(chēng),例如drawable 或者layout;《qualifier》 即修飾符,指定對應的屏幕參數,比如normal/small/large,hdpi/mdpi/ldpi,land/port,long/notlong 等。

  2)在步驟1 新建的文件夾中存入相應的資源,比如位圖資源或者layout 資源,資源文件的名字必須與默認資源文件的名字相同。例如:

  

  3)Android 系統支持多分辨率的機制離不開(kāi)Android-Manifest.xml 文件的supports-screen 元素,若應用程序要適應多種分辨率,需要將anyDensity 設置為true.

  2.4 界面設計技巧

  前面的部分已經(jīng)詳細講解了如何架構應用程序使其更好地適應多種分辨率屏幕,此外,在界面設計和控制中我們還應該掌握一些原則或者技巧,從而使應用程序界面友好、適應性強。

  1)在XML layout 文件中定義長(cháng)度的時(shí)候,最好使用wrap_content,fill_parent, 或者dp 進(jìn)行描述,這樣可以保證在屏幕上面展示的時(shí)候有合適的大小。例如,一個(gè)view layout_width=“100dip”,在 HVGA@160 density 的設備上顯示100 個(gè)px,而在 WVGA@240 density 的設備上顯示150 個(gè)px,但是所占的物理尺寸時(shí)相同的。

  2)在A(yíng)ctivity 或者其他控制視圖加載的代碼處,不要使用像素單位的硬編碼。

  3)不要使用AbsoluteLayout.絕對布局是由AndroidUI toolkit 提供的布局容器中的一種。但是與其他layout 不一樣的是,AbsoluteLayout 使用固定的位置表示,使得在不同的屏幕上面顯示效果不好,因此AbsoluteLayout 在sdk1.6 及以后的版本中被棄用了。

  4)為不同屏幕密度的手機,提供不同的位圖資源,可以使得界面清晰無(wú)縮放。

  3 多分辨率兼容性測試方案

  在產(chǎn)品發(fā)行之前,要在所有的目標手機上進(jìn)行全面的測試。Android SDK 包含了一套測試多分辨率的機制??梢宰约憾ㄖ芶vd 作為應用程序的測試環(huán)境,avd 會(huì )模擬真實(shí)機器的屏幕大小和密度。例如圖2 為模擬器的列表,可以將程序運行在這四個(gè)模擬器中進(jìn)行多分辨率的測試。

  圖2 虛擬機列表

  圖2 虛擬機列表

  4 結論

  本文介紹Android 平臺的體系架構和分辨率相關(guān)的術(shù)語(yǔ),詳細論述資源加載原理和多分辨率處理的詳細流程,最后給出了測試應用程序是否適應多種分辨率的方法。結合本人實(shí)踐經(jīng)驗進(jìn)行講述,內容深入淺出,較完整地論述了如何使應用程序盡可能多地適應多種分辨率屏幕。


上一頁(yè) 1 2 3 4 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>