Android開發網上的一些重要知識點 [1]

來源:互聯網
上載者:User

1. android單一實例運行方法

我們都知道Android平台沒有工作管理員,而內部App維護者一個Activity history stack來實現視窗顯示和銷毀,對於常規從捷徑運行來看都是startActivity可能會使用FLAG_ACTIVITY_NEW_TASK標記來開啟一個新視窗,比如Launcher,所以考慮單任務的實現方法比較簡單,首先Android123糾正下大家一種錯誤的方法就是直接在androidmanifest.xml的application節點中加入android:launchMode="singleInstance"這句,其實這樣將不會起到任何作用,Apps內部維護的曆史棧作用於Activity,我們必須在activity節點中加入android:launchMode="singleInstance" 這句才能保證單一實例,當然一般均加在主程式啟動視窗的Activity。

2. px像素如何轉為dip裝置獨立像素

最近有網友問如何將px像素轉為dip獨立裝置像素,由於Android的裝置解析度眾多,目前主流的為wvga,而很多老的裝置為hvga甚至低端的qvga,對於相容性來說使用dip無非是比較方便的,由於他和解析度無關和螢幕的密度大小有關,所以推薦使用。  px= (int) (dip*density+0.5f) //這裡android開發網提示大家很多網友擷取density(密度)的方法存在問題,從資源中擷取的是靜態定義的,一般為1.0對於HVGA是正好的,而對於wvga這樣的應該從WindowsManager中擷取,WVGA為1.5

這裡可以再補充一下dip,sip的知識

3. Android中動態改變ImageView大小

很多網友可能發現在layout.xml檔案中定義了ImageView的絕對大小後,無法動態修改以後的大小顯示,其實Android平台在設計UI控制項時考慮到這個問題,為了適應不同的Drawable可以通過在xml的相關ImageView中加入android:scaleType="fitXY" 這行即可,但因為使用了縮放可能會造成當前UI有所變形。使用的前提是限制ImageView所在的層,可以使用一個內嵌的方法限制顯示。

4. 如何判斷Android手機當前是否連網?

如果擬開發一個網路應用的程式,首先考慮是否接入網路,在Android手機中判斷是否連網可以通過 ConnectivityManager 類的isAvailable()方法判斷,首先擷取網路通訊類的執行個體 ConnectivityManager cwjManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); ,使用cwjManager.getActiveNetworkInfo().isAvailable(); 來返回是否有效,如果為True則表示當前Android手機已經連網,可能是WiFi或GPRS、HSDPA等等,具體的可以通過ConnectivityManager 類的getActiveNetworkInfo() 方法判斷詳細的接入方式,需要注意的是有關調用需要加入<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 這個許可權,android開發網提醒大家在真機上Market和Browser程式都使用了這個方法,來判斷是否繼續,同時在一些網路逾時的時候也可以檢查下網路連接是否存在,以免浪費手機上的電力資源。

5. Drawable、Bitmap、Canvas和Paint的關係

很多網友剛剛開始學習Android平台,對於Drawable、Bitmap、Canvas和Paint它們之間的概念不是很清楚,其實它們除了Drawable外早在Sun的J2ME中就已經出現了,但是在Android平台中,Bitmap、Canvas相關的都有所變化。

  首先讓我們理解下Android平台中的顯示類是View,但是還提供了底層圖形類android.graphics,今天所說的這些均為graphics底層圖形介面。

  Bitmap - 稱作位元影像,一般位元影像的檔案格式尾碼為bmp,當然編碼器也有很多如RGB565、RGB888。作為一種逐像素的顯示對象執行效率高,但是缺點也很明顯儲存效率低。我們理解為一種儲存物件比較好。

  Drawable - 作為Android平下通用的繪圖物件,它可以裝載常用格式的映像,比如GIF、PNG、JPG,當然也支援BMP,當然還提供一些進階的可視化對象,比如漸層、圖形等。

  Canvas - 名為畫布,我們可以看作是一種處理過程,使用各種方法來管理Bitmap、GL或者Path路徑,同時它可以配合Matrix矩陣類給映像做旋轉、縮放等操作,同時Canvas類還提供了裁剪、選取等操作。

   Paint - 我們可以把它看做一個畫圖工具,比如畫筆、畫刷。他管理了每個畫圖工具的字型、顏色、樣式。

  如果涉及一些Android遊戲開發、顯示特效可以通過這些底層圖形類來高效實現自己的應用。

6. Activity切換導致的onCreate重複執行

部分網友會發現Activity在切換到後台或布局從橫屏LANDSCAPE切換到PORTRAIT,會重新切換Activity會觸發一次onCreate方法,我們可以在androidmanifest.xml中的activit元素加入這個屬性android:configChanges="orientation|keyboardHidden" 即可,比如

<activity android:name=".android123" android:configChanges="orientation|keyboardHidden" android:label="@string/app_name">

  同時在Activity的Java檔案中重載onConfigurationChanged(Configuration newConfig)這個方法,這樣就不會在布局切換或視窗切換時重載onCreate等方法。代碼如下:

@Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
     if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
     {
//land
     }
     else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
     {
//port
     }
    }

7. Android的ImageButton問題

很多網友對Android提供的ImageButton有個疑問,當顯示Drawable圖片時就不會再顯示文字了,其實解決的方法有兩種,第一種就是圖片中就寫入文字,但是這樣解決會增加程式體積,同時寫入程式碼方式會影響多國語言的發布。第二種解決方案很簡單,通過分析可以看到ImageButton的layout,我們可以直接直接繼承,添加一個TextView,對齊為右側即可實現ImageButton支援文字右側顯示。

8. Android代碼最佳化技術

1.Java記憶體控制

  對於字串操作而言如果需要連加這樣的操作建議使用StringBuilder,經過調試不難發現如果你的字串每次連加,使用String需要的記憶體開銷會遠大於StringBuilder,然後Android手機常規的運行記憶體大約在128MB左右,對於運行多任務就需要考慮了,Android開發網提示因為Java有GC不需要手動釋放那麼分配的時候就要格外的小心,頻繁的GC操作仍然是很影響效能的,在調試時我們可以通過logcat查看記憶體釋放情況。

  2.迴圈使用

  平時在訪問一個屬性的時候效率遠比一個固定變數低,如果你的迴圈估計次數常常大於5,假設xxx.GetLength()方法的值一般大於5,推薦這樣寫,比如

  for(int i=0;i<xxx.GetLength();i++)

  這裡xxx.GetLength在每次迴圈都要調用,必然會影響程式效率,在遊戲開發中顯得更為明顯,改進的方法應該為

  int j=xxx.GetLength()

   for(int i=0;i<j;i++)

  3.圖片的最佳化

  在Android平台中2維影像處理庫BitmapFactory做的比較智能,為了減少檔案體積和效率,常常不用很多資源檔,而把很多小圖片放在一個圖片中,有切片的方式來完成,在J2ME中我們這樣是為了將少檔案頭而解決MIDP這些裝置的問題,而Android中雖然機型硬體設定都比較高,有關Android G1硬體設定可以參考G1手機參數以及評測,但是當資源多時這樣的運行效率還是令人滿意的,至少Dalvik最佳化的還不是很夠。

9. Android開發進階之NIO非阻塞包(一)

對於Android的網路通訊效能的提高,我們可以使用Java上高效能的NIO (New I/O) 技術進行處理,NIO是從JDK 1.4開始引入的,NIO的N我們可以理解為Noblocking即非阻塞的意思,相對應傳統的I/O,比如Socket的accpet()、read()這些方法而言都是阻塞的。

  NIO主要使用了Channel和Selector來實現,Java的Selector類似Winsock的Select模式,是一種基於事件驅動的,整個處理方法使用了輪訓的狀態機器,如果你過去開發過Symbian應用的話這種方式有點像使用中的物件,好處就是單線程更節省系統開銷,NIO的好處可以很好的處理並發,對於Android網遊開發來說比較關鍵,對於多點Socket串連而言使用NIO可以大大減少線程使用,降低了線程死結的機率,畢竟手機遊戲有UI線程,音樂線程,網路線程,管理的難度可想而知,同時I/O這種低速裝置將影響遊戲的體驗。

  NIO作為一種中高負載的I/O模型,相對於傳統的BIO (Blocking I/O)來說有了很大的提高,處理並發不用太多的線程,省去了建立銷毀的時間,如果線程過多調度是問題,同時很多線程可能處於空閑狀態,大大浪費了CPU時間,同時過多的線程可能是效能大幅下降,一般的解決方案中可能使用線程池來管理調度但這種方法治標不治本。使用NIO可以使並發的效率大大提高。當然NIO和JDK 7中的AIO還存在一些區別,AIO作為一種更新的當然這是對於Java而言,如果你開發過Winsock伺服器,那麼IOCP這樣的I/O完成連接埠可以解決更進階的負載,當然了今天Android123主要給大家講解下為什麼使用NIO在Android中有哪些用處。

   NIO我們分為幾個類型分別描述,作為Java的特性之一,我們需要瞭解一些新的概念,比如ByteBuffer類,Channel,SocketChannel,ServerSocketChannel,Selector和SelectionKey。有關具體的使用,Android開發網將在明天詳細講解。網友可以在Android SDK文檔中看下java.nio和java.nio.channels兩個包瞭解。http://www.android123.com.cn/androidkaifa/695.html

瞭解下這種技術,看看在馬上要做的項目中是否用得到

10. Android Theme和Styles內部定義解析

昨天我們講到的有關在AndroidManifest.xml中定義Activity的theme方法來實現無標題的方法,在使用xml讓你的Activity無標題方法 一文中講到的,很多網友不明白為什麼這樣做,其實在Android123以前的文章中多次提到了styles樣式定義方法,今天Android開發網再次把一些網友回顧瞭解下android樣式的內部定義。在一個工程的res/values/theme.xml中我們可以方便的定義自己的風格主題,比如下面的cwjTheme中我們使用了基於android內部的白色調的背景Theme.Light,設定windowsNoTitle為true代表沒有標題,背景顏色我們使用了android內部定義的透明,同時設定listView控制項的樣式為cwjListView,xml樣式代碼如下:

  <?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="cwjTheme" parent="android:Theme.Light">
   <item name="android:windowNoTitle">true</item>
   <item name="android:windowBackground">@android:color/transparent</item>
   <item name="android:listViewStyle">@style/cwjListView</item>
</style> 

有關ListView控制項我們自訂的風格就是修改下系統listview這個控制項的每行分隔字元樣式,這裡我們在工程下res/drawable檔案夾下放一個圖片名為list_selector圖片,這樣我們的cwjListView的代碼可以這樣寫

  <style name="cwjListView" parent="@android:style/Widget.ListView">
     <item name="android:listSelector">@drawable/list_selector</item>
   </style>
</resources>

  通過定義style可以設定更多,比如讓cwjListView的字型顏色就加入textAppearance屬性,比如 <item name="textAppearance">@android:style/TextAppearance</item> 等等。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.