?
?
前臺就是和用戶交互的進程
可見進程例如一個activity被一個透明的對話框覆蓋,該activity就是可見進程
服務:service進程
后臺一個activity按了home按鍵就是從前臺退回到后臺
?
標準模式:不管任務棧是否存在相同的activity都會創建一個新的activity存儲在任務棧中
Singletop棧頂復用模式創建的activity在棧頂就不用創建該activity
?
站內復用模式:只要任務棧內存在該activity,就不用創建該activity,將該activity置于棧頂,該activity以上的activity都從任務棧中移除銷毀掉出去,會回調onnewIntent方法
?
最近由于工作需要,使用Scheme方式自定義URL來跨應用間調用,踩了一些坑,現在記錄一下。
1、Scheme方式配置
manifest中配置能接受Scheme方式啟動的activity
最近由于工作需要,使用Scheme方式自定義URL來跨應用間調用,踩了一些坑,現在記錄一下。
1、Scheme方式配置
manifest中配置能接受Scheme方式啟動的activity
如果需要配置能被js調起,一定要配置下面這句
- <category?android:name="android.intent.category.BROWSABLE"></category>??
- android:scheme="app"表示配置接受的協議為app,相當于http://www.baidu.com中的http或者https ?
- android:host="test"表示配置接受的域名為test,相當于http://www.baidu.com中的www.baidu.com ?
- 2、使用URL調起Activity
- Uri?uri=Uri.parse("app://test");??
- Intent?intent=new?Intent(Intent.ACTION_VIEW,uri);??
- startActivity(intent); ?3、使用js調起Activity
- window.location?=?"app://test"; ? ?
- 通過推送,接受到需要打開的url
- android:scheme="app"表示配置接受的協議為app,相當于http://www.baidu.com中的http或者https ?
?
?
?
前者適合頁面較少,并沒有實現真正的內存回收,后者適合頁面較多實現了內存真正的回收
?
fragment調用activity的方法,直接獲得getactivity進行調用
activity調用fragement的方法,在fragment中實現接口,在activity中調用接口對象
fragment A調用fragment B的方法,通過getactivity的的findFragment進行調用
?
service和broadcast都是運行在主線程上,如果service要做耗時操作,可以開啟線程的方式,列如在service中訪問網絡都需要開啟線程
Service 中的onStartCommand()必須返回一個整數.這個整數描述了在系統殺死它的事件中系統如何繼續這個服務onStartCommand()也返回值必須是下面常量之一:
-
START_NOT_STICKY
如果系統在onStartCommand()返回后殺死了服務,不要重新創建這個service,除非還有掛起的intent需要被傳送.這是避免在不必要時運行你的service和當你的應用可以簡單重啟任何未竟的工作時的最佳選擇.
-
START_STICKY
如果系統在onStartCommand()返回后殺死了這個service,會重新創建這個service并且調用onStartCommand(),但是不再重新發送上次最后一個intent,而是使用一個nullintent調用onStartCommand(),除非有一些掛起的intent,在此情況下,這些掛起的intent被派送.這適合于媒體播放器(or或相似也的服務),它不執行命令,但是無限期的運行并等待一個工作.
-
START_REDELIVER_INTENT
如果系統在onStartCommand()返回后殺死了service,重新創建這個service并且使用上次最后一個intent調用onStartCommand().任何掛起的intent都順序地被派送.這適合于活躍地執行一個工作并且應被立即恢復的服務,比如下載一個文件
在service中發送廣播通知activity,不讓service和activity直接交互
?
同一一個app不同組件的通信
?
動態注冊一定要在activity的ondestory中銷毀,否則會內存泄露
動態注冊的聲明周期和activity一樣,activity銷毀廣播就銷毀
靜態注冊即使activity銷毀了,也能收到廣播
binder比傳統的進程的上面更加高效,binder能夠進行身份的安全性檢查
?
在生成handle對象的時候,每一個線程擁有自己的創建了threadLocal對象一個loop對象和一個消息隊列,主線程才能更新UI,handler的創建必須在主線程中,looper從消息隊列中獲得消息,然后由handle來發送,有handle的
hanleMessage方法來處理,處理完成之后返回給Loper繼續執行,在取出消息隊列
?
解決handle內存泄露的問題
第一講handle定義成static類型
第二在activity的ondestory中調用handle.removecall方法
第三:采用弱引用的訪問在handle內部持有activity的對象
通過上面的三種方式,能百分之90%解決handle的內存泄露
?
?
總結:
View繪制分三個步驟,順序是:onMeasure,onLayout,onDraw。經代碼親測,log輸出顯示:調用invalidate方法只會執行onDraw方法;調用requestLayout方法只會執行onMeasure方法和onLayout方法,并不會執行onDraw方法。
所以當我們進行View更新時,若僅View的顯示內容發生改變且新顯示內容不影響View的大小、位置,則只需調用invalidate方法;若View寬高、位置發生改變且顯示內容不變,只需調用requestLayout方法;若兩者均發生改變,則需調用兩者,按照View的繪制流程,推薦先調用requestLayout方法再調用invalidate方法。
?
相關知識點:
1.invalidate和postInvalidate:invalidate方法只能用于UI線程中,在非UI線程中,可直接使用postInvalidate方法,這樣就省去使用handler的煩惱。
?