Widget no actualizado en el reinicio del lanzador

Tengo un widget que se actualizará cada vez que haya un cambio de configuración (como la orientación de la pantalla), y siempre que el teléfono esté desbloqueado. Este proceso implica establecer controladores onClick para los botones de mi widget. Esto funciona bien, sin embargo he encontrado que hay un caso de uso que hace que mi aplicación no responda a los eventos onClick . Este caso particular es cuando el lanzador se reinicia.

¿Hay una manera de detectar cuándo se reinicia un lanzador, por lo que puedo actualizar mi widget manualmente? ¿O hay otra manera de asegurar que los controladores onClick no se pierdan?

    2 Solutions collect form web for “Widget no actualizado en el reinicio del lanzador”

    Resulta que estaba spamming new RemoteViews() cuando debería haberlo llamado una vez para producir la vista, y luego se refiere a una instancia cuando sea 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 puede no funcionar para ciertos casos, especialmente el widget de aplicación con ListView . Esto se debe a que ListView obtendrá muy lento (trate de desplazarse el ListView ) después de appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, list_id) había llamado varias veces.

    Mi suposición es que la única instancia de RemoteView guardará toda su instrucción ejecutada en una lista. Con el tiempo, la lista de instrucciones crecerá. Cada vez que appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, list_id) , la lista de instrucciones grande se ejecutará de nuevo.

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

     @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); } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.