2015-04-15 46 views
0

我在我的应用程序中托管小部件,看起来,如果我在启动设备之前启动我的应用程序完成后,无法正确创建小部件。然后小部件似乎没有完全加载或没有正确初始化/更新。例如:显示电池状态百分比的BatteryBotIndicator-Widget显示的值为“XX”,而不是像“70%”这样的数字。如果我再重新启动我的应用程序,并尝试重新创建控件:如何暂停onCreate直到引导完成?

AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); 

它给我空了appWidgetInfo(我取appWidgetId从SQLite数据库)。并且小部件不能被重新创建。

在这种情况下调试真正的原因很难找出究竟是什么造成了这种情况(在正确的时间启动调试器)。我假设AppWidgetManager还没有准备好或者什么。

我可以肯定地说:如果我等到我收到广播事件BOOT_COMPLETED,所有小部件都会正确创建。

那么我怎样才能暂停执行onCreate直到启动完成?

我可以考虑把线程在while循环中休眠,直到BroadcastReceiver(BOOT_COMPLETED)将application-data中的bool变量设置为true。但我不想在我的应用程序的启动总是等待这个事件,你可以想像;)

+1

您是否尝试过正常运行应用,并且只在收到BOOT_COMPLETED广播时添加小部件?暂停onCreat我不认为会是一个好方法来处理您的问题。 – MRodrigues

+0

谢谢。仅在引导发生之前添加小部件才是真的不错;)因为我可能安装应用程序,添加小部件,重新启动应用程序而不重新启动。结果=没有小工具! – treesoft

回答

2

,如果我在设备启动前开始我的应用程序完成后,不能正确创建的小部件。

请详细解释一下,当你说 - “不正确”时,你的意思是什么。这可能有助于了解你的widget是否真的取决于与启动相关的内容。

我能想到把线程在一个while循环,直到广播接收器(BOOT_COMPLETED)睡在应用程序数据的布尔变量设置为true

非常糟糕的主意的..也性能和设计原因

而是,为什么不简单地注册以从清单启动完整的广播,并且当您接收它时 - 只需发送相关广播来更新您的小部件? AppWidgetProvider已经扩展了BroadcastReceiver,因此您可以简单地将它添加到意向过滤器中以便引导完成广播。

这是怎么加的意图过滤器来启动完成:

<receiver android:name="MyWidgetProvider" > 
     <intent-filter > 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 

     <meta-data 
     ... 
    </receiver> 

,这是如何从微件提供者实现对其做出反应:

@Override 
    public void onReceive(Context context, Intent intent) { 
    if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED")){ 
     doTheUpdateHereExactlyLikeHowYouUpdateItFromAnywhereElse(); 
    } else { 
     super.onReceive(context,intent); 
    } 
} 

了解更多信息 - 按照这个教程:https://laaptu.wordpress.com/2013/08/12/android-update-app-widget-with-listview-after-phone-reboot/

+0

对不起,没有完全解释你的答案和thx的影响。我编辑了我的问题,使其更清楚。让我们假设我有BOOT_COMPLETED-Broadcast中需要更新的小部件的id。你能解释一点点更多如何通过ID更新那一个?此外:我不明白“AppWidgetProvider已经扩展BroadcastReceiver,所以你可以简单地添加它的意图过滤器引导完成广播。” – treesoft

+0

@ maltonic42:我已经更新了我的答案。你也可以观看这个教程:https://laaptu.wordpress.com/2013/08/12/android-update-app-widget-with-listview-after-phone-reboot/ –

+0

谢谢,我要去与这工作,看看我会得到。 “doTheUpdateHereExactlyLikeHowYouUpdateItFromAnywhereElse()”....以及我不添加我自己的小部件到我的应用程序,但系统提供的任何小部件(让用户从所有可用的小部件中选择并将其添加到我的应用程序)。所以我不会自己更新它们。我只创建/添加它们。他们更新他们的方法。也许有可能迫使他们更新他们的产品? – treesoft

相关问题