1、初识RemoteViews
在我们平时的开发中,使用RemoteViews的机会并不是很对,可能多数还是在自定义通知界面时,但RemoteViews凭借可以跨进程更新的特点,可以帮助我们实现不同的产品效果,Android中官方的使用就是通知和桌面小部件,今天就一起来看看它是如和使用和如何跨进程传输的;
简介
1.1、控制限制
- 对于小工具可用的唯一手势
- 触摸
- 垂直滑动
1.2、 支持布局
RemoteViews虽然可以很容易的实现跨进程的控制视图,但并非所有的View都支持跨进程使用,根据GooGle官方文档指出只支持以下ViewGroup和View,不知持他们的子类和自定义View,所以在写RemoteViews的布局文件时应注意选择
- 支持的布局
- FrameLayout
- LinearLayout
- RelativeLayout
- GridLayout
- 支持的View
- 一般View:Button、ImageButton、TextView、ImageView、ProgressBar
- 集合:ListView、GridView、StackView、AdapterViewFlipper
- 其余View:AnalogClock、Chronometer、ViewFlipper
2、自定义通知界面
2.1、Notification
通知中的使用比较简单也比较固定,创建RemoteViews导入布局并设置点击事件,然后将视图设置为通知的contentView:
RemoteViews notificationLayout = new RemoteViews(getPackageName(), R.layout.notification);
notificationLayout.setOnClickPrndingIntent(…,…)//设置布局中的点击事件(单个View的PendingIntent)
notification.contentView = notificationLayout
notification.contentIntent = … // 设置整个通知的PendingIntent
3、AppWidget
另一个使用场景就是桌面小部件,桌面小部件确实丰富了产品的使用,更方便了用户的适应这点本人在开发中涉及到的很少,AppWidget的开发虽然比通知使用复杂一些但也是有章可循,只要遵循每一步的流程即可实现,下面一起实现一个桌面小部件:
3.1、AppWidgetProvider
AppWidgetProvider是BroadcastReceive的子类,主要用于接收小部件操作或修改时的广播意图,AppWidget会根据状态的不同发送以下广播:
- ACTION_APPWIDGET_UPDATE:在每个小部件更新时发送广播
- ACTION_APPWIDGET_DELETED:在每次删除小部件时发送广播
- ACTION_APPWIDGET_ENABLED:第一次添加小部件时发送广播
- ACTION_APPWIDGET_DISABLED:删除最后一个小部件时发送广播
- ACTION_APPWIDGET_OPTIONS_CHANGED:当AppWidget内容修改时发送广播
AppWidgetProvider除了直接监听广播外,其内部简化了广播的使用,提供了不同状态的回调方法,在开发中也主要使用这些方法即可,具体如下:
- onUpdate():桌面小部件的更新方法,当用户添加App Widget时会回调一次,然后会按照updatePeriodMillis间隔循环调用
- onAppWidgetOptionsChanged():首次创建布局窗口时或窗口大小调整时回调
- onDelete():每次删除桌面小部件时都会回调此方法
- onEnabled(Context):仅在第一次添加AppWidget实例时回调此方法(可执行初始化操作,如:打开数据库)
- onDisabled(Context):当删除最后一个小部件时回调(可以执行清理操作:如删除数据库)
既然AppWidgetProvider是广播的子类,所以它的使用也必须在清单文件中完成注册:
<receiver android:name="MyAppWidgetProvider">
<intent-filter>
//配置AppWidget的意图过滤
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
// 添加设置appwidget_info的xml文件
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
</receiver>
3.2、ConfigActivity
ConfigActivity顾名思义,用来设置桌面小部件,它在第一次添加小部件时会直接接入配置界面,可以在其中提供RemoteViews的相关配置,在配置完成后退出活动即可自动更新视图,具体实现方式分两步:
- 创建Activity并在清单文件中配置隐式启动
<activity android:name=".OtherActivity">
<intent-filter>
//必须设置APPWIDGET_CONFIGURE意图用于隐式启动活动
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
</intent-filter>
</activity>
- 在AppWidgetProviderInfo XML文件中声明配置活动
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:configure="com.alex.kotlin.remoteview.OtherActivity">
</appwidget-provider>
- 使用细节
- 在配置结束后在返回的setResult()中,必须返回本次修改的AppWidget的ID
3.3、AppWidgetProviderInfo
AppWidgetProviderInfo主要用于设置AppWidget的基本数据,如:布局、尺寸、更新频率等,所有信息设置在xml文件中,并在清单文件中配置xml文件:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="40dp"
android:minHeight="40dp"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/example_appwidget"
android:configure="com.example.android.ExampleAppWidgetConfigure"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen">
</ap