編輯:關於Android編程
⑧山寨加密方法
⑨濫用權限、內存洩露、使用debug簽名
3. 如何縮減APK包大小?
代碼AsyncTask內部也是Handler機制來完成的,只不過Android提供了執行框架來提供線程池來執行相應地任務,因為線程池的大小問題,所以AsyncTask只應該用來執行耗時時間較短的任務,比如HTTP請求,大規模的下載和數據庫的更改不適用於AsyncTask,因為會導致線程池堵塞,沒有線程來執行其他的任務,導致的情形是會發生AsyncTask根本執行不了的問題
10.談談你對binder機制的理解?
binder是一種IPC機制,進程間通訊的一種工具.
Java層可以利用aidl工具來實現相應的接口.
11.Android中進程間通信有哪些實現方式?
Intent,Binder(AIDL),Messenger,BroadcastReceiver
12.介紹下實現一個自定義view的基本流程
1、自定義View的屬性 編寫attr.xml文件
2、在layout布局文件中引用,同時引用命名空間
3、在View的構造方法中獲得我們自定義的屬性 ,在自定義控件中進行讀取(構造方法拿到attr.xml文件值)
4、重寫onMesure
5、重寫onDraw
13.Android中touch事件的傳遞機制是怎樣的?
1.Touch事件傳遞的相關API有dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent
2.Touch事件相關的類有View、ViewGroup、Activity
3.Touch事件會被封裝成MotionEvent對象,該對象封裝了手勢按下、移動、松開等動作
4.Touch事件通常從Activity#dispatchTouchEvent發出,只要沒有被消費,會一直往下傳遞,到最底層的View。
5.如果Touch事件傳遞到的每個View都不消費事件,那麼Touch事件會反向向上傳遞,最終交由Activity#onTouchEvent處理.
6.onInterceptTouchEvent為ViewGroup特有,可以攔截事件.
7.Down事件到來時,如果一個View沒有消費該事件,那麼後續的MOVE/UP事件都不會再給它
14.Android多線程的實現方式有哪些?
Thread & AsyncTask
Thread 可以與Loop 和 Handler 共用建立消息處理隊列
AsyncTask 可以作為線程池並行處理多任務
15.Android開發中何時使用多進程?使用多進程的好處是什麼?
要想知道如何使用多進程,先要知道Android裡的多進程概念。一般情況下,一個應用程序就是一個進程,這個進程名稱就是應用程序包名。我們知道進程是系統分配資源和調度的基本單位,所以每個進程都有自己獨立的資源和內存空間,別的進程是不能任意訪問其他進程的內存和資源的。。
1.那如何讓自己的應用擁有多個進程?
很簡單,我們的四大組件在AndroidManifest文件中注冊的時候,有個屬性是android:process,1.這裡可以指定組件的所處的進程。默認就是應用的主進程。指定為別的進程之後,系統在啟動這個組件的時候,就先創建(如果還沒創建的話)這個進程,然後再創建該組件。你可以重載Application類的onCreate方法,打印出它的進程名稱,就可以清楚的看見了。再設置android:process屬性時候,有個地方需要注意:如果是android:process=”:deamon”,以:開頭的名字,則表示這是一個應用程序的私有進程,否則它是一個全局進程。私有進程的進程名稱是會在冒號前自動加上包名,而全局進程則不會。一般我們都是有私有進程,很少使用全局進程。他們的具體區別不知道有沒有誰能補充一下。
2.使用多進程顯而易見的好處就是分擔主進程的內存壓力。我們的應用越做越大,內存越來越多,將一些獨立的組件放到不同的進程,它就不占用主進程的內存空間了。當然還有其他好處,有心人會發現Android後台進程裡有很多應用是多個進程的,因為它們要常駐後台,特別是即時通訊或者社交應用,不過現在多進程已經被用爛了。典型用法是在啟動一個不可見的輕量級私有進程,在後台收發消息,或者做一些耗時的事情,或者開機啟動這個進程,然後做監聽等。還有就是防止主進程被殺守護進程,守護進程和主進程之間相互監視,有一方被殺就重新啟動它。應該還有還有其他好處,這裡就不多說了。
3.壞處的話,多占用了系統的空間,大家都這麼用的話系統內存很容易占滿而導致卡頓。消耗用戶的電量。應用程序架構會變復雜,應為要處理多進程之間的通信。這裡又是另外一個問題了。
16.ANR是什麼?怎樣避免和解決ANR?
ANR:Application Not Responding,即應用無響應
ANR一般有三種類型:
1:KeyDispatchTimeout(5 seconds) –主要類型
按鍵或觸摸事件在特定時間內無響應
2:BroadcastTimeout(10 seconds)
BroadcastReceiver在特定時間內無法處理完成
3:ServiceTimeout(20 seconds) –小概率類型
Service在特定的時間內無法處理完成超時的原因一般有兩種:
(1)當前的事件沒有機會得到處理(UI線程正在處理前一個事件沒有及時完成或者looper被某種原因阻塞住)
(2)當前的事件正在處理,但沒有及時完成
UI線程盡量只做跟UI相關的工作,耗時的工作(數據庫操作,I/O,連接網絡或者其他可能阻礙UI線程的操作)放入單獨的線程處理,盡量用Handler來處理UI thread和thread之間的交互。
UI線程主要包括如下:
Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick()
AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel()
Mainthread handler: handleMessage(), post(runnable r)
other
17.Android下解決滑動沖突的常見思路是什麼?
相關的滑動組件 重寫onInterceptTouchEvent,然後判斷根據xy值,來決定是否要攔截當前操作
18.如何把一個應用設置為系統應用?
成為系統應用,首先要在 對應設備的 Android 源碼 SDK 下編譯,編譯好之後:
此 Android 設備是 Debug 版本,並且已經 root,直接將此 apk 用 adb 工具 push 到 system/app 或 system/priv-app 下即可。
如果非 root 設備,需要編譯後重新燒寫設備鏡像即可。
有些權限(如 WRITE_SECURE_SETTINGS ),是不開放給第三方應用的,只能在對應設備源碼中編譯然後作為系統 app 使用。
19、Android內存洩露研究
Android內存洩漏指的是進程中某些對象(垃圾對象)已經沒有使用價值了,但是它們卻可以直接或間接地引用到gc roots導致無法被GC回收。無用的對象占據著內存空間,使得實際可使用內存變小,形象地說法就是內存洩漏了。。
場景
類的靜態變量持有大數據對象
靜態變量長期維持到大數據對象的引用,阻止垃圾回收。
非靜態內部類的靜態實例
非靜態內部類會維持一個到外部類實例的引用,如果非靜態內部類的實例是靜態的,就會間接長期維持著外部類的引用,阻止被回收掉。。
資源對象未關閉
資源性對象如Cursor、File、Socket,應該在使用後及時關閉。未在finally中關閉,會導致異常情況下資源對象未被釋放的隱患。
注冊對象未反注冊
未反注冊會導致觀察者列表裡維持著對象的引用,阻止垃圾回收。
Handler臨時性內存洩露
Handler通過發送Message與主線程交互,Message發出之後是存儲在MessageQueue中的,有些Message也不是馬上就被處理的。在Message中存在一個 target,是Handler的一個引用,如果Message在Queue中存在的時間越長,就會導致Handler無法被回收。如果Handler是非靜態的,則會導致Activity或者Service不會被回收。
由於AsyncTask內部也是Handler機制,同樣存在內存洩漏的風險。
此種內存洩露,一般是臨時性的。
20.內存洩露檢測有什麼好方法?
檢測:
1、DDMS Heap發現內存洩露
dataObject totalSize的大小,是否穩定在一個范圍內,如果操作程序,不斷增加,說明內存洩露
2、使用Heap Tool進行內存快照前後對比
BlankActivity手動觸發GC進行前後對比,對象是否被及時回收
定位:
1、MAT插件打開.hprof具體定位內存洩露:
查看histogram項,選中某一個對象,查看它的GC引用鏈,因為存在GC引用鏈的,說明無法回收
2、AndroidStudio的Allocation Tracker:
觀測到期間的內存分配,哪些對象被創建,什麼時候創建,從而准確定位
21:多進程應該能為我們帶來什麼呢
android平台對應用都有內存限制,其實這個理解有點問題,應該是說android平台對每個進程有內存限制,比如某機型對對進程限制是24m,如果應用有兩個進程,則該應該的總內存限制是2*24m。使用多進程就可以使得我們一個apk所使用的內存限制加大幾倍。所以可以借此圖片平台對應用的內存限制,比如一些要對圖片、視頻、大文件進程處理的好內存的應用可以考慮用多進程來解決應用操作不流暢問題。
概述之前在討論組裡聽到許多討論okhttp的話題,可見okhttp是一個相對成熟的解決方案,看到android4.4後網絡訪問的源碼中HttpURLConnection已
效果如下:(點擊下載demo) 實現原理:頂部利用了ListView的HeadView來實現,然後其他每個item都用背景實現! 首先設置一些常量:package c
目前世界有幾十億安卓手機在使用,而大量Android 5.0用戶稱自己設備的耗電速度過快。原版Lollipop當中的確存在Wi-Fi引發的耗電問題,但谷歌已
一、導入*.jar包1.直接copy①復制*.jar包,粘貼到主工程目錄的libs下邊②右鍵,將此jar包設置成自己的library③然後在工程右鍵的選擇項目單擊Open