Widget no actualizado en el reinicio del iniciador

Tengo un widget que se actualizará cada vez que haya un cambio de configuración (como la orientación de la pantalla) y cada vez que se desbloquee el teléfono. Este proceso implica configurar los manejadores onClick para los botones en mi widget. Esto funciona bien, sin embargo, he descubierto que hay un caso de uso que hace que mi aplicación no responda a los eventos onClick . Este caso particular es siempre que el iniciador se reinicie solo.

¿Hay alguna manera de detectar cuándo se reinicia un iniciador, así puedo actualizar mi widget manualmente? ¿O existe otra forma de garantizar que los controladores onClick no se pierdan?

Resulta que estaba new RemoteViews() cuando debería haberlo llamado una vez para producir la vista, y luego referí a esa instancia cuando era necesario. En mi solución, tengo una variable de clase que almacena esta única instancia de RemoteView y un getter para acceder a ella.

La propuesta de @Glitch podría no funcionar en ciertos casos, especialmente en el widget de aplicaciones con ListView . Esto se debe a que ListView será muy lento (intente desplazarse por el ListView ) después de que appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, list_id) haya sido llamado varias veces.

Supongo que la única instancia de RemoteView mantendrá todas sus instrucciones ejecutadas en una lista. Con el tiempo, la lista de instrucciones crecerá. Cada vez que appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, list_id) , la gran lista de instrucciones se ejecutará de nuevo.

Mi solución propuesta es la siguiente. Sin embargo, creo que solo funcionará en ciertos dispositivos, ya que no todos los dispositivos recibirán el mismo mensaje de difusión durante el reinicio del iniciador.

 @SuppressLint("NewApi") @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action.equals("com.sec.android.widgetapp.APPWIDGET_RESIZE")) { // http://stackoverflow.com/questions/17396045/how-to-catch-widget-size-changes-on-devices-where-onappwidgetoptionschanged-not handleTouchWiz(context, intent); // Possible launcher restart. handleLauncherRestart(context, intent); } else if (action.equals("android.appwidget.action.APPWIDGET_UPDATE_OPTIONS")) { // Possible launcher restart. handleLauncherRestart(context, intent); } super.onReceive(context, intent); } private void handleLauncherRestart(Context context, Intent intent) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); updateAppWidget(context, appWidgetManager, appWidgetId); } private void handleTouchWiz(Context context, Intent intent) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int appWidgetId = intent.getIntExtra("widgetId", 0); int widgetSpanX = intent.getIntExtra("widgetspanx", 0); int widgetSpanY = intent.getIntExtra("widgetspany", 0); if (appWidgetId > 0 && widgetSpanX > 0 && widgetSpanY > 0) { Bundle newOptions = new Bundle(); // We have to convert these numbers for future use // http://stackoverflow.com/questions/10008521/appwidget-size-calculation if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 74 - 2); newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 74 - 2); } else { newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 70 - 30); newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 70 - 30); } onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); } }