Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 《Android 群英傳》 閱讀筆記 第七章~第九章

《Android 群英傳》 閱讀筆記 第七章~第九章

編輯:關於Android編程

第7章 Android 動畫機制與使用技巧

7.1Android View動畫框架

1、Animation框架定義了透明度、旋轉、縮放和位移幾種常見的動畫,而且控制的是整個View。

實現原理

1、每次繪制視圖時,View所在的ViewGroup中的drawChild函數,獲取該View的Animation的Transformation值

2、然後調用canvas。concat(transformToApply.getMatrix()),通過矩陣運算完成動畫幀。

3、如果動畫沒有完成,就繼續調用invalidate()函數,啟動下次繪制來驅動動畫。

視圖動畫的缺陷在於不具備交互性,當某個元素發生視圖動畫後,其響應事件的位置還依然在動畫前的地方。

7.2 屬性動畫分析

Animator 框架中使用最多的就是AnimatorSet和ObjectAnimator配合。

使用ObjectAnimator進行更精細化控制,只控制一個對象的一個屬性值,

而使用多個ObjectAnimator組合到AnimatorSet形成一個動畫。

而且ObjectAnimator能夠自動驅動,可以調用setFrameDelay(long frameDelay)設置動畫幀之間的間隙時間,調整幀率,減少動畫過程中頻繁繪制界面,而在不影響動畫效果的前提下減少CPU資源消耗。

7.2.1 ObjectAnimator

ObjectAnimator 是屬性動畫框架中最重要的實行類,

創建一個ObjectAnimator只需通過他的靜態工廠類直接返回一個ObjectAnimator對象。

參數包括一個對象和對象的屬性名字,但這個屬性比較有get和set函數。

內部通過Java反射機制來調用set函數修改對象的屬性值。同樣,也可以調用setInterpolator來設置相應的差值器。

在使用ObjectAnimator的時候,有一點非常重要,那就是要操縱的屬性必須具有get、set方法,不然objectAnimator就無法起效。下面是一些常用可以直接用的屬性值。

1、translationX和translationY:這兩個屬性作為一種增量來控制著View對象從它布局容器的左上角坐標偏移的位置。

2、rotation、rotationX和rotationY:這三個屬性控制View對象圍繞支點進行2D和3D旋轉

3、scaleX和scaleY:這兩個屬性控制著View對象圍繞它的支點進行2D縮放

4、pivotX和pivotY:這兩個屬性控制著View對象的支點位置,圍繞這個支點進行旋轉和縮放變換處理。

5、x和y,這是兩個簡單使用的屬性,它描述了View對象在它的容器中的最終位置,

6、alpha:它表示View對象的alpha透明度,默認度是1不透明,0是完全透明。

7.2.2 PropertyValuesHolder

在屬性動畫中,如果針對同一個對象的多個屬性,要同時作多種動畫,可以使用PropertyValuesHolder來實現。

比如舉例的平移動畫,如果需要在平移過程中,同時改變X、Y軸的縮放。

7.2.3 ValueAnimator

ObjectAnimator也是繼承自ValueAnimator。

ValueAnimator本身不提供任何動畫效果,它更像一個數值發生器,用來產生具有一定規律的數字,從而讓調用者來控制動畫的實現過程。

7.3 Android 布局動畫

所謂布局動畫,是指作用在ViewGroup上,給ViewGroup增加View時添加一個動畫效果。

7.4 Interpolators(插值器)

插值器是動畫中的一個非常重要的概念,通過插值器,可以定義動畫變化效率,其作用主要是控制目標變量的變化值進行對應的變化。

同樣的一個動畫變換起始值,在不同的插值器作用下,每個單位時間內所達到的變化值也是不一樣的。

使用Camera類來實現一個自定義的3D動畫效果。

這裡的Camera並不是指手機中的相機,而是android.graphics.Camera的Camera類,它封裝了openGl的3D動畫,從而可以非常方便地創建3D動畫。

把Camera想象成一個真實的攝像機,當物體固定在某處,只要移動攝像機就能拍攝到具有立體感的圖像。

使用Camera類實現動畫效果非常簡單,無非就是三個坐標軸的旋轉角度,最後兩行代碼,可以改變旋轉時的默認旋轉中心。

7.6 Android 5.X SVG 矢量動畫機制

Google在Android5.X中增加了對SVG矢量圖形的支持。

什麼是SVG?

1、可伸縮矢量圖形

2、定義用於網絡的基於矢量的圖形

3、使用XML格式定義圖形

4、圖像在方法或改變尺寸的情況下其圖形質量不會有所損失

5、萬維網聯盟的標准

6、與諸如DOM和XSL之類的W3C標准是一個整體。

Bitmap(位圖)通過在每個像素點上存儲色彩信息來表達圖像,而SVG是一個繪圖標准。

與Bitmap相比,SVG最大的有點就是放大不會失真。

而且Bitmap需要為不同的分辨率設計多套圖標,而矢量則不需要。

7.6.1 標簽

使用標簽創建SVG,就像用指令的方法來控制一只畫筆,例如移動畫筆到某一坐標位置,畫一條線,畫一條曲線。

M=moveto(M X,Y):將畫筆移動到指定的坐標位置,但未發生繪制

L =lineto(L X ,Y):畫直線到指定的坐標位置

H =horizontal lineto(H X):A畫 水平線到指定的X坐標位置

V =vertical lineto(V Y ):畫垂直線到指定的Y坐標位置

C =cureto(C X1,Y1,Y2,ENDX,ENDY):三次貝塞曲線

S =smooth curvetor(S X2, Y2 ,ENDX ,END Y):三次貝塞曲線

7.6.4 Android中使用SVG

1、VectorDrawable

2、AnimatedVetorDrawable

其中VetorDrawable 讓你可以創建基於XML的SVG圖形,並結合AnimatedVectorDrawable來實現動畫效果

7.6.4.1 VectorDrawable

在XML中創建一個靜態的SVG圖形。

path是SVG樹形結構中的最小單位,而通過Group可以將不同的path進行組合。

 

\

 

7.7.3 下拉展開動畫

當點擊一個View的時候,顯示下面隱藏的一個View,要實現這個功能,需要將View的visibility屬性由gone設置為visible即可,但是這個過程是瞬間完成的。

第8章 Activity 與Activity調用棧分析

8.1.1 系統采用Activity棧的方式來管理Activity

8.1.2 Activity形態

1、Active/Running

這時,Activity處於Activity棧的最頂層,可見,並與用戶交互。

2、Paused

當Activity失去焦點時,被一個新的非全屏的Activity,或者一個透明的Activity放置在棧頂時,Activity就轉化為Paused,它只是失去了與用戶交互的能力,所有的狀態信息、成員變量都保持著,只有在系統內存極低的情況下,才會被系統回收。

3、Stopped

如果一個Activity被另一個Activity完全覆蓋,此時它不在可見,但仍然保持了所有狀態信息和成員變量。

4、Killed

當Activity被系統回收掉或者Activity從來沒有創建過,Activity就處於Killed狀態。

8.1.3 Activity的生命周期

1、Resumed。Activity處於Activity棧頂,處理用戶的交互。

2、Paused。當Activity的一部分擋住的時候進入這個狀態,這個狀態Activity不會接受用戶輸入。

3、stopped 當Activity完全被覆蓋時進入這個狀態,此時Activity不可見,僅在後台運行。

8.1.3.1 Activity啟動與銷毀過程

onCreate(),創建基本的UI元素

onPause()與onStop():清除Activity的資源,避免浪費。

onDestory():因為引用會在Activity銷毀的時候銷毀,而線程不會,所以清楚開啟的線程。

8.1.3.2 Activity的暫停與恢復過程

onPause():釋放系統資源,如,Camera,sensor,receivers

onResume():需要重新初始化在onPause()中釋放的資源

8.1.3.3 Activity的停止過程

棧頂的Activity部分不可見時,實際上後續會有兩種可能,從部分不可見到可見,也就是恢復過程;從部分不可見到完全不可見,也就是停止過程。

系統在Activity不可見的時候,總會調用onPause()方法。

每當Activity由不可見到可見時,都會調用onStart()方法。

8.1.3.4 Activity的重新創建過程

如果你的系統長時間處於onStopped形態,且此時系統需要更多內存或內存極為緊張時,系統會回收你的Activity。此時系統為了補償,會將Activity狀態通過onSaveInstanceState()方法保存到Bundle對象中。

如果用戶使用finish()方法結束了Activity,則不會調用。

8.2Android 任務棧簡介

當一個app啟動時,如果當前環境中不存在該app的任務棧,那麼系統就會創建一個任務棧。此後,當這個app啟動的Activity豆漿這個任務棧中被管理,這個棧也被成為Task,即表示若個Activity的集合,他們組合在一起形成一個Task。

一個Task中的Activity可以來自不同的app,同一個app的Activity也可能不在一個Task中。

8.3 Android Mainfest啟動模式

8.3.1 standard

8.3.2 singletop

如果指定啟動Activity為singletop模式,那麼在啟動時,系統會判斷當前棧頂Activity是不是要啟動的Activity,如果是,則不創建新的Activity而直接引用這個Activity,如果不是則創建新的Activity。

這種模式通常適用於收到消息後顯示的界面,例如QQ接收到消息後,彈出Activity。

當ActivityA的LaunchMode為SingleTop時,如果ActivityA在棧頂,且現在要再啟動ActivityA,這時會調用onNewIntent()方法

當ActivityA的LaunchMode為SingleInstance,SingleTask時,如果已經ActivityA已經在堆棧中,那麼此時會調用onNewIntent()方法

8.3.3 singleTask

singletask是檢測整個Activity棧中是否存在當前需要啟動的Activity。如果存在,則將該Activity置於棧頂,並將該Activity以上的Activity銷毀。這裡是指同一個app中啟動這個singletask的Activity,如果其他程序以singleTask模式啟動這個Activity,那麼它將創建一個新的任務棧。

如果啟動的模式為singleTaskde 的Activity已經在後台一個任務棧中了,那麼啟動後,後台的這個任務棧將一起被切換到前台。

使用這個模式創建的Activity不是在新的任務棧中被打開,就是將已打開的Activity切換到前台。

通常用來退出整個應用:將主Activity設為singleTask模式,然後在要退出的Activity中轉到主Activity,從而將主Activity之上的Activity都清除。然後重寫主activity的OnNewIntent()方法,在方法中加上一句finish(),將最後一個activity結束。

8.3.4 singleInstance

聲明為singleInstance的Activity會出現在一個新的任務棧中,而且該任務棧中只存在一個activity。

關於singleTop和singleInstance這兩種模式,有一點需要說明。如果在一個singletop或者singleinstance的Activity中通過startActivityforresule()方法啟動另一個activity,那麼系統將直接返回Activity_Result_cancled而不會再去等待返回。

Android開發者認為,不同task之間,默認不能傳遞數據,如果一定要傳遞,只能通過intent來幫定數據。

8.4 Intent Flag 啟動模式

1、Intent.Flag_ACTIVITY_NEW_TASK

使用一個新的task來啟動一個Activity。但啟動每個activity都在一個新的task中。

2、Flag_activity_singletop

使用singletop模式來啟動一個activity

3、Flag_activity_clear_top

使用singletask模式來啟動一個activity

4、flag_activity_no_history

使用這種模式啟動activity,當該activity啟動其他activity後,該activity就消失了,不會保留在activity棧中。

第9章 Android 系統信息與安全機制

9.1Android 系統信息獲取

通常可以從以下兩個方面 1、android.os.build 2、SystemProperty

9.1.1android.os.Build

1、build.board//主板 2、build.brand //android系統定制商

3、build.supported_abis cpu指令集

9.1.2 SystemProperty

9.2 Android Apk應用信息獲取之PackageManager

PM(PackageManager)主宰著應用的包管理

AM(ActivityManager)主宰著應用的活動管理

9.2.1 PackManager

 

graphic

 

最裡面的框代表了整個Activity的信息,系統提供了Activityinfo類進行封裝。

最外面的框代表著整個mianfest文件中節點的信息,系統提供了PackageInfo來進行封裝。

Android提供了PackageManager來負責管理所有已安裝的app。

1、Applicationinfo

它封裝了>。其中FLAG_SYSTEM為系統應用。FLAG_EXTERNAL_STORAGE表示為安裝在SDCard上的應用等。

2、PackageInfo

它封裝了mianfest文件的相關節點信息。

3、ResolverInfo

它封裝了包含信息的上一級信息。所以它可以返回Activityinfo,Serviceinfo等包含的信息,它經常用來幫助我們找到那些包含特定intent條件的信息,如帶分享功能,播放功能的應用。

9.3 Android Apk應用信息獲取之ActivityManager

1、ActivityManager.MemoryInfo

availMem——系統可用內存 totalMem——總內存

threshold——低內存的閥值 lowMemory——是否處於低內存

2、Debug.MemoryInfo

ActivityManager.MemoryInfo通常用於獲取全局的內存使用信息,而Debug.MemoryInfo用於統計進程下的內存信息。

3、RunningAppProcessInfo

運行進程的信息。

4、RunningServiceInfo

運行的服務信息

9.4 解析Package.xml獲取系統信息。

在系統初始化的時候,PackageManager的底層實現類PackageManagerService回去掃描系統中的一些特定的目錄,並解析其中的APK文件。

同時,Android把它獲得應用信息,保存在xml文件中,做成一個應用的花名冊。當系統中的ApK安裝、刪除,升級時,它也會被更新,就是位於/data/system/package.xml文件。

1、permission標簽

permission標簽定了目前系統中的所有權限,並分為兩類,系統定義的(package屬性為Android)和Apk定義的(package屬性為Apk的包名)

2、package標簽

name:apk包名 。

codePath:Apk安裝路徑。主要有/system/app和 /data/app兩種。

/system/app存放系統級別的Apk和廠商定制的Apk

/data/app存放用戶安裝的第三方Apk

3、 標簽

對應Apk的AndroidMainfest文件中的標簽,記錄Apk的權限信息。

9.5 Android安全機制

9.5.1. 第一道防線1

代碼安全機制——代碼混淆proguard

proguard在代碼層面上對Android應用程序app的第一重保護。

9.5.1.2第二道防線

應用接入權限控制——AndroidMainfest文件權限聲明、權限檢查機制

不足

1、被授予的權限無法停止

2、在應用聲明app使用權限時,用戶無法針對部分權限進行限制

3、權限聲明機制與用戶的安全理念相關。

Android通過以下順序來檢查操作者的權限

1、判斷permission名稱,如果為空,則直接返回PERMISSION_DENIED。

2、判斷UID。如果為0,則為root權限,不做權限控制;如果為System Server的Uid則為系統服務,不做權限控制;如果uid與參數中的請求uid不同,則返回Permission_denied。

3、通過調用PackageManagerService.checkUidPermission()判斷該Uid是否具有相應的權限。

9.5.1.3 第三道防線

應用簽名機制——數字證書

9.5.1.4 第四道防線

Linux內核安全機制——Uid、訪問權限控制

Linux文件系統的權限控制是由user、group、other與讀、寫、執行的不同組合來實現。通常情況下,只有system、root用戶才有權限訪問到系統文件。

9.5.1.5

Android虛擬沙箱機制——沙箱隔離

9.5.3 Android Apk反編譯

9.5.3.1 apktool

對test.apk執行反編譯命令

1、格式非常簡單,指定d參數,並寫入要反編譯的Apk目錄。

2、重新打包的命令與解碼的命令相似,只是需要將d改為b,並選擇前面解碼生成的文件夾。執行該命令後,在文件夾下就會生成兩個新的文件夾。

9.5.3.2 Dex2jar、jd-gui

1、先回到開始用解壓縮文件解壓的apk後那個文件夾,文件夾有一個非常重要的文件,dex文件。

2、將dex文件復制到dex2jar-0.0.9.15,執行分析

3、獲取到jar文件之後,就輪到jd-gui上場了。打開jd-gui,並選擇file-open file,並選擇剛剛生成的class-dex2jar.jar。就可以看到相關源代碼了。

9.5.4 Android Apk加密


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