一、介绍 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核心代码:
PendingIntent pendingIntent1 = PendingIntent.getActivity(this,1,new Intent(this,ThirdActivity.class),PendingIntent.FLAG_CANCEL_CURRENT); RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.remote); remoteViews.setImageViewResource(R.id.iv,R.mipmap.ic_launcher); remoteViews.setTextViewText(R.id.title,"已作为媒体设备连接"); remoteViews.setTextViewTextSize(R.id.title, TypedValue.COMPLEX_UNIT_SP,16); remoteViews.setTextViewText(R.id.content,"触摸可显示其他USB选项。"); remoteViews.setTextViewTextSize(R.id.content, TypedValue.COMPLEX_UNIT_SP,13); remoteViews.setOnClickPendingIntent(R.id.content,pendingIntent1); Notification.Builder builder = new Notification.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setWhen(System.currentTimeMillis()) .setAutoCancel(true) .setContent(remoteViews) .setContentIntent(PendingIntent.getActivity(this,0,new Intent(this,SecondActivity.class),PendingIntent.FLAG_UPDATE_CURRENT)); Notification notification = builder.build(); NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.notify(1,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的理解总结,也是为了记忆,如有不对之处,欢迎阅览者提出,谢谢!
新闻热点
疑难解答