如何暂停onCreate直到启动完成?

时间:2015-04-15 09:51:06

标签: java android widget

我在我的应用程序中托管小部件,似乎如果我在启动设备之前启动我的应用程序,则无法正确创建小部件。然后,窗口小部件似乎未完全加载或未正确初始化/更新。例如:BatteryBotIndicator-Widget,以百分比显示电池状态,显示的值为" XX"而不是像#34; 70%"这样的数字。如果我然后重新启动我的应用程序并尝试使用以下命令重新创建小部件:

AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);

它为appWidgetInfo提供了null(我从SQLite数据库中获取appWidgetId)。并且无法重新创建窗口小部件。

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

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

那么如何暂停执行onCreate直到启动完成?

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

1 个答案:

答案 0 :(得分:2)

  

如果在启动设备之前启动我的应用程序,则无法正确创建小部件。

请详细解释当你说 - “不正确”时你究竟是什么意思。这可能与理解你的小部件是否真的取决于与启动相关的东西有关。

  

我可以考虑让线程在while循环中休眠,直到BroadcastReceiver(BOOT_COMPLETED)将application-data中的bool变量设置为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/