这几天在开发AppWidget时遇到一个奇怪问题:AppWidget上有一个时钟,使用TIME_TICK每分钟更新一次时间,问题是在长时间待机后出现,AppWidget上的时间不能与系统时间同步(ERROR/JavaBinder(1847): !!! FAILED BINDER TRANSACTION !!!)。
通过AIDL通信机制的流程找到这个Log出现在android_os_Binder.cpp文件中android_os_BinderProxy_transact函数内部,原本是一个OutOfMemoryError,这是AIDL Client端访问时传递的Parcelable包过大而引起的错误,而RemoteViews就是一个实现了Parcelable接口的类,它作为AppWidget视图组件传递的数据结构通过AIDL在AppWidget应用向Launcher传递。
产生这个问题的原因主要在于,RemoteViews的set系列函数在其内部会转换成Action对象存放在在ArrayList<Action>中,而在RemoteViews中没有对这个ArrayList<Action>进行清理的操作。而由于更新频率比较高在设计这个应用时把updateAppWidget()操作放在了Service中,并且每次都在重复使用这个RemoteViews对象,这就造成RemoteViews中的ArrayList<Action>中的数据越来越大,造成内存溢出错误。
所以每个RemoteViews对象最好不要重复使用
转载:http://hi.baidu.com/tigerpan/blog/item/26305963df32f949ebf8f843.html
分享到:
相关推荐
一个`appWidget`通常包含一个或多个`RemoteViews`,它们是显示在主屏幕上的视图组件。`RemoteViews`允许开发者创建和更新`appWidget`的内容,而无需直接操作UI线程。`appWidget`的配置和交互通常通过`...
布局文件则定义了AppWidget在主屏幕上的显示样式,通常包含一个或多个远程视图(RemoteViews)。 创建AppWidget的第一步是在AndroidManifest.xml文件中注册AppWidget提供者。你需要指定一个唯一的...
AppWidget主要由两部分构成:WidgetProvider(提供者)和RemoteViews(远程视图)。WidgetProvider负责处理系统广播和事件,控制AppWidget的行为;RemoteViews则是WidgetProvider与主屏幕之间的桥梁,用于定义App...
2. **onUpdate()方法源码**: 在这个方法中,通常你会遍历所有需要更新的AppWidget实例,为每个实例创建新的RemoteViews对象,并调用`appWidgetManager.updateAppWidget(appWidgetIds, remoteViews)`来更新界面。...
在实践中,还需要注意内存优化和性能提升,因为AppWidget运行在后台服务中,对资源的消耗要特别关注。同时,由于AppWidget的更新频率受到系统限制,所以要合理设计数据更新策略。 总结,`android AppWidget ...
在Android系统中,AppWidget是桌面小部件的实现,它允许开发者将应用程序的功能和信息集成到用户的主屏幕上,用户无需打开应用即可与之交互。这个压缩包“Android -- AppWidget源码.zip”很可能是包含了Android App...
一个AppWidget由一个或多个`RemoteViews`组成,`RemoteViews`是用于展示在AppWidget上的视图。它们不直接支持启动Activity,但我们可以利用PendingIntent来实现这一功能。PendingIntent是一个表示意图的未来动作,它...
App Widget 的概念 一个简单的App Widget例子 PendingIntent的使用 RemoteViews的使用 接收来自App Widget的广播 更新App Widget的控件状态
在Android平台上,AppWidget是Android系统提供的一种小部件功能,允许开发者创建可以在用户主屏幕上显示的小应用程序。AppWidgets虽然小巧,但能为用户提供便捷的功能访问,例如天气预报、音乐播放控制等。本教程将...
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> android:name="android.appwidget.provider" android:resource="@xml/app_widget_info" /> ``` 最后,为了让用户能够添加你的App ...
AppWidget是Android系统提供的一种组件,它允许开发者在用户的主屏幕上创建自定义的小部件,无需用户启动应用程序。这种功能极大地增强了用户体验,使用户能够快速访问或控制应用的功能,而无需打开应用本身。本文将...
Android AppWidget是Android系统提供的一种轻量级组件,允许开发者在用户的主屏幕上创建小型应用程序,通常称为小部件或快捷方式。这些小部件不需要用户启动应用,就能直接在主屏幕上显示和交互,为用户提供便捷的...
**AppWidget的简单使用** AppWidget是Android系统提供的一种组件,允许开发者在用户的主屏幕上创建小型、可交互的应用程序小部件。这些小部件无需用户直接启动应用,就能展示实时信息或者提供快速操作入口,极大地...
在"appwidget"这个压缩包文件中,可能包含了示例代码和资源文件,供开发者学习如何实现上述功能。通过研究这些文件,你可以更好地理解App Widget的工作原理和实现细节,从而在自己的项目中创建出富有特色的桌面小...
Android 桌面控件(AppWidget)是Android操作系统提供的一种独特功能,允许开发者创建可以在用户主屏幕上显示的小型应用程序组件。这些控件通常提供快速访问应用的核心功能或展示实时信息,如天气预报、日历事件或...
- 由于AppWidget运行在系统进程中,应尽量减少其内存占用,避免过度复杂的逻辑和大数据量的处理。 - 使用`IntentService`处理耗时任务,防止阻塞UI线程。 - 为提高性能,尽可能减少不必要的视图更新。 7. **实际...
3. 更新UI:在`onUpdate()`方法中,使用`RemoteViews`设置新的名言到AppWidget的TextView中。`RemoteViews`可以修改布局中的View对象,从而更新AppWidget的显示。 三、布局设计 项目的压缩包中可能包含一个或多个...
在这个方法中,你可以调用AppWidgetManager的updateAppWidget()方法,传入AppWidget实例ID和新的远程视图(RemoteViews)对象,来改变小部件的显示内容。 - 另外,可以设定一个AlarmManager定时触发更新,或者监听...
在Android平台上,AppWidget是小部件的简称,它允许开发者创建可以放置在用户主屏幕上的小型应用程序。在本例中,我们关注的是一个特定类型的AppWidget,它显示时间并每秒更新一次。创建这样一个实时更新的时钟App...
6. **使用RemoteViews**: RemoteViews是用于描述AppWidget在远程进程中如何显示的类。你可以通过它来设置文本、图片,甚至执行简单的操作,如启动Activity。 7. **更新AppWidget**: 可以通过`AppWidgetManager`的`...