转贴 RemoteView概述 android remoteview

转贴自:http://kongweile.iteye.com/blog/1133013

1.RemoteView概述

到目前为止,我发现RemoteView会用在两个地方:一个是在AppWidget,另外一个是在Notification.

先从官方对他的定义来看:

RemoteView--A class that describes a view hierarchy thatcan be displayed in another process. The hierarchy is inflated froma layout resource file, and this class provides some basicoperations for modifying the content of the inflatedhierarchy.

RemoteView描述一个view,而这个view是在另外一个进程显示的。它inflate于layout资源文件。并且提供了可以修改过view内容的一些简单基础的操作。

从这个定义我们就知道RemoteView是用来描述一个垮进程显示的view。从而你就会明白为什么AppWidget和Nofication需要用到它了。


AppWidget---RemoteView

我们都知道AppWidgetProvider是一个BrocaseReceiver,只是接受到Enable,Update,disale,delete这些message,而真正显示界面的是AppWidgetHostView(这是在Launcher里面实现的)这中间就是通过RemoteView来沟通。通过RemoteView告诉Launcher你想要的AppWidget是长什么样。

Notification--RemoteView

若你想自定义你的Notification也必须通过RemoteView.因为你定义的Nofication和显示Notification也是两个不同的进程。

在android2.2之前,RemoteView只支持一些简单的view:TextView,Framelaout..不支持ListView和GridView等复杂的view,它的操作也是简单的click。在网上有人说是通过@RemoteView这个标签确定RemoteView是否支持view.在view的源文件加上@RemoteView这个标签就可以支持了。这个我还没有去试试过。(在htc sence ui 中我们可以看到有用到listview,gridview,这是怎么做到的呢,看下面说明)

在android3.0,Google加强这方面,下面来源官方文档:

ExpandedHome screen widgets

Home screen widgets arepopular with users because they offer fast access toapplication-specific data directly from the home screen. Android3.0 lets developers take home screen widgets to the next level,offering more types of content and new modes of interaction withusers. Developers can now use more standard UI widget types homescreen widgets, including widgets that let users flip throughcollections of content as 3D stacks, grids, or lists. Users caninteract with the home screen widgets in new ways, such as by usingtouch gestures to scroll and flip the content displayed in awidget.

2.Android AppWidget如何支持复杂的View

整理自:http://407827531.iteye.com/blog/605736

一直想知道如何在AppWidget里面添加ListView,EditText 这些复杂的View.我们知道要在AppWidget里添加View都是通过RemoteView来做到了,然而RemoteView本身功能很弱,支持的操作很少,而且支持RemoteView的Widget很少:

在DevGuide中有下面这段:

ARemoteViews object (and, consequently, an App Widget) can supportthe following layout classes:
*FrameLayout
*LinearLayout
*RelativeLayout
And thefollowing widget classes:
*AnalogClock
* Button
*Chronometer
*ImageButton
*ImageView
*ProgressBar
*TextView
Descendants of these classes are notsupported.

所以从这里可以知道,为什么在AppWidget里添加EditText会显示LoadError了,因为本身它就不支持这些复杂的Widget.

疑问1:为什么Google Search会有EditText呢?

其实这些都是假象,并不是AppWidget支持EditText。具体怎么回事,我猜有两种情况:

1.一种确实是EditText但确不是AppWidget支持的,而是集成到Home里面去了。

2.最新的SDK1.6中,显示在桌面的EditText只是一个ImageView,而这个ImageView的背景就是EditText的截图了。我们点中这个“EditText”后,会调起一个Activity,
而这个Activity就是复杂输入的EditText,并且会全屏显示。所以我们就误以会那是一个单纯的EditText.

疑问2:HTC Hero SenseUI的人都看到了,它的AppWidget是确实支持复杂Widget的,比如:Bookmark,Widget:ListView/GridView,TwitterWidget:EditText.

这些确实是我们可以看到的,但它是怎么做到的呢?我也很想知道,AppWidget支持到那么强大,甚至超过了本身AP的功能,很抢眼。但不管是怎么实现的,我想人家肯定是花了大力气去做到了,我猜想可能是将Google提供的AppWidget进行了比较大的改动。我们查看一下framework下的appwidget:

pjq@gentoo-pjq ~/android/donut$ ls frameworks/base/core/java/android/appwidget/-lh total60K
-rw-r--r--1pjq users 7.9K 2009-09-2921:49 AppWidgetHost.java
-rw-r--r--1pjq users 12K 2009-09-2921:49 AppWidgetHostView.java
-rw-r--r--1pjq users 14K 2009-09-2921:49 AppWidgetManager.java
-rw-r--r--1pjq users 6912009-09-2921:49 AppWidgetProviderInfo.aidl
-rw-r--r--1pjq users 5.6K 2009-09-2921:49 AppWidgetProviderInfo.java
-rwxr-xr-x 1pjq users 6.3K 2009-09-2921:49 AppWidgetProvider.java
-rw-r--r--1pjq users 1.5K 2009-09-2921:49 package.html

所以我想HTC一定是将这里给改动了,以支持复杂的Widget,有知道内情的透露一点最好了。

要知道RemoteView的功能很少,特别是对事件处理的能力,都需要通过PendingIntent,传到Broadcas tReceiver去处理。所以这里对一些事件处理也仅限于比较简单事件:比如说:Button Clicked,其它的我好像还没怎么用过,orz….对复杂的View:比如ListView(当然这里还不支持,打个比方),ListView里面那么多Item,要设置Listener,要传值,这些RemoteView都不能像一个单纯的Activity那样处理。


3.实践探索

写这篇文章的时候,我已经实现了在AppWidget里显示ListView/GridView这些复杂的Widget了,我这里只说显示,并不是说我已经能让AppWidget支持ListView/GridView了。所以我这里更倾向于教你如何在AppWidget里支持显示ListView/GridView这些复杂的Widget.

我们知道AppWidget只支持RemoteView,那哪些Widget是RemoteView呢,我来教你搜一下:

pjq@gentoo-pjq~/android/donut/frameworks/base/core/java/android/widget $ grep -i-n -A 1@remoteview *.java

AbsoluteLayout.java:40:@RemoteViewAbsoluteLayout.java-41-publicclass

AbsoluteLayout extends ViewGroup { --AnalogClock.java:39:@RemoteViewAnalogClock.java-40- publicclassAnalogClock extends View {

--
Button.java:58:@RemoteView
Button.java-59-publicclassButton extends TextView {
--
Chronometer.java:45:@RemoteView
Chronometer.java-46-publicclassChronometer extends TextView {
--
FrameLayout.java:47:@RemoteView
FrameLayout.java-48-publicclassFrameLayout extends ViewGroup {
--
ImageButton.java:66:@RemoteView
ImageButton.java-67-publicclassImageButton extends ImageView {
--
ImageView.java:55:@RemoteView
ImageView.java-56-publicclassImageView extends View {现在没什么问题。
--
LinearLayout.java:44:@RemoteView
LinearLayout.java-45-publicclassLinearLayout extends ViewGroup {
--
ProgressBar.java:122:@RemoteView
ProgressBar.java-123-publicclassProgressBar extends View {
--
RelativeLayout.java:66:@RemoteView
RelativeLayout.java-67-publicclassRelativeLayout extends ViewGroup {
--
TextView.java:186:@RemoteView
TextView.java-187-publicclassTextView extends ViewimplementsViewTreeObserver.OnPreDrawListener{

就是这些了,类名前面加了”@RemoteView”,和我前面列出的那些是不是一样的呢?-对了,就是这些了,所以以后你想知道你在AppWidget支持哪些Widget就可以像我这样去搜一下就知道了,这样最适时。写到这里我已经将最关键的内容都已经写出来了,还不明白?其实简单点讲就是在一个Widget类前面加上”@RemoteView”,加上了它就等于说RemoteView可以支持它,RemoteView支持就等于是AppWidget支持这它了。好了,现在你只需要自定义一些你需要的Widget,加上”@RemoteView”标记,你就可以在AppWidget里使用它了。 关于如何自定义一个Widget你完全可以参照frameworks/base/core/java/android/widget已有的这些Widget.依样加一个。其实如果你需要自定义一个Widget,比如说支持ListView,你可以先在一个activity里实现它,然后将它移到framework下面去。
这里说一下可能需要注意的地方:1.如果有多个文件,需要Package的时候,名字最好按照这样的形式:android.widget.bookmark。其中bookmark就是你要添加一个Widget存放的地方,这样的话你就可以在frameworks/base/core/java/android/widget目录下新增bookmark文件夹,将java文件放在这个目录下。如果你新增的Widget只有一个java文件就可以不用这样了,可以完全按照已经存在的Widget的样子,直接将java文件放到frameworks/base/core/java/android/widget目录下。
2.资源文件存放:frameworks/base/core/res/res3.资源的引用:要用这样的方式引用:com.android.internal.R.drawable.**
4.记着在这个CustomerWidget类名前加上”@RemoteView”标记.
这些都做完了,你就已经将一个自定义的Widget添加到framework了。之后要做的工作就是编译整个工程了,重新生成SDK。
最后你就可以在AppWidget引用你新加的这个Widget了:com.widget.bookmark.***。
至此,你已经用上了你新加的这个Widget,并且可以加到AppWidget.
在新加Widget的时候可能会遇到的一些问题:1.构造函数初始化问题。
如果在XML里写的layout不能直接指定哪个构造函数进行初始化,如果你不确定会跑哪个构造函数,最好在每个构造函数里对加上log,这样你就知道初始化时会跑哪个构造函数,并将初始化的工作加到里面。我当时就遇到了这个问题,因为用XML写layout,你不能显示调用哪个构造函数进行初始化,如果你将初始化的操作放到一个不会自动跑到的构造函数里面,那面你运行的时候就好像没添加到Widget一样。
2.其它的再说吧。

  

爱华网本文地址 » http://www.413yy.cn/a/25101015/264753.html

更多阅读

转贴:忆与吴志攀教授夫妇交往点滴--冷静

提示:本文作者冷静,是我博士同门,共同师从尊敬的吴志攀教授,目前任教于香港大学法学院。冷静闻知吴老师和杨老师遭人陷害,悲愤在心,连夜写就长文,回忆与恩师交往点滴。冷静文章多有自谦之词,事实上,冷静游学多国,学问及才识远在本人之上。因而

转贴 煲耳机用什么音乐比较好? 什么音乐适合煲耳机

转贴自http://ik.hustonline.net煲耳机不是要把耳机放在砂锅里放上作料煲汤,煲耳机主要是煲耳机的振膜,就目前而言,静电耳机振膜的厚度已薄到1?35微米,动圈耳机的振膜也只有几微米到十几微米(我们头发的直径大约是60~90微米)。振膜本身在

声明:《转贴 RemoteView概述 android remoteview》为网友人生若只初相见分享!如侵犯到您的合法权益请联系我们删除