Android -- AppWidget 高级篇
3.1 AppWidget到底支持哪些view
在Android 2.2 SDK中我们首次启动模拟器可以看到和以前不一样的是多出了一个绿色的小机器人提示信息,Google给我们了演示了Android中如何通过 RemoteView和简单的图片轮换方式实现动画效果在桌面小工具中,appWidget的基类时AppWidgetProvider类,不过 Widget本身的生命周期管理并非Activity,相对于的而是BroadcastReceiver广播方式处理的。一直想知道如何在AppWidget里面添加 ListView,EditText 这些复杂的View.我们知道要在AppWidget里添加 View都是通过RemoteView来做到了,然而RemoteView本身功能很弱,支持的操作很少,而且支持RemoteView的Widget很 少:
A RemoteViews object (and, consequently, an App Widget) can support the following layout classes:
/@hide*/ @android.view.RemotableViewMethod public void showPreviousAppWidget(String str) { setInAnimation(AnimationUtils.loadAnimation(this.getContext(), com.android.internal.R.anim.slide_in_right)); setOutAnimation(AnimationUtils.loadAnimation(this.getContext(), com.android.internal.R.anim.slide_out_left)); setDisplayedChild(mWhichChild - 1); } /@hide*/ @android.view.RemotableViewMethod public void showNextAppWidget(String str) { setInAnimation(AnimationUtils.loadAnimation(this.getContext(), com.android.internal.R.anim.slide_in_left)); setOutAnimation(AnimationUtils.loadAnimation(this.getContext(), com.android.internal.R.anim.slide_out_right)); setDisplayedChild(mWhichChild + 1); }
同样,这个两个方法将在AppWidget里被调用,所以在方面前加 @android.view.RemotableViewMethod标识。参数str其实只是为了匹配
void java.lang.String, java.lang.CharSequence) setCharSequence(int viewId, String methodName, CharSequence value)的第三个参数。在AppWidget里调用 java.lang.String, java.lang.CharSequence) setCharSequence方法时第三个参数传入“”。
那么,又是如何在Appwidget实现onTouch事件呢?其实同样简单,就是在自定义的RemoteView里加上GestureDetector,用来识别手势,并发送相应的广播给AppWidget,让Appwidget作相应的处理,如上滑下滑的手势。
然后我说说遇到的一些问题和使用AppWidget的建议。
1、查看AppWidget源码知道,AppWidget是继承BroadcastReceiver,并且AppWidget的onUpdate,onDeleted,onEnabled,onDisabled四个方法都是从onReceive分化出来的,如何让AppWidget接收广播呢?重写onReceive即可,只是最后一定要调用AppWidgetManager.updateAppWidget(appWidgetIds, views)这个方法。
2、BroadcastReceiver的生命周期是短暂的,接收到消息很快就销毁了,如何在接收到消息后需要做大量计算的,最好在接收到消息后启动一个service,并将数据传给service,让service帮我们去计算。当然,这里还有一个关键,就是要把int[] appWidgetIds通过一个share类传到service,当service执行玩任务以后,调用AppWidgetManager.updateAppWidget(appWidgetIds, views)刷新AppWidget.
3、AppWidget是定期或定期刷新的,所以我们有必要将静态变量放在一个share类里,也可利用share类传appWidgetIds值,这样方便在service对AppWidget做刷新。