当前位置: 首页 > news >正文

厦门外贸网站下载建行手机银行官方正式版

厦门外贸网站,下载建行手机银行官方正式版,旅游网站建设 策划书,网站高防服务器租用一、RemoteViews 简介 在 Android 开发的广阔领域中#xff0c;RemoteViews 是一个独特且重要的概念#xff0c;它为开发者提供了一种在其他进程中显示视图结构的有效方式。从本质上讲#xff0c;RemoteViews 并非传统意义上在当前应用进程内直接渲染和操作的 View#xf…一、RemoteViews 简介 在 Android 开发的广阔领域中RemoteViews 是一个独特且重要的概念它为开发者提供了一种在其他进程中显示视图结构的有效方式。从本质上讲RemoteViews 并非传统意义上在当前应用进程内直接渲染和操作的 View而是属于 SystemServer 进程的特殊 View 结构。 想象一下在开发一个音乐播放应用时我们希望在通知栏中展示播放控制界面或者创建一个桌面小部件来快速启动播放、暂停等操作。这些场景下通知栏和桌面小部件的界面并非在我们应用自身的进程中直接显示而是运行在系统的 SystemServer 进程中。这时RemoteViews 就发挥了关键作用它允许我们在其他进程中展示特定的视图结构实现跨进程的界面显示和交互。 由于 RemoteViews 是在其他进程中显示其更新机制与普通 View 有很大不同。普通 View 可以在当前进程中直接通过 findViewById 获取控件并进行属性修改等操作而 RemoteViews 为了实现跨进程更新界面提供了一组基础操作方法 。这些方法是 View 全部方法的子集大部分是通过反射来完成的。例如我们无法像操作普通 TextView 那样直接调用 setText 方法来设置文本而是需要使用 RemoteViews 提供的 setTextViewText 方法传入对应的 viewId 和文本内容来实现。 二、RemoteViews 的使用场景 2.1 通知栏Notification 在通知栏中RemoteViews 主要用于自定义通知的布局使通知呈现出更丰富的内容和交互形式。比如在音乐播放应用中通知栏不仅可以显示歌曲名称、歌手信息还能添加播放、暂停、上一曲、下一曲等按钮方便用户在不打开应用的情况下控制音乐播放 。下面通过代码示例来展示如何使用 RemoteViews 自定义通知栏布局 // 1. 创建RemoteViews对象加载自定义布局 RemoteViews remoteViews new RemoteViews(getPackageName(), R.layout.custom_notification_layout); // 2. 设置布局中的文本内容 remoteViews.setTextViewText(R.id.notification_title, 新消息提醒); remoteViews.setTextViewText(R.id.notification_content, 您有一条新的消息请查看。); // 3. 设置布局中的图片 remoteViews.setImageViewResource(R.id.notification_icon, R.drawable.notification_icon); // 4. 设置按钮的点击事件 Intent intent new Intent(this, NotificationClickReceiver.class); PendingIntent pendingIntent PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.notification_button, pendingIntent); // 5. 创建通知构建器 NotificationCompat.Builder builder new NotificationCompat.Builder(this, CHANNEL_ID).setSmallIcon(R.drawable.ic_notification_small).setContent(remoteViews).setPriority(NotificationCompat.PRIORITY_DEFAULT); // 6. 获取通知管理器并发送通知 NotificationManager notificationManager (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(notificationId, builder.build());上述代码中首先通过RemoteViews加载了一个自定义的通知布局custom_notification_layout。然后使用setTextViewText方法设置了通知的标题和内容setImageViewResource方法设置了通知图标 。对于按钮的点击事件通过创建一个Intent和PendingIntent并使用setOnClickPendingIntent方法将其与通知布局中的按钮关联起来。最后通过NotificationCompat.Builder构建通知并使用NotificationManager发送通知。 2.2 桌面小部件AppWidget 桌面小部件是应用展示在用户桌面上的一个可视化组件能提供简化信息和交互功能像天气应用的桌面小部件可实时显示天气状况日历应用的小部件能展示日程安排。使用 RemoteViews 开发桌面小部件主要涉及布局定义、AppWidgetProvider 实现以及配置信息设置等步骤。具体如下 定义 Widget 布局文件在res/layout目录下创建布局文件如widget_layout.xml用于定义小部件的 UI。 LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalandroid:padding16dpTextViewandroid:idid/widget_textandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textHello, Widget!android:textSize18spandroid:textColor#000 /Buttonandroid:idid/widget_buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textClick Me / /LinearLayout创建 AppWidgetProvider 类该类继承自AppWidgetProvider用于处理小部件的生命周期事件和用户交互事件。 import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; public class MyAppWidgetProvider extends AppWidgetProvider {Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {for (int appWidgetId : appWidgetIds) {// 创建RemoteViews对象加载布局RemoteViews views new RemoteViews(context.getPackageName(), R.layout.widget_layout);// 设置按钮点击事件Intent intent new Intent(context, MyAppWidgetProvider.class);intent.setAction(com.example.ACTION_BUTTON_CLICK);PendingIntent pendingIntent PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);views.setOnClickPendingIntent(R.id.widget_button, pendingIntent);// 更新小部件appWidgetManager.updateAppWidget(appWidgetId, views);}}Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);if (com.example.ACTION_BUTTON_CLICK.equals(intent.getAction())) {// 处理按钮点击事件// 例如更新小部件内容}} }定义 AppWidgetProviderInfo 文件在res/xml目录下创建文件如widget_info.xml用于指定小部件的布局、更新频率等信息。 appwidget-provider xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:minWidth250dpandroid:minHeight100dpandroid:updatePeriodMillis1800000 !--自动更新频率单位为毫秒这里设置为30分钟 --android:initialLayoutlayout/widget_layoutandroid:resizeModehorizontal|verticalandroid:widgetCategoryhome_screen /在 AndroidManifest.xml 中注册小部件在AndroidManifest.xml文件中声明小部件的AppWidgetProvider。 receiver android:name.MyAppWidgetProviderintent-filteraction android:nameandroid.appwidget.action.APPWIDGET_UPDATE //intent-filtermeta-dataandroid:nameandroid.appwidget.providerandroid:resourcexml/widget_info / /receiver通过以上步骤一个简单的桌面小部件就开发完成了。用户可以在主屏幕上添加该小部件并与小部件进行交互如点击按钮触发相应的操作 。 三、RemoteViews 的使用方法 3.1 创建 RemoteViews 对象 创建 RemoteViews 对象时需要传入两个关键参数当前应用的包名和对应的布局文件资源 ID。通过这两个参数RemoteViews 能够准确关联到我们定义的布局文件从而构建出相应的视图结构。例如 RemoteViews remoteViews new RemoteViews(getPackageName(), R.layout.custom_layout);上述代码中getPackageName()用于获取当前应用的包名R.layout.custom_layout则是自定义布局文件的资源 ID。通过这行代码我们成功创建了一个 RemoteViews 对象并将其与custom_layout布局文件关联起来 。在实际开发中布局文件可以包含各种支持的 View 组件如 TextView、ImageView、Button 等开发者可以根据需求进行灵活设计和布局。 3.2 设置 View 属性 RemoteViews 提供了一系列方法来设置 View 的属性以满足不同的界面展示需求。以下是一些常用的设置 View 属性的方法 setText用于设置 TextView 或 Button 的文本内容。例如 remoteViews.setTextViewText(R.id.text_view_id, 这是设置后的文本);这里的R.id.text_view_id是 TextView 或 Button 在布局文件中的 ID这是设置后的文本是要设置的具体文本内容。 setImageViewResource用于设置 ImageView 或 ImageButton 的图片资源。例如 remoteViews.setImageViewResource(R.id.image_view_id, R.drawable.icon);其中[R.id].image_view_id是 ImageView 或 ImageButton 的 IDR.drawable.icon是要设置的图片资源 ID。 setViewVisibility用于设置 View 的可见性。可以设置为View.VISIBLE可见、View.INVISIBLE不可见但占据空间、View.GONE不可见且不占据空间。例如 remoteViews.setViewVisibility(R.id.view_id, View.GONE);R.id.view_id是要设置可见性的 View 的 ID 。 setTextColor用于设置 TextView 或 Button 的文本颜色。例如 remoteViews.setTextColor(R.id.text_view_id, Color.RED);Color.RED表示红色开发者可以根据需要选择不同的颜色值。 3.3 处理点击事件 由于 RemoteViews 运行在其他进程中不能像普通 View 那样直接设置点击事件监听器 。为了实现点击事件的处理需要借助 PendingIntent。PendingIntent 可以理解为一种 “延迟意图”它允许我们在未来某个时刻执行特定的 Intent 操作。 具体实现步骤如下 创建 Intent定义点击事件触发后要执行的操作例如启动一个 Activity、发送一个广播或启动一个 Service。 Intent intent new Intent(this, TargetActivity.class);这里TargetActivity.class是要启动的目标 Activity 。 创建 PendingIntent通过 PendingIntent 的静态方法getActivity、getBroadcast或getService来创建 PendingIntent 对象根据不同的需求选择相应的方法。 PendingIntent pendingIntent PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);getBroadcast方法用于创建与广播相关的 PendingIntentgetService方法用于创建与服务相关的 PendingIntent 。 设置点击事件使用 RemoteViews 的setOnClickPendingIntent方法将 PendingIntent 与对应的 View 关联起来。 remoteViews.setOnClickPendingIntent(R.id.button_id, pendingIntent);[R.id].button_id是要设置点击事件的按钮的 ID 。通过以上步骤当用户点击关联了 PendingIntent 的 View 时系统会在合适的时机执行 PendingIntent 中定义的操作从而实现点击事件的处理。 3.4 应用 RemoteViews 在通知栏和桌面小部件中应用 RemoteViews 的步骤和使用的类有所不同下面分别进行介绍 通知栏应用 RemoteViews 创建 RemoteViews 对象如前文所述创建并关联布局文件。 设置 RemoteViews 属性和点击事件使用上述设置 View 属性和处理点击事件的方法进行相应设置。 创建 Notification 构建器使用NotificationCompat.Builder来构建通知并将 RemoteViews 设置为通知的内容。 NotificationCompat.Builder builder new NotificationCompat.Builder(this, CHANNEL_ID).setSmallIcon(R.drawable.ic_notification_small).setContent(remoteViews).setPriority(NotificationCompat.PRIORITY_DEFAULT);CHANNEL_ID是通知渠道 ID在 Android 8.0 及以上版本需要设置通知渠道 。 发送通知获取NotificationManager并调用notify方法发送通知。 NotificationManager notificationManager (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(notificationId, builder.build());notificationId是通知的唯一标识用于区分不同的通知。 桌面小部件应用 RemoteViews 定义小部件布局文件在res/layout目录下创建布局文件定义小部件的 UI 结构。 创建 AppWidgetProvider 类继承自AppWidgetProvider在onUpdate方法中处理小部件的更新逻辑。 public class MyAppWidgetProvider extends AppWidgetProvider {Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {for (int appWidgetId : appWidgetIds) {RemoteViews views new RemoteViews(context.getPackageName(), R.layout.widget_layout);// 设置属性和点击事件appWidgetManager.updateAppWidget(appWidgetId, views);}} }定义 AppWidgetProviderInfo 文件在res/xml目录下创建文件指定小部件的各种属性如布局、最小尺寸、更新频率等。 appwidget-provider xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:minWidth250dpandroid:minHeight100dpandroid:updatePeriodMillis1800000android:initialLayoutlayout/widget_layoutandroid:resizeModehorizontal|verticalandroid:widgetCategoryhome_screen /在 AndroidManifest.xml 中注册小部件声明小部件的AppWidgetProvider。 receiver android:name.MyAppWidgetProviderintent-filteraction android:nameandroid.appwidget.action.APPWIDGET_UPDATE //intent-filtermeta-dataandroid:nameandroid.appwidget.providerandroid:resourcexml/widget_info / /receiver通过以上步骤即可在通知栏和桌面小部件中成功应用 RemoteViews实现丰富的界面展示和交互功能。 四、RemoteViews 的工作原理 4.1 跨进程通信机制 在 Android 系统中进程间通信IPC是实现不同进程之间数据交互和功能调用的关键机制。而 Binder 机制则是 Android 中一种高效的 IPC 方式RemoteViews 正是利用 Binder 机制来实现跨进程通信。 Binder 机制基于客户端 - 服务器C/S架构主要由 Binder 驱动程序、ServiceManager、Server 端和 Client 端组成。Binder 驱动程序是 Linux 内核的一部分负责处理跨进程通信的底层细节如内存映射、数据传输等 。ServiceManager 是一个特殊的系统服务它维护着一个服务列表所有通过 Binder 进行通信的服务都需要在 ServiceManager 中注册其他组件可以通过 ServiceManager 查询并获取服务的引用。 在 RemoteViews 的应用场景中以通知栏为例当我们在应用中创建一个包含 RemoteViews 的通知时应用进程Client 端通过 Binder 机制将 RemoteViews 对象以及相关的操作指令发送到 SystemServer 进程Server 端中的 NotificationManagerService。NotificationManagerService 接收到这些信息后根据 RemoteViews 中的包名等信息去获取该应用中的资源然后进行相应的处理和显示。在这个过程中Binder 机制确保了数据能够在不同进程之间安全、高效地传输 。同样在桌面小部件的场景中AppWidgetProvider 所在的应用进程与 SystemServer 进程中的 AppWidgetService 之间也是通过 Binder 机制进行通信实现小部件的创建、更新等操作。 4.2 序列化与反序列化 为了在进程间传递 RemoteViews 对象及其相关操作需要将其转换为可传输的字节流形式这就涉及到序列化与反序列化。RemoteViews 实现了 Parcelable 接口该接口提供了一种高效的序列化和反序列化机制专门用于 Android 系统中的数据传输。 在序列化过程中RemoteViews 将自身的状态信息如布局资源 ID、设置的 View 属性以及点击事件等相关信息按照 Parcelable 接口的规范写入到 Parcel 对象中。例如当我们调用remoteViews.setTextViewText(R.id.text_view_id, “这是设置后的文本”);方法时这个设置文本的操作以及相关的参数如 View 的 ID 和文本内容都会被封装到一个 Action 对象中然后这个 Action 对象会被写入到 Parcel 中。 当 RemoteViews 对象被传输到目标进程如 SystemServer 进程后目标进程会对接收到的 Parcel 进行反序列化操作。通过 Parcelable 接口的CREATOR成员从 Parcel 中读取数据并重新构建出 RemoteViews 对象及其相关的操作信息从而在目标进程中恢复 RemoteViews 的状态以便进行后续的布局加载和更新操作 。 4.3 内部操作流程 当我们在应用中创建一个 RemoteViews 对象并对其进行一系列设置后如设置 View 属性、添加点击事件等这些操作并不会立即执行。RemoteViews 会将这些操作封装成一个个 Action 对象并存储在一个列表中。例如当调用setTextViewText方法时会创建一个ReflectionAction对象它是 Action 的子类用于通过反射调用 View 的方法并将其添加到 RemoteViews 的操作列表中。 接下来当我们通过NotificationManager的notify方法或者AppWidgetManager的updateAppWidget方法提交更新时RemoteViews 对象会通过 Binder 机制被传递到 SystemServer 进程。在 SystemServer 进程中首先会根据 RemoteViews 中的布局资源 ID使用LayoutInflater加载布局文件创建出实际的 View 对象。然后会遍历 RemoteViews 中的 Action 列表依次执行每个 Action 的apply方法 。在apply方法中会通过反射调用 View 的相应方法从而实现对 View 属性的设置和点击事件的绑定等操作。例如对于前面提到的ReflectionAction对象其apply方法会反射调用 View 的setText方法将设置的文本内容显示在对应的 TextView 上。 以一个简单的通知栏更新场景为例假设我们创建了一个 RemoteViews 对象并设置了 TextView 的文本和一个按钮的点击事件。当调用NotificationManager.notify方法后RemoteViews 对象被传递到 SystemServer 进程系统先加载布局文件创建出包含 TextView 和按钮的 View 结构然后执行setText操作的 Action将 TextView 的文本设置为指定内容再执行设置按钮点击事件的 Action将按钮与对应的 PendingIntent 绑定这样当用户点击通知栏中的按钮时就能触发相应的操作。 五、RemoteViews 的局限性 5.1 支持的 View 类型有限 RemoteViews 并非支持所有的 View 和布局类型这是其在使用过程中需要特别注意的一点。目前RemoteViews 支持的布局类型主要有 FrameLayout、LinearLayout、RelativeLayout、GridLayout 。在 View 类型方面支持 AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView、AdapterViewFlipper、ViewStub 等。然而它不支持自定义 View 及其子类 。例如如果开发者尝试在 RemoteViews 中使用自定义的 View如继承自 View 并实现了特殊绘制逻辑和交互功能的自定义控件会抛出InflateException异常导致布局加载失败。这就要求开发者在设计布局时充分考虑 RemoteViews 的支持范围避免使用不支持的 View 类型以确保应用的稳定性和兼容性。 5.2 事件处理的限制 在事件处理方面RemoteViews 存在明显的局限性。它不能像普通 View 那样直接设置点击事件监听器例如无法使用setOnClickListener方法来处理点击事件。这是因为 RemoteViews 运行在其他进程中直接设置点击事件监听器会涉及到跨进程通信的复杂问题并且可能带来安全风险。为了实现点击等交互功能RemoteViews 需要借助PendingIntent来实现。通过PendingIntent可以将一个 Intent 操作封装起来并在未来某个时刻由系统触发执行 。虽然这种方式能够实现基本的交互需求但相比于普通 View 的事件处理方式它的灵活性和实时性较差。例如在处理复杂的事件逻辑时使用PendingIntent可能会导致代码结构变得复杂难以维护。而且由于PendingIntent是在未来某个不确定的时刻执行对于一些需要实时反馈的交互场景可能无法满足需求。 5.3 性能开销 RemoteViews 在实现跨进程通信和视图更新的过程中不可避免地会带来一定的性能开销。首先由于 RemoteViews 需要通过 Binder 机制进行跨进程通信在数据传输过程中会涉及到序列化和反序列化操作这会消耗一定的时间和系统资源。特别是当布局文件较大或者包含较多的操作指令时序列化和反序列化的时间开销会更加明显可能导致界面更新的延迟 。其次在 SystemServer 进程中加载布局文件和执行一系列的操作指令也需要消耗 CPU 和内存资源。如果频繁地更新 RemoteViews可能会导致系统资源的紧张影响应用的整体性能甚至出现卡顿现象。例如在一个频繁更新通知栏的应用中如果每次更新都包含大量的 View 属性设置和复杂的布局可能会导致通知栏的响应速度变慢影响用户体验。因此在使用 RemoteViews 时开发者需要充分考虑性能因素尽量优化布局和操作指令减少不必要的更新以提高应用的性能。 六、总结 RemoteViews 作为 Android 开发中实现跨进程界面展示和交互的重要工具在通知栏和桌面小部件等场景中发挥着不可替代的作用。通过 RemoteViews开发者能够突破进程的限制为用户提供更加丰富和便捷的交互体验如在通知栏中实现音乐播放控制在桌面小部件上展示实时信息等。 尽管 RemoteViews 存在支持的 View 类型有限、事件处理不够灵活以及性能开销等局限性但在合适的应用场景下这些问题可以通过合理的设计和优化来缓解。例如在布局设计时充分考虑 RemoteViews 支持的 View 类型避免使用不支持的自定义 View在处理点击事件时巧妙利用 PendingIntent 来实现基本的交互需求在性能优化方面尽量减少不必要的布局更新和复杂操作以提高应用的响应速度 。 对于 Android 开发者来说掌握 RemoteViews 的使用方法和工作原理能够极大地拓展应用的功能边界提升应用的用户体验。在未来的开发中随着 Android 系统的不断演进我们也期待 RemoteViews 能够不断完善和发展为开发者提供更多的便利和更强大的功能。希望开发者们在实际项目中积极探索 RemoteViews 的应用充分发挥其优势打造出更加出色的 Android 应用。
http://www.tj-hxxt.cn/news/139363.html

相关文章:

  • 南京网站seo网站建设的内容管理
  • 农场游戏系统开发 网站建设推广公司网站怎样维护运营
  • 做网站哪个部分网站建设案例价位
  • 校园门户网站建设网站如何添加白名单
  • 微信 网站设计模板做网站用什么云服务器
  • 大理网站建设沛宣企业注册app下载
  • 网站制作的内容什么好网站网页的书签怎么做
  • 如何让别人看到自己做的网站中国广告设计网站
  • 单位网站的作用重庆制作网站培训机构
  • 网站开发网站源码网络营销推广的要点
  • 克隆网站后台做一个网站多长时间
  • 网上做任务挣钱的网站咨询公司来公司做调查
  • 高端建站行业烟台做网站打电话话术
  • 做装修公司网站一起来看在线观看免费
  • 企业门户网站建设咨询桂林人论坛
  • 如何做游戏推广搜索引擎优化seo课程总结
  • 网站子页怎么做兰州做门户网站
  • 电商pc网站建设方案开发公司对设计单位奖惩
  • 调查问卷网站建设河南开封网站建设
  • 浅谈网站建设的目的和意义商务网站建设与管理读后感
  • 北京网站设计公司hlh成都柚米科技15手机壁纸网站大全
  • 创世网站建设公司贪玩游戏原始传奇官网
  • 咸阳网站建设报价企业网站如何做架构图
  • 网站导航设置建设个网站从哪里盈利
  • 企业宽带 做网站企业资质查询平台
  • 网站分站怎么做重庆建设公司
  • 不用编程做APP和响应式网站网站制作的常见问题
  • 网站建设需要多少工种建设银行新加坡分行网站
  • 什么是网站的功能模块杭州pc网站制作公司
  • 怎么样可以做自己的网站个人网站开发软件