赞
踩
1. 应用场景
通知栏
桌面小控件
2. RemoteViews 原理
2.1 RemoteViews 不是一个 View
public class RemoteViews implements Parcelable, Filter {
}
从类的定义能够看出 RemoteViews 实际上并不是一个 View,它只是一个实现了 Parcelable 接口的类,为什么要实现 Parcelable 接口呢,这是因为我们在跨进程更新布局的时候需要传递 RemoteViews,而跨进程通信中传递的数据除了基本数据类型外,对于自定义的数据类型一定要实现 Parcelable 接口才能在进程间实现数据的传递。
2.2 RemoteViews 不支持自定义的布局和控件
RemoteViews 支持的布局和控件是有限的,支持的布局有:
FrameLayout
GridLayout
GridView
LinearLayout
ListView
RelativeLayout
StackView
ViewFlipper
AdapterViewFlipper
支持的控件有:
Button
ImageButton
TextView
TextClock
ImageView
ProgressBar
Chronometer
AnalogClock
注意
在 RemoteViews 的 XML 布局中使用了 ImageView,按道理来说 RemoteViews 是支持的。实际应用中,在 AppCompatActivity 布局中使用的 ImageView 等会在加载布局时被转换成对应的兼容类即 AppCompatImageView,兼容类都是 ImageView 的子类,有如下错误提示:
Caused by: android.widget.RemoteViews ActionException:android.widget.RemoteViews$ActionException:
view:android.support.v7.widget.AppCompatImageView can't use method with RemoteViews: setImageResource(int)
错误提示表明在 RemoteViews 中 AppCompatImageView 不能使用 setImageResource() 方法,这种情况下我们将 AppCompatActivity 改为 Activity,不使用 AppCompatActivity 就可以避免将布局中的 ImageView 转换为 AppCompatImageView,或者在 build.gradle 中设置 appcompat 为 compile ‘com.android.support:appcompat-v7:23.0.1’ 或更低。
原因:IamgeView 的 setImageResource() 方法有注解 @android.view.RemotableViewMethod(asyncImpl="setImageResourceAsync"
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。