android開發零散問題彙總以及知識點整理

1、
  1. http協議使用html

    post/get/put/deleteandroid

    參數設置
  2. 數據加密(對稱加密,非對稱加密 ------瞭解下算法)
  3. JSON 、XML、HTML數據格式和解析,及其使用
  4. 頁面跳轉時計時器的及時銷燬和重建,銷燬和重建的時機。算法

    (相似地,要完全理解並記住android組件和fragment的生命週期,及其回調函數的調用時機)----這是重點。
  5. 註冊成功後的動畫(像兩扇門開啓,開啓後頁面不是動畫前頁面而是另外頁面)問題:解決方法開啓異步線程啓動成功頁面,而後繼續原線程中銷燬自己(若加計時器時間上可能不是很好控制)。
  6. 異步網絡請求後,回調主線程中的方法時,要判斷fragment是否添加到activity中(isAdded()方法),不然可能出現getActivity()拋出異常的狀況。數據庫

           Fragment 生命週期。  fragment中嵌套fragment時,使用getChildFragmentManager管理嵌套的fragment。

2、canvas

  推送服務數組

     service服務:androd:process = " " , android.process = " "安全

  (微信和淘寶的不死service)性能優化


  開發前準備:
    1. 仔細觀察設計圖,想好開發思路。肯定UI。微信

    2. 準確理解業務和設計要求是關鍵。

  開發中問題以及解決方法:
    1.標籤文本解析(同XML解析)。
    2.流程不符設計形成的返工問題。網絡

              後臺線程循環請求數據後讀寫數據庫可能形成的死鎖。
     循環數據請求,而不是函數回調方法。回調方法可能形成的棧溢出問題。
    3.同一TextView中點擊不一樣文本觸發不一樣事件的方案:ClickableSpan
    4.點擊文字出現的背景色問題。
      http://www.cnblogs.com/sxzheng/p/4245873.html

3、
  1.列表加載性別頭像閃動問題。
    解決方法:setImageResource()
  2.StickyListHeadersListView開源庫的實現原理,android中AdapterView的View回收和複用機制。

  3.下拉刷新列表重複問題。

    服務端ID方法

    相似信號量機制同步刷新

    map濾重

  4.鍵盤落下黑色背景問題。

    (目前對輸入法研究較少,還未找到較好的解決思路)

  5.上拉加載動畫顯示。

    判斷滑動到底部是關鍵

  6.鍵盤隱藏監聽事件。

 1 //該Activity的最外層Layout
 2 finalView activityRootView = findViewById(R.id.activityRoot);
 3 //給該layout設置監聽,監聽其佈局發生變化事件
 4 activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(newOnGlobalLayoutListener(){
 5  
 6     @Override
 7     publicvoid onGlobalLayout(){
 8        //比較Activity根佈局與當前佈局的大小
 9         int heightDiff = activityRootView.getRootView().getHeight()- activityRootView.getHeight();
10         if(heightDiff >100){
11         //大小超過100時,通常爲顯示虛擬鍵盤事件
12              }else{
13         //大小小於100時,爲不顯示虛擬鍵盤或虛擬鍵盤隱藏
14        }
15      }
16 });

   7. 許多應用中點擊評論內容彈出的菜單欄

    popupwindow   解決的三個問題:模態對話框問題,點擊空白區域不消失,顯示位置(點哪就在哪顯示)

4、

  相機矯正(美圖作法是讓用戶手動矯正)

  濾鏡的實現方法:轉化到HSV顏色空間,調整參數

  濾鏡實現工具:opengl es 2.0 

5、
  1.單點按住圖片拖拽旋轉(相似許多應用中的貼紙功能) 


  2.Android繪圖機制 (invalidate-->onDraw,layout,onMeasure  ...... drawable)

    1)重寫onDraw() -->Canvas(本身調用) -->Bitmap(系統管理)

    2)自定義Canvas(自帶Bitmap) 畫好的Bitmap移到系統的Canvas(Canvas.drawBitmap(Bitmap,Canvas...)

  3.Android事件傳遞機制

    

 dispatchTouchEvent

     --> true --> 交給onTouchEvent

      --> false -->

      onInterceptTouchEvent

      --> true --> onTouchEvent

      --> false --> childView
 childView 循環上述過程,若是是葉子節點View且其onTouchEvent中仍返回false,則交給其parentView 的onTouchEvent處理,若是其parentView的onTouchEvent返回false則繼續向parent傳遞,執行上述過程,直到根View,若是根View仍未處理,則下次再也不接收touchEvent.

 

6、
  1.語言切換(微信的作法是重啓)
  2.仿IOS時間選擇器(滾輪)
  3.跳轉到應用市場(send intent)

7、應用啓動
  1.自動認證登陸
  2.啓動動畫
  3.用戶對應用設置的參數讀取-----引伸:android的數據存儲必定要熟悉。

7、android系統適配:
  適配規則:  

  核心是讓同一圖片在不一樣分辨率設備上看起來同樣大,所以更大dpi設備上,該圖片就要佔用更多的像素點數。
  一個轉換公式px= dp*dpi/160
  一個比例列表:l,m,h,x,xx
  縮放規律:0.5優於0.75
  計算規則:Android系統並無拿實際的dpi(252)值來計算,而是該設備視 做hdpi設備,而後使用240dpi來計算最終像素,因此在G7上320dp恰好是:320 * (240 / 160) = 480像素。( 引用:http://zhangkun716717-126-com.iteye.com/blog/1772696)

8、性能優化工具

     例如:lint工具檢查工程中未使用的圖片資源

      lint經常使用於:清理資源、安全檢查、layout優化等

      sdk 中tools目錄下的工具 ,以下圖:

  

9、關於代碼重構:「代碼出現重複的時候,就該考慮重構了」。

   書:《重構--改善現有代碼設計》

10、測試

  機型適配:屏幕大小,這個只能人工檢驗

  Android版本(某些API在低版本上沒有的,會Crash,推薦Lint靜態掃描)

  網絡質量:聯通、電信、移動、wifi、離wifi遠一點等

  安全性:網絡數據是否加密處理;自動認證(自動登陸功能)本地不保存安全信息(賬號密碼等),或者加密保存。代碼中敏感信息儘可能使用byte數組而不是字符串代碼混淆處理(Proguard)

    爲避免異常狀況的跳轉或者惡意攻擊,Android組件在啓動時都須要判斷傳入的參數是否爲空。

    敏感信息須要進行權限限制或者加密處理。能不暴露的組件就不暴露,在AndroidManifest中爲組件加上android:exported=」false」屬性

  SD卡剩餘空間不多,沒SD卡,雙SD卡,飛行模式,時間有誤等。

  性能:CPU、內存佔用(開發可使用Linux的top命令或者DDMS裏面的工具) traceview

  網絡流量消耗(目前軟件設計方面還沒考慮這個)

11、性能優化

  參考:

  http://www.trinea.cn/android/performance/

 

 

 

Canvas和Drawables
  Android提供了一系列View部件來爲大多數用戶界面提供一般的功能.你也能夠擴展這些部件來修改它們的外觀和行爲.另外,你可使用Canvas類的方法來繪製你本身的2D顯示或爲那些像紋理按鈕或逐幀顯示的動畫之類的東西或建立Drawable對象.
硬件加速
  從Android3.0開始,你能夠硬加速大多數以CanvasAPI完成的繪畫工做來大幅提升它們的性能.
OpenGL
  Android支持OpenGLES 1.0和2.0,Android框架API和(NDK)都一樣支持.在CanvasAPI不支時使用框架API添加一些圖形加強功能是被推薦的或者你不在乎高性但指望是平臺無關的.使用框架API比NDK性能要低,因此對於不少圖形交互應用好比遊戲,使用NDK是最好的(重點注意儘管你使用框架API依然得到足夠的性能.好比,Google主體應用是全用框架API開發的).當你的有不少原生代碼要移植到android時NDK中的OpenGL仍是頗有用處的. Canvas   Android框架APIs提供了一系列2D繪畫APIs使你能夠在一個canvas上畫出你本身的圖形或修改已存在的View來定製它們的外觀.當畫2D圖形時,典型狀況下,你將使用如下兩方法之一: a.把你的圖形或動畫繪製到你的layout中的一個View上.你的圖形的繪製被系統的標準View繪製過程所處理— 你只需定義進入View的圖形便可. b.在一個Canvas中直接繪製圖形.用此方法,你需親自調用恰當的類的onDraw()方法(把它傳給你的Canvas),或Canvas的draw...()方法們中的一個(好比drawPicture()).在這樣作時,你也能夠任意控制動畫. 選項"a,"畫到View上,是當你想畫不需動態改變的簡單圖形而且不是高性能要求遊戲的一部分時的最佳的選擇.例如,你應該在你想顯示一個靜態圖形或預先定義的動畫時畫到View上. 選項"b,"畫到Canvas上,當你的應用須要按期地重畫本身時是更好的選擇.像視頻遊戲這樣的應用應畫到Canvas上,有不止一種方法來這樣作: 在你的UIActivity線程中,你建立一個自定義View組件,而後調用invalidate()而後處理onDraw()回調. 或者,在不一樣的線程中,你管理一個SurfaceView而且以最快的可能速度執行向Canvas繪畫的動做(你不須要執行invalidate()). 用Canvas繪畫   當你正在寫一個應用,在其中你想執行特殊的繪畫而且/或者控制圖形動畫,你應該使用Canvas做畫.一個其實只是一箇中間層,只是一個接口,它表明了實際的圖形繪製到的表面— 它承受了全部的繪畫調用.經過Canvas,你的繪製實際執行到一個後臺Bitmap上,這個Bitmap被放在窗口中.   在響應繪畫事件的onDraw()回調方法中,提供給你了Canvas,因而你只需把你的繪製調用傳給它就好了.當處理一個SurfaceView對象時,你能夠從SurfaceHolder.lockCanvas()獲取一個Canvas.然而,若是你須要建立一個新的Canvas,那麼你必須定義實際繪製所在的Bitmap.Bitmap是Canvas永遠所須要的.你能夠像下面這樣建立一個新的Canvaslike this: Bitmap b =Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); Canvas c =new Canvas(b);   如今你的Canvas將畫到所定義的Bitmap上.使用Canvas畫完後,你可使用任一個Canvas.drawBitmap(Bitmap,...)方法把你的Bitmap移到另外一個Canvas.推薦你最終仍是使用View.onDraw()或SurfaceHolder.lockCanvas()提供給你的Canvas做畫.   Canvas類有不少繪製方法可使用,好比drawBitmap(...),drawRect(...),drawText(...)等等.也有其它類也具備draw()方法.例如,你有一個Drawable對象要放到Canvas上,Drawable具備它本身的draw()方法,你只需把你的Canvas做爲一個參數傳給這個方法便可. 畫到View   若是你的應用不須要大量的處理運算或保證幀率(多是一個棋類遊戲,一個貪吃蛇遊戲或其它慢動畫的應用),那麼你應考慮建立一個自定義的View組件而後在它的View.onDraw()中使用Canvas繪製.這樣作的方便之處是Android框架將提供給你一個預約義好的Canvas.   要這樣作,從View派生(或從其子孫派生)而後定義onDraw()回調方法.這個方法將被Android框架調用,要求你的View畫出它本身的樣子.這是你使用Canvas執行全部繪製動做的地方.   Android框架將僅在須要時才調用onDraw().每次你的應用準備好被繪製時,你必須調用invalidate()來請求你的View無效.這代表了你想讓你的View被繪製因而Android將調用你的onDraw()方法(儘管這不能保證回調方法會被當即執行).   在你的View組件的onDraw()中,使用給你的Canvas來進行全部的繪製工做:使用各類Canvas.draw...()方法,或把你的Canvas做爲參數調用其它類的draw()方法.一旦你的onDraw()結束,Android框架將使用你的Canvas來畫一個Bitmap,Bitmap被系統管理.   注:爲了在主Acitivity所在線程以外的線程請求view無效,你必須調用postInvalidate().   能夠去SDK例程目錄:<your-sdk-directory>/samples/Snake/中看貪吃蛇遊戲例子. 畫到SurfaceView   SurfaceView是View的一種特殊子類,它在View派生樹中提供一個專門的繪畫接口,其目的是把這個繪畫接口提供給一個應用的第二個線程,因而應用不需等待系統的View派生類準備好做畫再進行其它工做,而是另外的線程引用了一個SurfaceView,SurfaceView能夠按本身的速度畫到本身的Canvas上.   要使用它,你首先要從SurfaceView派生建立一個新的類.這個類要實現SurfaceHolder.Callback回調接口.這個接口將把後臺表面的信息通知給你,好比當表面被建立,改變或銷燬.這些事件都是很重要的,由於你能夠從它們知道什麼時候你能夠開始做畫,你是否須要根據新表面的屬性進行調整,和何時應該中止繪畫而且可能要殺死一些任務.在你的SurfaceView類中也是定義你的第二個線程類的好地方,這個線程類將執行全部對你的Canvas的做畫過程.   你應該經過一個SurfaceHolder來操做你的表面對象而不是直接操做它.因此,當你的SurfaceView初始化後,經過調用getHolder()獲取SurfaceHolder.你而後還應該調用addCallback()(把this傳給它)來通知SurfaceHolder你想接收SurfaceHolder回調(從SurfaceHolder.Callback).最後在你的SurfaceView類中重寫SurfaceHolder.Callback的每個方法.   爲了在你的第二個線程中畫到表面的Canvas上,你必須把你的SurfaceHandler傳給第二線程而且用lockCanvas()獲取Canvas.你如今能夠用Canvas作畫了.一旦你完成了繪畫,調用unlockCanvasAndPost(),把你的Canvas對象傳給它,如今,表面將按你給它的來繪製Canvas.每次你想做畫,就執行這個canvas加鎖和解鎖的步驟.   注:每次你從SurfaceHolder取得Canvas,Canvas的上一次的狀態將保留.你必須每次都徹底重畫你的表面.例如,你能夠經過drawColor()填充顏色或經過drawBitmap()設置一個背景圖像來清空Canvas的上一次狀態.不然,你將會看到你上次做畫的痕跡.
相關文章
相關標籤/搜索