標籤:布局檔案 藝術 反射 bar ima bin line idg --
No1:
RemoteViews使用情境:通知欄和案頭小組件
No2:
通知欄主要通過NotificationManager的notify方法來實現的
案頭小組件是通過AppWidgetProvider來實現的,AppWidgetProvider本質上是一個廣播
No3:
通知的實現可以看我的另外一篇Notification通知
案頭小組件的實現可以看我的另外一篇案頭小組件開發
No4:
PendingIntent的瞭解可以看我的另外一篇PendingIntent
No5:
RemoteViews支援的類型如下:
Layout:FrameLayout、LinearLayout、RelativeLayout、GridLayout
View:AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView、AdapterViewFlipper、ViewStub
RemoteViews不支援它們的子類以及其他View類型,故也不支援自訂View
No6:
RemoteViews的一系列set方法是通過反射來完成的
No7:
通知欄和案頭小組件中的布局檔案實際上是在NotificationManagerService以及AppWidgetService中被載入的,而它們運行在系統的SystemServer中,這就和我們的進程構成了跨進程通訊的情境
No8:
RemoteViews的作用是在其他進程中顯示並更新View界面。
No9:
RemoteVeiws會通過Binder傳遞到SystemServer進程,這是因為RemoteViews實現了Parcelable介面,因此它可以跨進程傳輸,系統會根據RemoteViews中的包名等資訊去得到該應用的資源。然後會通過LayoutInflater去載入RemoteViews中的布局檔案
No10:
通知欄和案頭小組件分別由NotificationManager和AppWidgetManager管理,而NotificationManager和AppWidgetManager通過Binder分別和SystemServer進程中的NotificationManagerService以及AppWidgetService進行通訊。
No11:
從理論上來說,系統完全可以通過Binder去支援所有的View和View操作,但是這樣做的話代價太大,因為View的方法太多了,另外就是大量的IPC操作會影響效率。
為瞭解決這個問題,系統並沒有通過Binder去直接支援View的跨進程訪問,而是提供了一個Action的概念,Action代表一個View操作,Action同樣實現了Parcelable介面。
這樣的好處是不需要定義大量的Binder介面,其次避免了大量的IPC操作,提高了程式的效能。
No12:
遠程進程通過RemoteViews的apply方法來進行View的更新操作,RemoteViews的apply方法內部則會去遍曆所有的Action對象並調用它們的apply方法,具體的View更新操作是由Action對象的apply方法來完成的。
No13:
RemoteViews的apply方法首先會通過LayoutInflater去載入RemoteViews中的布局檔案(通過getLayoutId獲得),載入完布局檔案後會通過performApply去執行一些更新操作。
No14:
Action對象的apply方法就是真正操作View的地方。
No15:
調用RemoteViews的set方法時,並不會立刻更新它們的介面,而必須通過NotificationManager的notify方法以及AppWidgetManager的updateAppWidget才能更新它們的介面。
《android開發藝術探索》讀書筆記(四)--RemoteViews