烦人的android幽灵部件(phantom widgets)--Issue 2539

  直接进入正题,情况是这样的:

  如果按正常操作,在桌面上添加了N个小部件(widget)时,很自然,在第一个widget创建时,onEnabled()事件被调用,当最后一个widget被删除时,onDisabled()事件将被调用.

  这是API文档中的描述:

  而当我按以下步骤操作时,情况变了,onEnabled()调用了一次后,无论是删除还是再创建,onEnabled()和disEnabled()事件再也不会被调用!除非卸载当前应用或重启android系统!

  步骤:

  在创建第一个组件时,进入了配置页面,此时很自然onEnabled() 被调用.接着,按下"返回"键——即没有完成配置,而是取消了操作,此时桌面上不出现widget部件.即没有widget在桌面上生成,接着,再进行一次完整widget创建操作,桌面上出现了我需要添加的widget.而此时onEnabled() 事件却没有被调用.再接着把这个widget删除,发现onDisabled()事件也没有触发!后台打印AppWidgetManager.getAppWidgetIds()发现,当我把桌面上的当前所有widget全部删除后,WidgetIds长度依然不为0!也就是说我创建第一个widget时虽然按下"返回"键了,但是widget还是在内存中被创建了.事实上,只要我进入配置后再按"返回"键,就会在WidgetIds中增加一个widgetID,也就是widget在内存中被创建了!所以即使我把桌面上可见的widget全部删除,onDisabled()方法也不会被调用,自然onEnabled()方法也永远不会再调用到!除非卸载当前应用或重启android系统!

  一开始,我以为是因为自己没有设置好setResult的问题,因为在文档里有这么一句描述:

  

  即:当配置Activity第一次打开时,要先设置activity的result值为RESULT_CANCELED,这样当用户在完成配置前按下"返回"键时,widget host不会收到widget配置被调用的通知,小部件(widget)就不会被完成添加.

  可是经确认,我的代码也没有问题,完全是按照ExampleAppWidgetConfigure.java里的写法做的.问题依然存在!

  最终,经过多方查找,才发现,原来这就是所谓的"幽灵部件"(phantom widgets),一个在code.google.com中描述的Issue 2539!

  详细内容请看:http://code.google.com/p/android/issues/detail?id=2539

  看了上面的评论,此情况不仅在配置activity被按返回时出现,当小部件被添加到桌面上,而桌面没有足够的空间用于显示时也会出现!虽然在2009年时就已经有人上传了修改后的源码,但是,并没有解决当桌面上没有足够空间时的问题,并且,这毕竟不是官方的正式修正.一直看到2010.11.24,也只是看到一位朋友提供了一个不需要修改源码而可以避免用户按下"返回"键而出现"幽灵部件"的技巧:就是不使用系统自带的configuration配置:

  没办法,在官方修正这个问题前,只能使用这个办法了!至少暂时不使用widget的配置功能吧!因为这个问题的存在将可能使用户的系统资源被widget消耗,随着幽灵小部件的增多,系统资源将被大量消耗,这不是我们所希望看到的!

  杯具的是,最后一行的评论:

  看来google对小部件这东西的改进并不是很重视,估计也不是很建议大家使用吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值