一、介紹 RemoteViews是一種特殊的View視圖結構,作用是顯示并更新其他進程中的View界面;因其實現了Parcelable接口,所以可以實現跨進程通信;典型的應用場景是通知欄和桌面小部件開發(兩者均是運行在系統進程中);因其運行在遠程的進程中(此處可以理解為系統進程),所以沒有辦法通過findViewById()獲取子控件,但是內部提供了一系列set方法用來更新界面;作為一種特殊的視圖結構,RemoteViews支持的View類型有限,類型如下: 1. Layout FrameLayout、LinearLayout、RelativeLayout、GridLayout 2. View Button、ImageButton、ImageView、PRogressBar、TextView、ListView、GridView、StackView、AnalogClick、Chronometer、ViewFlipper、adapterViewFlipper、ViewStub。 二、內部機制 1、首先來看一下RemoteViews內部實現機制的原理圖(網絡圖片): 2、RemoteViews的工作流程: 上圖中的本地進程假設為我們所開發的程序,遠程進程假設成系統進程;本地進程設置好一系列View顯示更新的操作,然后轉換成一系列Action并將其打包,通過Binder將這些操作傳遞給系統進程;系統進程獲取到Binder后,實現解析包并執行這些Action對象中的操作,最后實現系統進程界面的顯示更新。 3、Action說明: Action是RemoteViews的內部靜態抽象類,官方的解釋如下: /** * Base class for all actions that can be performed on an * inflated view. * SUBCLASSES MUST BE IMMUTABLE SO CLONE WORKS!!!!! */ Action代表一個View操作,因其實現了Parcelable接口所以可以實現跨進程通信,RemoteViews中的一系列操作視圖的set方法內部都轉換成了Action對象(Action代表一個View操作),轉換過程應用反射機制實現,并且添加到一個Aciton列表中,等待發送到系統進程。 系統進程獲取到一系列Action對象之后,調用RemoteViews的apply()加載布局并更新界面,調用reApply()更新界面,繼而實現遠程進程的顯示更新。 三、簡單應用場景 1. RemoteViews應用于Notification核心代碼:
2、RemoteViews應用于桌面小部件的核心代碼:
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget); remoteViews.setImageViewBitmap(R.id.image_view,rotateBitmap(context,srcBitmap,degree)); Intent intent1 = new Intent(); intent1.setAction(CLICK_ACTION); PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intent1,0); remoteViews.setOnClickPendingIntent(R.id.image_view,pendingIntent); appWidgetManager.updateAppWidget(new ComponentName(context,MyAppWidgetProvider.class),remoteViews); SystemClock.sleep(10);四、文章說明 本篇文章是自己對RemoteViews的理解總結,也是為了記憶,如有不對之處,歡迎閱覽者提出,謝謝!
新聞熱點
疑難解答