Appwidget不断将背景重置为透明

时间:2012-03-08 21:06:11

标签: android android-appwidget

我在appwidget中创建了一个功能,允许用户将背景从透明变为半透明。 xml中的默认值设置为透明。当用户更改背景首选项时,将保存设置并使用以下代码更新背景:

public static Bitmap setBackground (int bgcolor)
{
  {
    Bitmap.Config config=Bitmap.Config.ARGB_8888; 
    Bitmap bitmap=Bitmap.createBitmap(2, 2, config);
    Canvas canvas=new Canvas(bitmap); 
    canvas.drawColor(bgcolor);
    return bitmap;
  }
}

/* set background */
if (ExampleWidgetProvider.background==1)
  views.setImageViewBitmap(R.id.bgcolor, setBackground(Color.parseColor("#aaaaaaaa")));
else
  views.setImageViewBitmap(R.id.bgcolor, setBackground(Color.parseColor("#00000000")));

一位用户报告说,当他将背景设置为半透明时,背景会变回透明状态。这可能在一小时或半天的几分钟内发生似乎是随机的。

我意识到这是背景问题,而不是某种偏好重置,因为我向用户发送了一个appwidget版本,它总是将背景改为半透明,即使用:

/* set background */
if (ExampleWidgetProvider.background==1)
  views.setImageViewBitmap(R.id.bgcolor, setBackground(Color.parseColor("#aaaaaaaa")));
else
  views.setImageViewBitmap(R.id.bgcolor, setBackground(Color.parseColor("#aaaaaaaa")));

但有趣的是,没有解决它。 由于xml中的默认设置为透明,我怀疑应用程序无论如何重新启动或重绘并且正在使用默认布局。

如何检测和/或解决此问题?

更新:用户(按预期方式)确认修复,将xml中的背景颜色永久更改为半透明工作正常。这意味着系统正在重置背景,原因不明。

用户使用的是LG PG 970 V. 2.2.2以及他使用“Juice Defender Ultimate”的价值,并将其配置为在夜间不连接到互联网。我的appwidget确实定期连接到互联网。

1 个答案:

答案 0 :(得分:0)

好吧,我实际上找到了重现它的方法。我有一个带滑出式键盘的LG,当你滑出键盘时可以旋转主屏幕。一旦它这样做,半透明背景就会消失。看起来我必须检测某种重绘事件。

我找到了一个解决方案,但并不完全确定。无论哪种方式,它解决了这个问题,至少当我用上面提到的再现方法进行测试时。

我实现了一个永久运行的服务,它覆盖了onConfigurationChanged()方法。

有关想法,请参阅:

  

您无法通过清单

中声明的组件收到此信息

这为活动提供了解决方案,但我不确定如何在appwidgets中使用类似的东西,如果可能的话:

代码示例,此服务在onEnabled()方法的AppWidgetProvider类中启动。所以它只运行一次,无论你的appwidget运行了多少个实例,理想情况下应该能够处理任何实例。

public class ExampleConfigChangeService extends Service
{
  @Override
  public void onCreate()
  {
    super.onCreate();
    /* whatever code you need here */
  }

@Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); /* whatever code you need here */ }

/* you need this or it will not compile **/ @Override public IBinder onBind(Intent intent) { /* We don't need to bind to this service */ return null; }

@Override public void onConfigurationChanged(Configuration newConfig) { /* * this is the code that will run whenever an ACTION_CONFIGURATION_CHANGED happens * do whatever needs to be done, such as re-reading preferences, * resetting background to user's preferred setting etc. */ } }