原创 只有主線程才能更新view嗎?

1.子線程更新產生異常 做過Android開發的同學都知道只有在主線程才能夠更新view,如果在子線程更新view,則會拋出異常。我們來看下這個異常到底是哪裏拋出來的。 如下代碼所示,新建了一個線程去更新view new Thre

原创 一文搞懂ANR

1.ANR的定義 ANR(Application Not Responding):應用無響應 即主線程在特定的時間內沒有完成特定的事情,就會產生ANR。 在Android當中有以下幾種ANR的類型: KeyDispatchTim

原创 framework當中的單例模式

最近看了一些framework的代碼,發現裏面用到了一些單例模式,挺有意思的,我們在自己的項目當中也可以借鑑。 1.進程內的單例 首先是我們最熟悉也最常用的,就是進程內的單例 Singleton是一個抽象類,裏面有一個抽象函數cr

原创 Activity的顯示

1.Activity的顯示 Activity的顯示原理如下圖所示 在Activity啓動的時候會創建一個PhoneWindow,而這個PhoneWindow會包含一個DecorView,DecorView就是Activity的r

原创 binder調用流程分析

binder是一個非常好的跨進程通信工具,Android對其進行了各種封裝,雖然我們用起來簡單,但是理解起來卻比較困難。 1.自己設計一個跨進程通信機制 在理解binder之前呢,首先我們想一下,如果我們自己設計一個跨進程通信的機

原创 徒手擼一個註解框架

運行時註解主要是通過反射來實現的,而編譯時註解則是在編譯期間幫助我們生成代碼,所以編譯時註解效率高,但是實現起來複雜一點,運行時註解效率較低,但是實現起來簡單。 首先來看下運行時註解怎麼實現的吧。 1.運行時註解 1.1定義註解

原创 常見的內存泄漏場景分析

博主最近遇到了很多內存泄漏的問題,其實說白了,在Android裏面的內存泄漏最多的就是activity或者fragment對象, 當他們執行了ondestory週期函數之後,內存當中的對象卻得不到釋放,因而造成了內存泄漏。 以下是

原创 回調的方式使用startActivityForResult

問題 最近遇到了一個很有趣的問題,爲什麼不能夠用回調的方式使用startActivityForResult呢?如果我們想要用回調的方式使用,有什麼問題? 首先我們看一下目前官方的使用方式,如下圖所示 其實這個流程很複雜,很不符合

原创 跨進程傳輸大文件

1.出現異常 博主之前在跨進程傳輸文件的時候遇到過這樣的異常,TransactionTooLargeException 11-20 14:23:18.733 1000 1387 1664 W ActivityManager: an

原创 service的綁定原理

看完service的啓動流程,繼續擼一下service的綁定流程 1.service的綁定流程 首先我們看下如下圖所示的service的綁定原理,應用向AMS發起bindService,然後AMS檢查自己是否有對應service的

原创 IdleHandler原理分析

1.使用方法及場景 之前做過冷啓動優化,在冷啓動的場景有很多的任務其實並不需要馬上啓動,通常的做法就是做一個延遲啓動,如下所示 Handler mHandler = new Handler(); mHandler.postDela

原创 hook住應用的classloader

之前在做冷啓動優化的時候,有這樣一個想法,就是我想知道在冷啓動的過程中,到底加載了多少個類,有沒有什麼方法將其打印出來? 其實很容易想到的就是hook住系統的ClassLoader,然後在loadClass的函數加上打印,這樣就可

原创 App裏面有幾個context?

1.Context的繼承關係 想要弄清楚這個問題,我們得先搞清楚Context的繼承關係,如下圖所示 Context是一個抽象類,應用裏面的Application、service和Activity均是其子類。而對於Context

原创 service的啓動過程

疫情似乎仍然沒有好轉的跡象,鄰居被查出來感染上了病毒,搞得人心惶惶的。待在家裏啥也做不了,就好好學習吧。 今天看了下service的啓動過程,然後將其捋一捋加深印象。 1.service的啓動流程 如下圖所示爲service的啓動

原创 Android屏幕的刷新機制

最近的冠狀病毒搞得人心惶惶,待在家裏面也沒啥事,正好趁這段時間學習一下。瞭解一下Android屏幕的刷新機制對於我們解決應用卡頓也有幫助。 1.屏幕刷新機制 1)屏幕顯示 首先我們看下Android屏幕的顯示原理,如下圖所示 應