最近UC瀏覽器中文版出了一個快速搜索的功能, 在使用其他app的時候, 如果復(fù)制了一些內(nèi)容, 屏幕頂部會彈一個窗口, 提示一些操作, 點(diǎn)擊后跳轉(zhuǎn)到UC, 顯示這個懸浮窗不需要申請android.permission.SYSTEM_ALERT_WINDOW
權(quán)限.
講解了Java內(nèi)存模型狰晚,java內(nèi)存中
- 使用post方法提交任務(wù)锋叨,postAtFrontOfQueue將任務(wù)加入到隊(duì)列前端邻吞,postAtTime指定時間提交任務(wù)澜汤,postDelayed延后提交任務(wù)找都。
使用sendMessage方法可以發(fā)送消息,sendMessageAtFrontOfQueue將該消息放入消息隊(duì)列前端纳像,sendMessageAtTime 指定時間發(fā)送消息窖张,sendMessageDelayed延后提交消息。
android 5.0中豹障,這個任務(wù)得到了進(jìn)一步的加強(qiáng)冯事,在android 5.0之前overView Screen中顯示的任務(wù)快照是不可以配置的,但是在android 5.0中是可以配置的血公,開發(fā)者可以指定那些activity以什么樣的形式昵仅,什么UI風(fēng)格顯示在最近任務(wù)列表中。
寫入的操作全部都是在TaskPersister類的LazyTaskWriterThread線程中完成的:LazyTaskWriterThread@TaskPersister
- GC是按照有向圖是否可達(dá)來判斷對象實(shí)例是否有用
如果不在需要某個實(shí)例累魔,卻仍然被引用摔笤,這個情況叫做內(nèi)存泄露
匿名類/非靜態(tài)類內(nèi)部class會保持對它所在Activity的引用,使用時要注意它們的生命周期不能超過Activity垦写,否則要用static inner class
善于在Activy中的生命周期(比如onPause)中手動控制其他類的生命周期
- 分析內(nèi)存泄露
追蹤內(nèi)存分配
查詢方法執(zhí)行時間
三吕世、OAuth的思路
OAuth在"客戶端"與"服務(wù)提供商"之間,設(shè)置了一個授權(quán)層(authorization layer)梯投。"客戶端"不能直接登錄"服務(wù)提供商"命辖,只能登錄授權(quán)層,以此將用戶與客戶端區(qū)分開來分蓖。"客戶端"登錄授權(quán)層所用的令牌(token)尔艇,與用戶的密碼不同。用戶可以在登錄的時候么鹤,指定授權(quán)層令牌的權(quán)限范圍和有效期终娃。
"客戶端"登錄授權(quán)層以后,"服務(wù)提供商"根據(jù)令牌的權(quán)限范圍和有效期蒸甜,向"客戶端"開放用戶儲存的資料棠耕。
原來的路由系統(tǒng)還可以繼續(xù)使用柠新,我們可以把整套架構(gòu)想象成互聯(lián)網(wǎng)昧辽,現(xiàn)在多個進(jìn)程有多個路由,我們只需要把多個路由連接到一起登颓,那么整個路由系統(tǒng)還是可以正常運(yùn)行的。所以我們把原有的路由Router稱之為本地路由LocalRouter红氯,現(xiàn)在框咙,我們需要提供一個IPS咕痛、DNS供應(yīng)商,那就創(chuàng)建一個進(jìn)程喇嘱,該進(jìn)程的作用就是注冊路由茉贡,鏈接路由,轉(zhuǎn)發(fā)報文者铜,我們稱之為廣域路由WideRouter腔丧。
BroadcastReciver - 它本身不是context,也沒有context在它里面拿撩,但是每當(dāng)一個新的靜態(tài)廣播到達(dá)的時候衣厘,框架都傳遞一個context對象到onReceive()。這個context是一個ReceiverRestrictedContext實(shí)例压恒,它有兩個主要函數(shù)被禁掉:registerReceiver()和bindService()影暴。這兩個函數(shù)在BroadcastReceiver.onReceive()不允許調(diào)用。每次Receiver處理一個廣播探赫,傳遞進(jìn)來的context都是一個新的實(shí)例型宙。
快速實(shí)現(xiàn)Parcelable接口的插件。
4伦吠、Android Postfix Completion
可根據(jù)后綴快速完成代碼妆兑。
自Android3.1開始,系統(tǒng)本身則增加了對所有app當(dāng)前是否處于運(yùn)行狀態(tài)的跟蹤讨勤。在發(fā)送廣播時箭跳,不管是什么廣播類型,系統(tǒng)默認(rèn)直接增加了值為FLAG_EXCLUDE_STOPPED_PACKAGES的flag潭千,導(dǎo)致即使是靜態(tài)注冊的廣播接收器谱姓,對于其所在進(jìn)程已經(jīng)退出的app,同樣無法接收到廣播刨晴。
但是對于自定義的廣播屉来,可以通過復(fù)寫此flag為FLAG_INCLUDE_STOPPED_PACKAGES,使得靜態(tài)注冊的BroadcastReceiver狈癞,即使所在App進(jìn)程已經(jīng)退出s茄靠,也能能接收到廣播,并會啟動應(yīng)用進(jìn)程蝶桶,但此時的BroadcastReceiver是重新新建的慨绳。
當(dāng)所有的非守護(hù)線程結(jié)束時,程序也就終止了,同時會殺死進(jìn)程中的所有守護(hù)線程脐雪。反過來說厌小,只要任何非守護(hù)線程還在運(yùn)行,程序就不會終止战秋。
XML內(nèi)容中有單引號和雙引號的解決
包含XML字符實(shí)體表
Attr: flag表示這幾個值可以做或運(yùn)算; enum只能讓你選擇其中一個值
利用ConstantState判斷兩張圖片是否為drawable中同一張圖片
可以利用ConstantState來保存圖片的引用脂信,當(dāng)需要圖片的時候癣蟋,調(diào)用newDrawable(Resources)
Shallow size(對象本身占用內(nèi)存的大小) 68 -> 54, 但它的Dominating Size(管轄的內(nèi)存大小)會激增,92 ->
- Log.i(簡單字符串)
Log.i(局部變量)
Log.i(成員變量)
Log.i(簡單字符串+局部變量)
以上四種情況,日志被徹底移除狰闪,不會額外增加內(nèi)存疯搅。Log.i(簡單字符串+成員變量)
日志被移除,但是字符串拼接會存在尝哆,并占用內(nèi)存秉撇。Log.i(成員函數(shù))其中,成員函數(shù)返回值為: 簡單字符串
Log.i(成員函數(shù))其中秋泄,成員函數(shù)返回值為: 簡單字符串+局部變量
以上兩種情況琐馆,日志被徹底移除,不會額外增加內(nèi)存恒序。Log.i(成員函數(shù))其中瘦麸,成員函數(shù)返回值為: 簡單字符串+成員變量
日志被移除,但是字符串拼接會存在歧胁,并占用內(nèi)存滋饲。
Android draw、onDraw喊巍、dispatchDraw屠缭、invalidate、postInvalidate一些簡要說明
調(diào)用dispatchDraw ()方法繪制子視圖(如果該View類型不為ViewGroup崭参,即不包含子視圖呵曹,不需要重載該方法)